PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Lặp lại qua bảng, thực hiện phép tính trên mỗi hàng

Thực hiện cập nhật từng hàng trong một vòng lặp hầu như luôn là một ý tưởng tồi và sẽ cực kỳ chậm và sẽ không mở rộng. Bạn thực sự nên tìm cách để tránh điều đó.

Sau khi nói điều đó:

Tất cả những gì hàm của bạn đang làm là thay đổi giá trị của giá trị cột trong bộ nhớ - bạn chỉ đang sửa đổi nội dung của một biến. Nếu bạn muốn cập nhật dữ liệu, bạn cần update tuyên bố:

Bạn cần sử dụng UPDATE bên trong vòng lặp:

CREATE OR REPLACE FUNCTION LoopThroughTable() 
  RETURNS VOID 
AS
$$
DECLARE 
   t_row the_table%rowtype;
BEGIN
    FOR t_row in SELECT * FROM the_table LOOP
        update the_table
            set resid = 1.0
        where pk_column = t_row.pk_column; --<<< !!! important !!!
    END LOOP;
END;
$$ 
LANGUAGE plpgsql;

Lưu ý rằng bạn để thêm where điều kiện về khóa chính để cập nhật update nếu không, bạn sẽ cập nhật tất cả hàng cho mỗi sự lặp lại của vòng lặp.

A hơi giải pháp hiệu quả hơn là sử dụng con trỏ, sau đó thực hiện cập nhật bằng cách sử dụng where current of

CREATE OR REPLACE FUNCTION LoopThroughTable() 
  RETURNS VOID 
AS $$
DECLARE 
   t_curs cursor for 
      select * from the_table;
   t_row the_table%rowtype;
BEGIN
    FOR t_row in t_curs LOOP
        update the_table
            set resid = 1.0
        where current of t_curs;
    END LOOP;
END;
$$ 
LANGUAGE plpgsql;

Không. Lệnh gọi hàm chạy trong ngữ cảnh của giao dịch đang gọi. Vì vậy, bạn cần commit sau khi chạy SELECT LoopThroughTable() nếu bạn đã tắt tính năng tự động cam kết trong ứng dụng khách SQL của mình.

Lưu ý rằng tên ngôn ngữ là một định danh, không sử dụng các dấu ngoặc kép xung quanh nó. Bạn cũng nên tránh sử dụng các từ khóa như row dưới dạng tên biến.

Sử dụng báo giá đô la (như tôi đã làm) cũng giúp việc viết phần thân hàm dễ dàng hơn



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Có thể xây dựng lại pg_depend không?

  2. Làm thế nào để ánh xạ Postgres _INT8 với thực thể Java bằng Hibernate?

  3. Làm cách nào để tạo chỉ mục trong PostgreSQL chỉ dựa trên chữ thường?

  4. Thông báo các thay đổi của postgres đối với ứng dụng java

  5. Số nguyên nằm ngoài phạm vi trên Postgres DB