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;

 

 

posted @ 2018-11-21 12:31  大数据技术与数仓  阅读(221)  评论(0编辑  收藏  举报