Ralat "ERROR: 42601: senarai definisi lajur diperlukan untuk fungsi mengembalikan "rekod"" menunjukkan bahawa fungsi yang diisytiharkan untuk mengembalikan jenis rekod tidak mempunyai senarai definisi lajur yang dinyatakan dalam pernyataan pemulangannya.
CREATE OR REPLACE FUNCTION get_user_by_username(_username text , _online bool DEFAULT false) RETURNS TABLE ( user_id int , user_name varchar , last_activity timestamptz ) LANGUAGE plpgsql AS $func$ BEGIN IF _online THEN RETURN QUERY UPDATE users u SET last_activity = current_timestamp -- ts with time zone WHERE u.user_name = _username RETURNING u.user_id , u.user_name , u.last_activity; ELSE RETURN QUERY SELECT u.user_id , u.user_name , u.last_activity FROM users u WHERE u.user_name = _username; END IF; END $func$;
Panggil:
SELECT * FROM get_user_by_username('myuser', true);
Kepada kembalikan semua lajur pengguna jadual sedia ada, ada cara yang lebih mudah. Postgres secara automatik mentakrifkan jenis komposit dengan nama yang sama untuk setiap jadual. Hanya gunakan pengguna RETURNS SETOF untuk memudahkan pertanyaan:
CREATE OR REPLACE FUNCTION get_user_by_username(_username text , _online bool DEFAULT false) RETURNS SETOF users LANGUAGE plpgsql AS $func$ BEGIN IF _online THEN RETURN QUERY UPDATE users u SET last_activity = current_timestamp WHERE u.user_name = _username RETURNING u.*; ELSE RETURN QUERY SELECT * FROM users u WHERE u.user_name = _username; END IF; END $func$;
CREATE OR REPLACE FUNCTION get_user_by_username3(_username text , _online bool DEFAULT false) RETURNS TABLE ( users_row users , custom_addition text ) LANGUAGE plpgsql AS $func$ BEGIN IF _online THEN RETURN QUERY UPDATE users u SET last_activity = current_timestamp -- ts with time zone WHERE u.user_name = _username RETURNING u -- whole row , u.user_name || u.user_id; ELSE RETURN QUERY SELECT u, u.user_name || u.user_id FROM users u WHERE u.user_name = _username; END IF; END $func$;
"Ajaib" adalah dalam panggilan fungsi, di mana kita (sebagai pilihan) mengurai jenis baris:
SELECT (users_row).*, custom_addition FROM get_user_by_username('foo', true);
Atas ialah kandungan terperinci Bagaimana untuk Mentakrifkan dengan betul Fungsi PostgreSQL Mengembalikan Rekod atau Jenis Komposit?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!