首頁 > 資料庫 > mysql教程 > PL/pgSQL 函數如何動態傳回各種 SELECT 查詢的結果?

PL/pgSQL 函數如何動態傳回各種 SELECT 查詢的結果?

DDD
發布: 2025-01-22 23:31:12
原創
553 人瀏覽過

How Can a PL/pgSQL Function Dynamically Return Results from Various SELECT Queries?

重建PL/pgSQL函數以傳回不同SELECT查詢的輸出

動態SQL與回傳型別

傳回未定義類型的記錄

原始函數宣告的傳回類型為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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板