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 có để 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