CREATE PROCEDURE
功能描述
创建一个新的存储过程。
注意事项
相比于原始的openGauss,dolphin对于CREATE PROCEDURE语法的修改为:
- 增加 LANGUAGE 选项。
- 增加语法兼容项 [NOT] DETERMINISTIC。
- 增加语法兼容项 { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } 。
- 增加语法兼容项 SQL SECURITY { DEFINER | INVOKER }。
- 兼容MySQL的创建存储过程的语法格式
- 兼容创建存储过程紧跟单条查询语句
语法格式
- openGauss 原始创建存储过程的语法。
1. CREATE [ OR REPLACE ] PROCEDURE procedure_name
2. [ ( {[ argname ] [ argmode ] argtype [ { DEFAULT | := | = } expression ]}[,...]) ]
3. [
4. { IMMUTABLE | STABLE | VOLATILE }
5. | { SHIPPABLE | NOT SHIPPABLE }
6. | {PACKAGE}
7. | [ NOT ] LEAKPROOF
8. | { CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT }
9. | {[ EXTERNAL |SQL ] SECURITY INVOKER | [ EXTERNAL|SQL ] SECURITY DEFINER | AUTHID DEFINER | AUTHID CURRENT_USER}
10. | COST execution_cost
11. | SET configuration_parameter { TO value | = value | FROM CURRENT }
12. | COMMENT text
13. | {DETERMINISTIC | NOT DETERMINISTIC}
14. | LANGUAGE lang_name
15. | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
16. ][ ... ]
17. { IS | AS }
18. plsql_body
19. /
- 使用MySQL 的格式进行创建存储过程。
注意:使用MMySQL 的格式创建时,需要在客户端使用delimiter 命令设置结束符。
1. CREATE [ OR REPLACE ] PROCEDURE procedure_name
2. ( [ {[ argname ] [ argmode ] argtype [ { DEFAULT | := | = } expression ]}[,...] ] )
3. [
4. { IMMUTABLE | STABLE | VOLATILE }
5. | { SHIPPABLE | NOT SHIPPABLE }
6. | {PACKAGE}
7. | [ NOT ] LEAKPROOF
8. | { CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT }
9. | {[ EXTERNAL |SQL ] SECURITY INVOKER | [ EXTERNAL|SQL ] SECURITY DEFINER | AUTHID DEFINER | AUTHID CURRENT_USER}
10. | COST execution_cost
11. | SET configuration_parameter { TO value | = value | FROM CURRENT }
12. | COMMENT text
13. | {DETERMINISTIC | NOT DETERMINISTIC}
14. | LANGUAGE lang_name
15. | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
16. ][ ... ]
17. routine_body
- 创建存储过程紧跟单条查询语句。
1. CREATE [ OR REPLACE ] PROCEDURE procedure_name
2. ( [ {[ argname ] [ argmode ] argtype [ { DEFAULT | := | = } expression ]}[,...] ] )
3. [
4. { IMMUTABLE | STABLE | VOLATILE }
5. | { SHIPPABLE | NOT SHIPPABLE }
6. | {PACKAGE}
7. | [ NOT ] LEAKPROOF
8. | { CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT }
9. | {[ EXTERNAL |SQL ] SECURITY INVOKER | [ EXTERNAL|SQL ] SECURITY DEFINER | AUTHID DEFINER | AUTHID CURRENT_USER}
10. | COST execution_cost
11. | SET configuration_parameter { TO value | = value | FROM CURRENT }
12. | COMMENT text
13. | {DETERMINISTIC | NOT DETERMINISTIC}
14. | LANGUAGE lang_name
15. | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
16. ][ ... ]
17. select_stmt
参数说明
- LANGUAGE lang_name
用以实现存储过程的语言的名称。默认值 plpgsql。 - SQL SECURITY INVOKER
表明该存储过程将带着调用它的用户的权限执行。该参数可以省略。
SQL SECURITY INVOKER和SECURITY INVOKER和AUTHID CURRENT_USER的功能相同。 - SQL SECURITY DEFINER
声明该存储过程将以创建它的用户的权限执行。
SQL SECURITY DEFINER和AUTHID DEFINER和SECURITY DEFINER的功能相同。 - CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA
语法兼容项。
示例
1. --创建存储过程使用单条查询语句,显示为CREATE FUNCTION
2. openGauss=# create procedure procxx() select a from t1;
3. CREATE FUNCTION
5. --结果集类似RETURNS SETOF RECORD
6. openGauss=# select procxx();
7. procxx
8. --------
9. (1)
10. (2)
11. (2 rows)
