Apabila bekerja dengan interaksi pangkalan data, ia sering menjadi perlu untuk mengambil data daripada berbilang jadual dan membentangkannya sebagai rekod bersatu. PostgreSQL membenarkan fungsi ini menggunakan jenis RECORD dalam PL/pgSQL, membolehkan pembangun mendapatkan semula medan daripada jadual berbeza sebagai medan dalam satu rekod.
Kepada mendapatkan semula medan daripada berbilang jadual sebagai medan dalam satu rekod, PL/pgSQL menggunakan RECORD taip. Berikut ialah versi contoh anda yang diubah suai:
CREATE OR REPLACE FUNCTION get_object_fields(name text) RETURNS RECORD AS $$ BEGIN -- Fetch fields f1, f2, and f3 from table t1 -- Fetch fields f4, f5 from table t2 -- Fetch fields f6, f7, and f8 from table t3 -- Create a record to store the fetched fields RETURN RECORD( f1 TEXT, f2 TEXT, f3 TEXT, f4 TEXT, f5 TEXT, f6 TEXT, f7 TEXT, f8 TEXT ); END $$ language plpgsql;
Apabila berhadapan dengan situasi di mana medan tertentu mungkin disimpan merentas berbilang baris dalam satu jadual, jenis REKOD masih boleh digunakan dengan berkesan. Dalam contoh anda dengan jadual 'pengguna', anda boleh mengubah suai kod seperti berikut:
CREATE OR REPLACE FUNCTION get_two_users_from_school(schoolid int) RETURNS my_type AS $$ DECLARE result my_type; temp_result RECORD; user1 RECORD; user2 RECORD; BEGIN SELECT id, name INTO temp_result FROM user WHERE school_id = schoolid LIMIT 2; -- Split the fetched rows into individual user records user1.user1_id := temp_result.id; user1.user1_name := temp_result.name; -- Handle the second row if available IF FOUND THEN user2.user2_id := temp_result.id; user2.user2_name := temp_result.name; END IF; -- Return the combined user record result.user1_id := user1.user1_id; result.user1_name := user1.user1_name; result.user2_id := user2.user2_id; result.user2_name := user2.user2_name; RETURN result; END $$ language plpgsql;
Semasa menggunakan CREATE TYPE mungkin kelihatan munasabah untuk mengembalikan hasil polimorfik, PL/ pgSQL menyediakan pendekatan yang lebih fleksibel dan mantap. Dengan menyalahgunakan jenis RECORD, anda boleh mengembalikan bilangan lajur yang berbeza-beza berdasarkan input, menjadikannya sesuai untuk mengendalikan mesej ralat pilihan atau maklumat tambahan.
Berikut ialah contoh:
CREATE FUNCTION test_ret(a TEXT, b TEXT) RETURNS RECORD AS $$ DECLARE ret RECORD; BEGIN IF LENGTH(a) < LENGTH(b) THEN ret := (TRUE, a || b, 'a shorter than b'); ELSE ret := (FALSE, b || a); END IF; RETURN ret; END; $$ LANGUAGE plpgsql;
Fungsi ini secara dinamik mengembalikan sama ada dua atau tiga lajur bergantung pada input dan boleh digunakan untuk pelbagai senario, seperti mengembalikan status kejayaan dan ralat pilihan mesej.
Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Berbilang Medan sebagai Rekod Tunggal dalam PostgreSQL Menggunakan PL/pgSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!