PostgreSQL存储过程(函数)

原文链接:https://blog.csdn.net/wsxxm_h/article/details/52238681
从接触分布式greenplum数据库,然后了解到其内部的原理,再熟悉postgreSQL数据库,然后学习DML,其基本的应用和SQL是一样的,基本语法就参考postgresql手册
和postgresql教程可以细细的了解一下;我这里就简单说一下存储过程。
一、首先是存储过程的格式

create [or replace] function function_name(参数逗号隔开) returns 返回值类型 as $body$
declare//声明变量
变量名 变量类型 :=变量值;
例如:name char(20):='su';
begin
/*函数体;包括DML语句;
特别注意:如果有返回值,要省略最后的return语句的话,则在函数体的最后必须是一个select语句且返回类型必须和上面声明的类型一样;
*/
return 变量名//和上面返回的变量一样;
end
$body$
language 'plpgsql';

二、控制语句
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
[ <> ]
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 ] [ WHENexpression ];
如果没有给出 label,那么就开始最内层的循环的下一次执行。也就是说,控制传递回给循环控制表达式(如果有),然后重新计算循环体。 如果出现了label,它声明即将继续执行的循环的标签。
如果声明了 WHEN,那么循环的下一次执行只有在expression 为真的情况下才进行。否则,控制传递给CONTINUE 后面的语句。
CONTINUE 可以用于所有类型的循环; 它并不仅仅限于无条件循环。
例如:
LOOP
一些计算
EXIT WHEN count > 100;
CONTINUE WHEN count < 50;
一些在count 数值在 [50 … 100] 里面时候的计算
END LOOP;

4)、WHILE
[ <> ]
WHILE expression LOOP
statements
END LOOP [ label ];
只要条件表达式为真,WHILE语句就会不停在一系列语句上进行循环. 条件是在每次进入循环体的时候检查的.
例如:
WHILE amount_owed > 0 AND gift_certificate_balance > 0 LOOP
– 可以在这里做些计算
END LOOP;
WHILE NOT BOOLEAN_expression LOOP
– 可以在这里做些计算
END LOOP;

5)、FOR(整数变种)
[ <> ]
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 ‘错吴信息’;
三、链接运算符
在postgresql中链接运算符是:||而不是+;
四、代码示例

create or replace function f_test() returns void as $$
declare
  begin
    for i in 1..1000 loop
      execute 'insert into test select generate_series('||(i-1)*40000+1||','||i*40000||'),(random()::float)*'||i*0.0001||',clock_timestamp()';
    end loop;
  end;
$$ language plpgsql;

————————————————
原文链接:https://blog.csdn.net/wsxxm_h/article/details/52238681

你可能感兴趣的:(PostgreSQL存储过程(函数))