CREATE PROCEDURE
功能描述
创建一个新的存储过程。
注意事项
如果创建存储过程时参数或返回值带有精度,不进行精度检测。
创建存储过程时,存储过程定义中对表对象的操作建议都显示指定模式,否则可能会导致存储过程执行异常。
在创建存储过程时,存储过程内部通过SET语句设置current_schema和search_path无效。执行完函数search_path和current_schema与执行函数前的search_path和current_schema保持一致。
如果存储过程参数中带有出参,SELECT调用存储过程必须缺省出参,CALL调用存储过程调用非重载函数时必须指定出参,对于重载的package函数,out参数可以缺省,具体信息参见CALL的示例。
存储过程指定package属性时支持重载。
在创建procedure时,不能在avg函数外面嵌套其他agg函数,或者其他系统函数。
语法格式
vastbase=# CREATE [ OR REPLACE ] PROCEDURE procedure_name
[ ( {[ argmode ] [ argname ] argtype [ { DEFAULT | := | = } expression ]}[,...]) ]
[
{ IMMUTABLE | STABLE | VOLATILE }
| { SHIPPABLE | NOT SHIPPABLE }
| {PACKAGE}
| [ NOT ] LEAKPROOF
| { CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT }
| {[ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | AUTHID DEFINER | AUTHID CURRENT_USER}
| COST execution_cost
| ROWS result_rows
| SET configuration_parameter { [ TO | = ] value | FROM CURRENT }
][ ... ]
{ IS | AS }
plsql_body
/
参数说明
OR REPLACE
当存在同名的存储过程时,替换原来的定义。
procedure_name
创建的存储过程名称,可以带有模式名。
取值范围:字符串,要符合标识符的命名规范。
argmode
参数的模式。
其他说明
vastbase数据库支持在存储过程含commit&rollback以及自治事物。示例如下:
--创建含commit&rollback的存储过程
vastbase2=# create table test_pro(id int,a text,c char(20));
vastbase2=# create or replace procedure test_pro1 is
begin
insert into test_pro values(1,'b1','c1');
commit;
insert into test_pro values(2,'b2','c3');
insert into test_pro values(3,'b3','c3');
insert into test_pro values(4,'b4','c4');
insert into test_pro values(5,'b5','c5');
insert into test_pro values(6,'b6','c6');
commit;
delete from test_pro where id =2;
rollback;
delete from test_pro where id =2;
commit;
end;
/
vastbase2=#call test_pro1();
vastbase2=#select * from test_pro;
id | a | c
----+----+-------------
1 | b1 | c1
3 | b3 | c3
4 | b4 | c4
5 | b5 | c5
6 | b6 | c6
(5 rows)
--创建启用自治事物的存储过程
vastbase2=# create table at_tb2(id int,val varchar(20));
vastbase2=# create or replace procedure at_test3(i int) AS DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
START TRANSACTION;
insert into at_tb2 values(1,'before s1');
insert into at_tb2 values(2,'after s1');
if i>10 then
rollback;
else
commit;
end if;
end;
/
vastbase2=# call at_test3(11);
at_test3
----------------
(1 row)
vastbase2=# select * from at_tb2;
id | val
---+-----
(0 row)
vastbase2=# call at_test3(6);
at_test3
----------------
(1 row)
vastbase2=# select * from at_tb2;
id | val
---+-----
1 |before s1
2 |after s1
(2 rows)
--删除表 test_pro.
vastbase2=# DROP TABLE test_pro;
--删除存储过程 test_pro1;
vastbase2=# DROP PROCEDURE test_pro1;
--删除表 at_tb2.
vastbase2=# DROP TABLE at_tb2;
--删除存储过程 at_test3;
vastbase2=# DROP PROCEDURE at_test3;
VARIADIC用于声明数组类型的参数。
取值范围: IN,OUT,INOUT或VARIADIC。缺省值是IN。只有OUT模式的参数后面能跟VARIADIC。并且OUT和INOUT模式的参数不能用在RETURNS TABLE的过程定义中。
argname
参数的名称。
取值范围:字符串,要符合标识符的命名规范。
argtype
参数的数据类型。
取值范围:可用的数据类型。
IMMUTABLE、STABLE等
行为约束可选项。各参数的功能与CREATE FUNCTION类似,详细说明见CREATE FUNCTION。
plsql_body
PL/SQL存储过程体。
当在存储过程体中进行创建用户等涉及用户密码相关操作时,系统表及csv日志中会记录密码的明文。因此不建议用户在存储过程体中进行涉及用户密码的相关操作。
argument_name和argmode的顺序没有严格要求,推荐按照argument_name、argmode、argument_type的顺序使用。
优化建议
analyse | analyze
不支持在事务或匿名块中执行analyze 。
不支持在函数或存储过程中执行analyze操作。