傳回未定義類型的記錄
原始函數宣告的傳回類型為text,但現在的目標是執行產生的SQL語句並將結果作為記錄傳回。為此,您需要使用動態SQL並處理傳回尚未定義類型記錄的問題。
具有數字和資料類型可變性的自訂類型
一種方法是建立一個自訂返回類型,其中列數固定,但資料類型可變。但是,這需要為每次呼叫定義列定義列表,當事先不知道列名和資料類型時,這變得不切實際。
使用多型別
pg_typeof() 傳回表名作為物件標識符類型(regtype)。當自動轉換為文字時,標識符會自動用雙引號括起來並進行模式限定,從而防止SQL注入。
RETURN QUERY EXECUTE
執行動態SQL並回傳行的首選方法是RETURN QUERY EXECUTE。它允許您執行SQL查詢並將結果作為具有明確定義的行類型的行集傳回。
程式碼範例
假設您想要根據表格類型參數傳回任何資料表的全部欄位:
<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 -- 自动用双引号括起来并进行模式限定 WHERE id = ORDER BY datahora' , pg_typeof(_tbl_type)) USING _id; END $func$;</code>
用法
使用表格類型作為第一個參數,ID作為第二個參數來呼叫函數。此函數將傳回指定表中具有給定ID的記錄的所有列。
<code class="language-sql">SELECT * FROM data_of(NULL::pcdmet, 17); -- 将pcdmet替换为任何其他表名。</code>
以上是PL/pgSQL 函數如何動態傳回各種 SELECT 查詢的結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!