2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2

41.1. 概述 #

PL/pgSQL 是 PostgreSQL 資料庫系統的一個可載入的過程語言。 PL/pgSQL 的設計目標是建立一個可載入的過程語言,該語言能夠

  • 用於建立函式、過程和觸發器,

  • 向語言新增控制結構,SQL語言,

  • 能夠執行復雜的計算,

  • 繼承所有使用者定義的型別、函式、過程和運算子,

  • 可以被定義為被伺服器信任,

  • 易於使用。

使用 PL/pgSQL 建立的函式可以在內建函式可以使用的地方使用。例如,可以建立複雜的條件計算函式,然後用它們來定義運算子或在索引表示式中使用。

PostgreSQL 9.0 及更高版本中,PL/pgSQL 預設安裝。但它仍然是一個可載入的模組,因此特別是注重安全性的管理員可以選擇將其移除。

41.1.1. 使用 PL/pgSQL 的優勢 #

SQLPostgreSQL 和大多數其他關係資料庫用來作為查詢語言的語言。它具有可移植性且易於學習。但每個SQL語句必須由資料庫伺服器單獨執行。

這意味著您的客戶端應用程式必須將每個查詢傳送到資料庫伺服器,等待其處理,接收並處理結果,進行一些計算,然後傳送更多查詢到伺服器。所有這些都會產生程序間通訊,並且如果您的客戶端與資料庫伺服器不在同一臺機器上,還會產生網路開銷。

使用 PL/pgSQL,您可以將一系列計算和一系列查詢分組 資料庫伺服器內部,從而獲得過程語言的強大功能和 SQL 的易用性,同時大大節省了客戶端/伺服器通訊開銷。

  • 消除了客戶端和伺服器之間的額外往返

  • 客戶端不需要的中間結果不必在伺服器和客戶端之間進行封送或傳輸

  • 可以避免多輪查詢解析

與不使用儲存函式的應用程式相比,這可以帶來顯著的效能提升。

此外,使用 PL/pgSQL,您可以使用 SQL 的所有資料型別、運算子和函式。

41.1.2. 支援的引數和結果資料型別 #

PL/pgSQL 編寫的函式可以接受伺服器支援的任何標量或陣列資料型別作為引數,並且可以返回這些型別的任何一種結果。它們還可以接受或返回由名稱指定的任何複合型別(行型別)。也可以將 PL/pgSQL 函式宣告為接受 record,這意味著任何複合型別都可以作為輸入,或者宣告為返回 record,這意味著結果是一個行型別,其列由呼叫查詢中的規範確定,如 第 7.2.1.4 節中所述。

PL/pgSQL 函式可以透過使用 VARIADIC 標記宣告為接受可變數量的引數。這與 SQL 函式的工作方式完全相同,如 第 36.5.6 節中所述。

PL/pgSQL 函式還可以宣告為接受和返回 第 36.2.5 節中描述的多型型別,從而允許函式處理的實際資料型別在每次呼叫時都可能不同。示例出現在 第 41.3.1 節中。

PL/pgSQL 函式還可以宣告為返回任何可以作為單個例項返回的資料型別的 集合(或表)。這樣的函式透過對結果集的每個所需元素執行 RETURN NEXT,或者透過使用 RETURN QUERY 來輸出查詢結果的評估,來生成其輸出。

最後,如果 PL/pgSQL 函式沒有有用的返回值,則可以將其宣告為返回 void。(或者,在這種情況下,可以將其寫為過程。)

PL/pgSQL 函式還可以宣告帶有輸出引數,而不是顯式指定返回型別。這並沒有為語言增加任何根本性的能力,但通常很方便,特別是對於返回多個值。 RETURNS TABLE 表示法也可以代替 RETURNS SETOF 使用。

具體示例出現在 第 41.3.1 節第 41.6.1 節中。

提交更正

如果您在文件中看到任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。