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

Cara mudah untuk membuat tipe pengembalian menjadi tabel SETOF plus bidang tambahan?

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:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pemantauan Dinamis Instance PostgreSQL Menggunakan pg_top

  2. DAPATKAN DIAGNOSTIK dengan pernyataan COPY dalam fungsi Pl/pgsql

  3. Bagaimana cara menghapus atau membuat database dari clojure.java.jdbc?

  4. konteks eksekusi pemicu basis data di PostgreSQL

  5. pgAdmin 4 versi. 1.5 - tidak ada pesan kesalahan