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时,主要的限制如下:
- 不支持触发器
- 游标只支持向前移动
- 不支持可更新的游标(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;