PL/pgSQL 是 PostgreSQL 資料庫系統的可載入程序語言。PL/pgSQL 的設計目標是建立一種可載入的程序語言,該語言
可用於建立函數、程序和觸發器,
將控制結構新增到SQL語言,
可以執行複雜的計算,
繼承所有使用者定義的類型、函數、程序和運算子,
可以定義為受伺服器信任,
易於使用。
使用 PL/pgSQL 建立的函數可以在任何可以使用內建函數的地方使用。例如,可以建立複雜的條件計算函數,然後使用它們來定義運算子或在索引表示式中使用它們。
在 PostgreSQL 9.0 及更高版本中,預設會安裝 PL/pgSQL。然而,它仍然是一個可載入的模組,因此特別注意安全的管理員可以選擇移除它。
SQL是 PostgreSQL 和大多數其他關聯式資料庫用作查詢語言的語言。 它具有可移植性且易於學習。 但是每個SQL陳述式必須由資料庫伺服器單獨執行。
這表示您的用戶端應用程式必須將每個查詢傳送到資料庫伺服器,等待處理,接收和處理結果,進行一些計算,然後將更多查詢傳送到伺服器。 所有這些都會產生進程間通訊,如果您的用戶端與資料庫伺服器位於不同的機器上,也將產生網路開銷。
使用 PL/pgSQL,您可以將一個計算區塊和一系列查詢置於資料庫伺服器內部,從而同時擁有程序語言的強大功能和 SQL 的易用性,但可以大幅節省用戶端/伺服器通訊開銷。
消除了用戶端和伺服器之間的額外往返
客戶端不需要的中間結果不必在伺服器和客戶端之間進行序列化或傳輸
可以避免多輪查詢分析
與不使用儲存函數的應用程式相比,這可以顯著提高效能。
此外,使用 PL/pgSQL,您可以使用 SQL 的所有資料類型、運算子和函數。
以 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 節中。
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步說明的地方,請使用此表單報告文件問題。