Pada masa ini, fungsi anda mengembalikan rentetan teks yang mewakili pernyataan SELECT yang dijana. Untuk mengautomasikan pelaksanaan dan mengembalikan hasil, anda boleh menggunakan SQL dinamik. Walau bagaimanapun, kesukaran terletak pada jenis pulangan yang tidak ditentukan. Fungsi perlu menentukan jenis pulangan dalam klausa RETURNS.
Dengan mengandaikan jenis pulangan tetap, yang mengandungi lajur cap masa bernama datahora
dan dua lajur tambahan dengan nama dan jenis yang berbeza, anda boleh melaksanakan perkara berikut:
<code class="language-sql">CREATE OR REPLACE FUNCTION data_of(_id integer) RETURNS TABLE (datahora timestamp, col2 text, col3 text) LANGUAGE plpgsql AS $func$ DECLARE _sensors text := 'col1::text, col2::text'; -- 将每一列强制转换为文本类型 _type text := 'foo'; BEGIN RETURN QUERY EXECUTE ' SELECT datahora, ' || _sensors || ' FROM ' || quote_ident(_type) || ' WHERE id = ORDER BY datahora' USING _id; END $func$;</code>
Jika jenis pulangan mempunyai bilangan lajur yang berubah-ubah, tetapi semua lajur adalah daripada jenis yang sama (contohnya, dua kali ganda), gunakan jenis tatasusunan:
<code class="language-sql">CREATE OR REPLACE FUNCTION data_of(_id integer) RETURNS TABLE (datahora timestamp, names text[], values float8[]) LANGUAGE plpgsql AS $func$ DECLARE _sensors text := 'col1, col2, col3'; -- 列名的简单列表 _type text := 'foo'; BEGIN RETURN QUERY EXECUTE format(' SELECT datahora , string_to_array() -- 作为名称 , ARRAY[%s] -- 作为值 FROM %s WHERE id = ORDER BY datahora' , _sensors, _type) USING _sensors, _id; END $func$;</code>
Untuk mengembalikan semua lajur jadual, gunakan jenis polimorfik:
<code class="language-sql">CREATE OR REPLACE FUNCTION data_of(_tbl_type anyelement, _id int) RETURNS SETOF anyelement LANGUAGE plpgsql AS $func$ BEGIN RETURN QUERY EXECUTE format(' SELECT * FROM %s -- pg_typeof 返回 regtype,自动引用 WHERE id = ORDER BY datahora' , pg_typeof(_tbl_type)) USING _id; END $func$;</code>
Cara menggunakan:
<code class="language-sql">SELECT * FROM data_of(NULL::pcdmet, 17);</code>
Atas ialah kandungan terperinci Bagaimana untuk Memfaktorkan Semula Fungsi PL/pgSQL untuk Mengendalikan Jenis Pengembalian SQL Dinamik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!