Anda bisa kembalikan seluruh baris sebagai tipe komposit dan tambahkan beberapa lagi:
CREATE OR REPLACE FUNCTION f_rowplus()
RETURNS TABLE (rec demo, add_int int, add_txt text) AS
$func$
SELECT d, 5, 'baz'::text FROM demo d;
$func$ LANGUAGE sql;
Tapi kemudian, saat Anda menggunakan panggilan sederhana:
SELECT * FROM f_rowplus();
Anda mendapatkan baris dari tabel demo
sebagai tipe komposit terpisah. Anda harus menelepon:
SELECT (rec).*, add_int, add_txt FROM f_rowplus();
untuk mendapatkan semua individu kolom. Diperlukan tanda kurung.
Postgres agak tidak konsisten di sini. Jika Anda membuat fungsi dengan:
CREATE OR REPLACE FUNCTION f_row2()
RETURNS TABLE (rec demo) AS
...
kemudian jenis komposit demo
diam-diam diubah menjadi kolom individu (terurai). Tidak ada tautan ke tipe komposit asli yang tersisa. Anda tidak dapat mereferensikan kolom keluaran yang dideklarasikan rec
sama sekali, karena itu telah diganti dengan kolom dari tipe yang didekomposisi. Panggilan ini akan menghasilkan pesan kesalahan:
SELECT rec FROM f_row2();
Sama di sini:
CREATE OR REPLACE FUNCTION f_row3(OUT rec demo)
RETURNS SETOF demo AS
...
Namun , segera setelah Anda menambahkan apa saja lebih banyak OUT
kolom, tipe komposit dipertahankan seperti yang dideklarasikan (tidak didekomposisi) dan Anda dapat:
SELECT rec FROM f_rowplus();
dengan fungsi pertama.
Saya membuat SQL Fiddle mendemonstrasikan variannya.
Selain
Saat menggunakan fungsi, mengembalikan beberapa kolom di FROM
list (sebagai fungsi tabel) dan terurai di SELECT
daftar seperti ini:
SELECT (rec).* FROM f_rowplus();
... fungsi masih dievaluasi sekali hanya - saat menelepon dan terurai di SELECT
daftar langsung seperti ini:
SELECT (f_rowplus()).*; -- also: different result
... akan mengevaluasi sekali untuk setiap kolom dalam tipe pengembalian. Detail: