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時,主要的限制如下:
- 不支持觸發器
- 遊標只支持向前移動
- 不支持可更新的遊標(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;