使用PL/pgSQL编写postgreSQL的存储过程

发布时间:2020-11-08编辑:脚本学堂
使用PL/pgSQL编写postgreSQL的存储过程

本文详细介绍postgreSQL存储过程的相关知识,包括存储过程结构、变量类型、连接字符、控制结构、异常捕获等。
在这里您可以学会使用PL/pgSQL编写postgreSQL的存储过程。

一、存储过程结构
 Create or replace function 过程名(参数名 参数类型,…..) returns 返回值类型 as
  $body$

   //声明变量
   Declare
   变量名 变量类型;
   如:
   flag Boolean;

   变量赋值方式(变量名 类型 :=值;)
   如:
   Str  text :=值; / str  text;  str :=值;

   Begin
    函数体;
   End;
  $body$
 Language plpgsql;

二、变量类型
除了postgresql内置的变量类型外,常用的还有 RECORD ,表示一条记录

三、连接字符
Postgresql存储过程中的连接字符不再是“+”,而是使用“||”。

四、控制结构
1、if 条件(五种形式)
 

复制代码 代码如下:
IF ... THEN
IF ... THEN ... ELSE
IF ... THEN ... ELSE IF
IF ... THEN ... ELSIF ... THEN ... ELSE
IF ... THEN ... ELSEIF ... THEN ... ELSE(注:ELSEIF 是 ELSIF 的别名)

2、循环
 

复制代码 代码如下:
使用LOOP,EXIT,continue,WHILE, 和 FOR 语句,可以控制PL/pgSQL 函数重复一系列命令。
1)、LOOP
[ <<label>> ]
LOOP
    statements
END LOOP [ label ];
LOOP 定义一个无条件的循环,无限循环, 直到由EXIT或者RETURN语句终止。 可选的 label 可以由 EXIT 和 CONTINUE 语句使用, 用于在嵌套循环中声明应该应用于哪一层循环。

2)、EXIT
EXIT [ label ] [ WHEN expression ];
如果没有给出 label, 那么退出最内层的循环,然后执行跟在 END LOOP 后面的语句。 如果给出 label, 那么它必须是当前或者更高层的嵌套循环块或者语句块的标签。 然后该命名块或者循环就会终止,而控制落到对应循环/块的 END 语句后面的语句上。
如果声明了WHEN,循环退出只有在 expression 为真的时候才发生, 否则控制会落到 EXIT 后面的语句上。
EXIT 可以用于在所有的循环类型中,它并不仅仅限制于在无条件循环中使用。 在和 BEGIN 块一起使用的时候,EXIT 把控制交给块结束后的下一个语句。
例如:
 

复制代码 代码如下:
Loop  循环
If … then  条件判断
 Exit ; 条件成立,则退出循环。
End if;
End loop;

3)、CONTINUE
CONTINUE [ label ] [ WHEN expression ];
如果没有给出 label,那么就开始最内层的循环的下一次执行。 也就是说,控制传递回给循环控制表达式(如果有),然后重新计算循环体。 如果出现了 label,它声明即将继续执行的循环的标签。
如果声明了 WHEN,那么循环的下一次执行只有在 expression 为真的情况下才进行。否则,控制传递给 CONTINUE 后面的语句。
CONTINUE 可以用于所有类型的循环; 它并不仅仅限于无条件循环。
例如:
 

复制代码 代码如下:
LOOP
    一些计算
    EXIT WHEN count > 100;
    CONTINUE WHEN count < 50;
    一些在count 数值在 [50 .. 100] 里面时候的计算
END LOOP;

4)、WHILE
 

复制代码 代码如下:

[ <<label>> ]
WHILE expression LOOP
    statements
END LOOP [ label ];
只要条件表达式为真,WHILE语句就会不停在一系列语句上进行循环. 条件是在每次进入循环体的时候检查的.
例如:
WHILE alinuxjishu/9952.html target=_blank class=infotextkey>mount_owed > 0 AND gift_certificate_balance > 0 LOOP
    -- 可以在这里做些计算
END LOOP;

WHILE NOT BOOLEAN_expression LOOP
    -- 可以在这里做些计算
END LOOP;

5)、FOR (整数变种)
 

复制代码 代码如下:

[ <<label>> ]
FOR name IN [ REVERSE ] expression .. expression LOOP
    statements
END LOOP [ labal ];
这种形式的FOR对一定范围的整数数值进行迭代的循环。 变量name 会自动定义为integer类型并且只在循环里存在。 给出范围上下界的两个表达式在进入循环的时候计算一次。 迭代步进值总是为 1,但如果声明了REVERSE就是 -1。
一些整数FOR循环的例子∶
FOR i IN 1..10 LOOP 表示1循环到10
  这里可以放一些表达式
    RAISE NOTICE 'i IS %', i;
END LOOP;

FOR i IN REVERSE 10..1 LOOP
    这里可以放一些表达式
END LOOP;
如果下界大于上界(或者是在 REVERSE 情况下是小于),那么循环体将完全不被执行。 而且不会抛出任何错误。

3、异常捕获
 

复制代码 代码如下:
EXCEPTION
WHEN 错误码(如:STRING_DATA_RIGHT_TRUNCATION:字串数据右边被截断) THEN
     /**后台打印错误信息*/
RAISE NOTICE '错吴信息';