支援的版本: 目前 (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 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2

41.2. PL/pgSQL 的結構 #

PL/pgSQL 撰寫的函數,會透過執行 CREATE FUNCTION 命令來定義至伺服器。這樣的命令通常看起來像這樣:

CREATE FUNCTION somefunc(integer, text) RETURNS integer
AS 'function body text'
LANGUAGE plpgsql;

CREATE FUNCTION 而言,函數主體只是一個字串文字。使用 dollar quoting (請參閱第 4.1.2.4 節) 來撰寫函數主體通常很有幫助,而不是使用一般的單引號語法。如果沒有 dollar quoting,函數主體中的任何單引號或反斜線都必須透過將它們加倍來跳脫。本章中的幾乎所有範例都使用以錢號括住的文字作為其函數主體。

PL/pgSQL 是一種區塊結構化的語言。函數主體的完整文字必須是一個區塊。一個區塊定義為:

[ <<label>> ]
[ DECLARE
    declarations ]
BEGIN
    statements
END [ label ];

區塊中的每個宣告和每個陳述式都以分號結尾。出現在另一個區塊中的區塊,在 END 後面必須有一個分號,如上所示;然而,結論函數主體的最後一個 END 不需要分號。

提示

一個常見的錯誤是在 BEGIN 之後立即寫一個分號。這是錯誤的,並且會導致語法錯誤。

只有當您想要識別區塊以在 EXIT 陳述式中使用,或限定在區塊中宣告的變數的名稱時,才需要label。如果在 END 之後給定標籤,它必須與區塊開頭的標籤匹配。

所有關鍵字都不區分大小寫。識別符號會隱式地轉換為小寫,除非用雙引號括起來,就像在一般的 SQL 命令中一樣。

註解在 PL/pgSQL 程式碼中的運作方式與在一般 SQL 中相同。一個雙破折號 (--) 開始一個註解,該註解延伸到該行的末尾。/* 開始一個區塊註解,該註解延伸到匹配的 */ 出現處。區塊註解可以巢狀。

區塊的陳述式區段中的任何陳述式都可以是子區塊。子區塊可用於邏輯分組,或將變數本地化到一小組陳述式。在子區塊中宣告的變數會遮罩外部區塊中任何類似名稱的變數,持續時間為子區塊的持續時間;但是,如果您以區塊的標籤限定它們的名稱,您仍然可以存取外部變數。例如:

CREATE FUNCTION somefunc() RETURNS integer AS $$
<< outerblock >>
DECLARE
    quantity integer := 30;
BEGIN
    RAISE NOTICE 'Quantity here is %', quantity;  -- Prints 30
    quantity := 50;
    --
    -- Create a subblock
    --
    DECLARE
        quantity integer := 80;
    BEGIN
        RAISE NOTICE 'Quantity here is %', quantity;  -- Prints 80
        RAISE NOTICE 'Outer quantity here is %', outerblock.quantity;  -- Prints 50
    END;

    RAISE NOTICE 'Quantity here is %', quantity;  -- Prints 50

    RETURN quantity;
END;
$$ LANGUAGE plpgsql;

注意

實際上,任何 PL/pgSQL 函數的主體周圍都有一個隱藏的外部區塊。此區塊提供函數參數的宣告 (如果有的話),以及一些特殊變數,例如 FOUND (請參閱第 41.5.5 節)。外部區塊以函數的名稱標記,表示參數和特殊變數可以用函數的名稱來限定。

重要的是不要將 PL/pgSQL 中用於群組陳述式的 BEGIN/END 與用於交易控制的同名 SQL 指令混淆。PL/pgSQLBEGIN/END 僅用於群組;它們不會開始或結束交易。有關在 PL/pgSQL 中管理交易的資訊,請參閱第 41.8 節。此外,包含 EXCEPTION 子句的區塊實際上形成了一個子交易,可以回滾而不影響外部交易。有關更多資訊,請參閱第 41.6.8 節

提交更正

如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的內容,請使用此表格來回報文件問題。