PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Iterasi melalui tabel, lakukan perhitungan pada setiap baris

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tipe Hibernasi, Postgres &Array

  2. Membuat database dalam pengujian SQLAlchemy dengan PostgreSQL

  3. Hasilkan rangkaian tanggal - gunakan tipe tanggal sebagai input

  4. Kaskade bertahan membuat baris duplikat?

  5. pelanggaran isolasi transaksi yang jelas di postgresql