Greenplum的PL/pgSQL過程化語言

 

1.關於Greenplum的PL/pgSQL

Greenplum數據庫的PL/pgSQL是一種可加載的過程化語言, Greenplum數據庫中已經默認安裝和註冊了改語言。用戶可以使用SQL語句,函數和操作符來創建自定義函數。

PL/pgSQL是Oracle的PL/SQL的子集,Greenplum的PL/pgSQL是基於Postgres的PL/pgSQL的。

1.1Greenplum數據庫的SQL侷限性

當使用Greenplum的PL/pgSQL時,主要的限制如下:

  1. 不支持觸發器
  2. 遊標只支持向前移動
  3. 不支持可更新的遊標(UPDATE...WHERE CURRENT OF 和 DELETE...WHERE CURRENT OF))

1.2PL/pgSQL語言

PL/pgSQL是一種塊狀的過程化語言,一個函數定義的完整文本必須是一個塊,塊的定義如下:

        [ <<label>> ]

        [ DECLARE

          declarations ]

        BEGIN

          statements

        END [ label ];

  如果要在EXIT語句中識別塊,或者使用塊中聲明的變量的全限定名,可以使用label。如果END語句之後跟label,該label必須匹配開始的label。

每一個在塊內部的declaration和statement需要以分號(;)結尾,在一個塊內部的另一個塊必須在END後面加分號。

注意:不要將數據庫中事務的BEGIN和END關鍵字與PL/pgSQL中的BEGIN和END關鍵字混淆。在PL/PGSQL中BEGIN和END關鍵字僅僅爲了分組,並不是開啓和關閉一個事務。

所有的關鍵字和標識符可以寫成大寫和小寫的混合形式,標識符會隱式轉換爲小寫的,除非使用雙引號引起來。

可以在PL/pgSQL中使用註釋

單行註釋:--

塊註釋:/*   */

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;

2.例子

有兩種方式創建別名,其中比較好的方式是在創建函數時給出具體的參數名稱,比如:

CREATE FUNCTION sales_tax(subtotal real) RETURNS real AS $$

BEGIN

RETURN subtotal * 0.06;

END;

$$ LANGUAGE plpgsql;

也可以顯示聲明一個別名,語法如下:

name ALIAS FOR $n;

使用Declare語法創建語上述相同的函數

CREATE FUNCTION sales_tax(real) RETURNS real AS $$

DECLARE

subtotal ALIAS FOR $1;

BEGIN

RETURN subtotal * 0.06;

END;

$$ LANGUAGE plpgsql;

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章