35.3. PL/pgSQL的結構

PL/pgSQL是一種塊結構的語言。 函數定義的所有文本都必須是一個。 一個塊用下面的方法定義:

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

塊中的每個聲明和每條語句都是用一個分號終止的, 如果一個子塊在另外一個塊裡,那麼 END 後面必須有個分號,如上所述; 不過結束函數體的最後的 END 可以不要這個分號。

所有關鍵字和標識符都可以用混和大小寫的方式來寫。標識符被隱含地轉換成小寫字元,除非被雙引號包圍。

PL/pgSQL 裡有兩種類型地註釋。一個雙破折號(--) 引出一個擴展到該行結尾的註釋。一個 /* 引出一個塊註釋,一直擴展到下一次 */ 的出現。 塊註釋不能嵌套,但是雙破折號註釋可以包圍在塊註釋裡面,並且雙破折號可以隱藏一個塊註釋分隔符 /**/

在一個塊的語句段裡的任何語句都可以是一個子塊。 子塊可以用於邏輯分組或者把變量局部化為作用於一個比較小的語句組。

在語句塊前面的聲明段(declarations section)裡定義的變量在每次進入語句塊時都初始化為它們的預設值, 而不是每次函數調用時初始化一次。比如:

CREATE FUNCTION somefunc() RETURNS integer AS $$
DECLARE
   quantity integer := 30;
BEGIN
   RAISE NOTICE 'Quantity here is %', quantity;  -- 在這裡的數量是 30
   quantity := 50;
   --
   -- 建立一個子塊
   --
   DECLARE
      quantity integer := 80;
   BEGIN
      RAISE NOTICE 'Quantity here is %', quantity;  -- 在這裡的數量是 80
   END;

   RAISE NOTICE 'Quantity here is %', quantity;  -- 在這裡的數量是 50

   RETURN quantity;
END;
$$ LANGUAGE plpgsql;

我們一定不要把PL/pgSQL裡用於語句分組的 BEGIN/END 和用於交易控制的資料庫命令搞混了。 PL/pgSQLBEGIN/END 只是用於分組(譯注︰象 C 裡的 {}); 它們不會開始和結束一個交易。 函數和觸發器過程總是在一個由外層命令建立起來的交易裡執行 — 它們無法開始或者提交交易,因為 PostgreSQL 沒有嵌套交易。 不過,一個包含 EXCEPTION 子句的塊實際上形成一個子交易,它可以在不影響外層交易的情況下回滾。 更多相關訊息請參閱 Section 35.7.5