37.3. PL/pgSQL的結構

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

[ <<label>> ]
[ DECLARE
    declarations ]
BEGIN
    statements
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 沒有嵌套事務。