以 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
>> ] [ DECLAREdeclarations
] BEGINstatements
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/pgSQL 的 BEGIN
/END
僅用於群組;它們不會開始或結束交易。有關在 PL/pgSQL 中管理交易的資訊,請參閱第 41.8 節。此外,包含 EXCEPTION
子句的區塊實際上形成了一個子交易,可以回滾而不影響外部交易。有關更多資訊,請參閱第 41.6.8 節。
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的內容,請使用此表格來回報文件問題。