Saya mencoba mengembalikan beberapa rekaman menggunakan tipe data RECORD, apakah ada cara saya dapat menambahkan ke RECORD dan menambahkan / menambahkan nilai baru dengan setiap iterasi ke RECORD ini.
yaitu, saya ingin menambahkan rec
sehingga rec
menjadi satu set baris ketika loop selesai, yang saya dapat KEMBALI pada akhir fungsi saya. Saat ini, saya melakukan ini -
SELECT temp_table.col1, temp_table.col2, temp_table.col3
INTO rec
FROM temp_table
WHERE temp_table.col3 = false;
kode lengkap saya ada di sini:
CREATE OR REPLACE FUNCTION validation()
RETURNS RECORD AS $$
DECLARE
rec RECORD;
temp_row RECORD;
BEGIN
CREATE TEMPORARY TABLE temp_table (col1 TEXT, col2 INTEGER, col3 BOOLEAN) ON COMMIT DROP;
FOR temp_row IN SELECT * FROM staging.validation
LOOP
RAISE NOTICE 'sql: %', temp_row.sql;
EXECUTE format('INSERT INTO temp_table %s', temp_row.sql);
IF (SELECT DISTINCT temp_table.col3 FROM temp_table WHERE temp_table.col3 = false)=false THEN
RAISE NOTICE 'there is a false value';
SELECT temp_table.col1, temp_table.col2, temp_table.col3
INTO rec
FROM temp_table
WHERE temp_table.col3 = false;
END IF;
END LOOP;
RETURN rec;
END; $$
LANGUAGE plpgsql;
Output saat ini setelah SELECT validation();
validation
(crea_ddf,8095,f)
Output yang Diinginkan
validation
(crea_ddf,8095,f)
(some_source_system,some_count,f)
(some_other_source_system,some_count,f)
(.....)
postgresql
plpgsql
postgresql-9.5
hky404
sumber
sumber
Jawaban:
Fungsi harus mengembalikan
SETOF RECORD
bukanRECORD
dan memiliki satuRETURN NEXT
per baris, bukan satuRETURN
, seperti pada:Penelepon:
Perhatikan bahwa SQL diketik dengan kuat dan statis, tipe
RECORD
semu sulit untuk dikerjakan.Seringkali kurang praktis untuk digunakan sejak awal tipe komposit dengan definisi lengkap nama dan tipe untuk setiap kolom, baik dengan
TABLE(...)
sintaks untuk tipe anonim atau denganCREATE TYPE
untuk tipe nama persisten.sumber
Gunakan
setof record
danreturn next rec
jika Anda ingin mengembalikan beberapa catatan dari suatu fungsi, contoh:Fungsi seperti itu perlu dipanggil dalam klausa FROM dengan daftar definisi kolom:
Pilihan yang lebih baik adalah menggunakan
returns table(...)
danreturn query
:Pemakaian:
sumber
Ini adalah bendera merah ..
validation
.staging
.temp_table.col3
IS SALAH Anda kembali ke penggunaLakukan ini ..
Anda bahkan dapat memasukkannya ke dalam
VIEW
jika Anda mauSebagai catatan
Apa yang dilakukan di
DISTINCT
sini? Cukup lakukan LIMIT satu. Bahkan, saya berpendapat bahwa ini bahkan lebih bersih.Maka Anda tidak perlu yang aneh
= false ) = FALSE
sumber