相关文章推荐
乐观的机器猫  ·  Spring ...·  1 年前    · 
果断的汽水  ·  [Hadoop] ...·  1 年前    · 

使用过 Oracle 的语句块的都熟悉,在不用创建存储过程或函数就可以执行 PLSQL 数据库脚本,这样做通常可以用来做一些复杂业务数据初始化的功能。那么在 PostgreSQL 中也有相应的功能,称为 PL/pgSQL ,具体语法如下:

[ <<label>> ]
[ DECLARE
    declarations ]
BEGIN
    statements
END [ label ];
  • 语句块由两部分组成:声明部分与主体部分,声明部分是可选的,主体部分是必须的,在主体部分最后的END使用;结尾。
  • 块有个可选标签label,如果使用了label那么在END结尾也必须跟label标签。
  • 主体部分为具体的编码部分,每条语句都要已;结尾。
  • PostgreSQL中如果不想创建函数或存储过程,就想执行语句块,可以使用匿名函数,如下:

    do $$
    begin
    	raise notice '无Label标签与声明部分';
    end $$;
    do $$
    begin
    	raise notice '使用label标签';
    end test $$;
    do $$
    declare
    	i int:=1;
    begin
    	i := i+1;
    	raise notice '使用label标签,声明i变量,i=%',i;
    end test $$;
    

    上面例子给出了三种写法,输出结果如下:

    无Label标签与声明部分
    使用label标签
    使用label标签,声明i变量,i=2
    

    从上面的案例可以看到declare声明了一个int类型的i简单变量,PL/pgSQL变量可以使用任意的SQL数据类型,比如integervarcharchar等等。比如:

    --声明字符串类型变量
    name varchar(30);
    --声明复合数据类型
    user_info user%rowtype;
    --拷贝字段的类型
    user_id user.id%type;
    --声明记录类型
    user_list record;
    

    变量声明语法:

    name [ CONSTANT ] type [ COLLATE collation_name ] [ NOT NULL ] [ { DEFAULT | := | = } expression ];
    

    如果想在声明变量的时候就需要给默认值,写法如下:

    num int:=0;
    

    对于简单的变量声明就不做演示,下面演示下符合数据类型及记录类型的使用,复合数据类型一般用于将整条数据存储到变量里面;记录类型则是记录多条数据,通常配合for循环使用;

    do $$
    declare
    	t_o t_order%rowtype;
    	t_o_list record;
    begin
    	select * into t_o from t_order t where t.id = 5;
    	raise notice '客户:%,订单编码:%',t_o.cus_name,t_o.order_code;
    	for t_o_list in (select * from t_order) loop
    		raise notice '客户:%,订单编码:%',t_o_list.cus_name,t_o_list.order_code;
    	end loop;
    end test $$;