Saya bertanya-tanya apakah ada cara untuk mendeklarasikan variabel tabel tipe dalam PL / pgSQL untuk menyimpan hasil permintaan? Misalnya bagaimana saya bisa mengekspresikan sesuatu seperti:
q1 = select * from foo;
q2 = select * from bar;
for t1 in q1:
for t2 in q2:
-- do something with t1 and t2
Saya melihat ke dalam membangun kembali berikutnya tetapi yang tampaknya hanya mampu menangani nilai kembali.
Jawaban:
Di PostgreSQL , setiap nama tabel berfungsi sebagai nama tipe untuk tipe baris (alias tipe komposit ) secara otomatis - bukan tipe tabel, tidak ada "tipe tabel" atau "variabel tabel" di Postgres ( tetapi ada tabel yang diketik ).
Jadi Anda bisa mendeklarasikan variabel jenis itu di
PL/pgSQL
.Sebuah
FOR
lingkaran bekerja dengan built-in kursor. Ada juga kursor eksplisit di plpgsql.Anda juga bisa mendeklarasikan variabel dari tipe generik
record
. Itu dapat mengambil semua jenis baris saat penugasan secara otomatis. Tetapi aturan khusus berlaku. Pastikan untuk mengikuti tautan dan membaca bab manual!Meskipun sering kali nyaman untuk memiliki fungsi kembali
SETOF <table name>
, mengembalikanSETOF record
tidak nyaman. Sistem tidak tahu apa fungsi yang dikembalikan dengan cara ini dan Anda harus menambahkan daftar definisi kolom dengan setiap panggilan. Yang merupakan rasa sakit. Detail tentang fungsi tabel dalam manual .Seringkali ada solusi yang lebih efisien dengan SQL biasa. Looping adalah ukuran upaya terakhir, ketika Anda dapat melakukan hal-hal dalam satu pemindaian di mana Anda akan memerlukan banyak pemindaian dalam SQL murni.
sumber
CREATE FUNCTION footest() RETURNS SETOF foo LANGUAGE PLPGSQL AS $$...