Melakukan pembaruan baris demi baris dalam satu lingkaran hampir selalu merupakan ide yang buruk dan akan menjadi sangat lambat dan tidak akan skala. Anda harus benar-benar menemukan cara untuk menghindarinya.
Setelah mengatakan bahwa:
Semua fungsi Anda lakukan adalah mengubah nilai nilai kolom dalam memori - Anda hanya memodifikasi isi variabel. Jika Anda ingin memperbarui data, Anda memerlukan update
pernyataan:
Anda perlu menggunakan UPDATE
di dalam lingkaran:
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;
Perhatikan bahwa Anda memiliki untuk menambahkan where
kondisi pada kunci utama untuk update
jika tidak, Anda akan memperbarui semua baris untuk setiap iterasi loop.
Sebuah sedikit solusi yang lebih efisien adalah dengan menggunakan kursor, lalu lakukan pembaruan menggunakan 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;
Tidak. Panggilan ke fungsi berjalan dalam konteks transaksi panggilan. Jadi, Anda perlu commit
setelah menjalankan SELECT LoopThroughTable()
jika Anda telah menonaktifkan komit otomatis di klien SQL Anda.
Perhatikan bahwa nama bahasa adalah pengidentifikasi, jangan gunakan tanda kutip tunggal di sekitarnya. Anda juga harus menghindari penggunaan kata kunci seperti row
sebagai nama variabel.
Menggunakan kutipan dolar (seperti yang saya lakukan) juga membuat penulisan fungsi body lebih mudah