VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

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操作。