CREATE FUNCTION
功能描述
创建一个函数。
注意事项
相比于原始的openGauss,dolphin对于CREATE FUNCTION语法的修改为:
- 增加 LANGUAGE 默认值 plpgsql。
- 增加语法兼容项 [NOT] DETERMINISTIC。
- 增加语法兼容项 { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } 。
- 增加语法兼容项 SQL SECURITY { DEFINER | INVOKER }。
- 增加MySQL风格语法格式。
语法格式
dolphin加载后,CREATE FUNCTION 语法的格式为
- 兼容PostgreSQL风格的创建自定义函数语法。
1. CREATE [ OR REPLACE ] FUNCTION function_name
2. ( [ { argname [ argmode ] argtype [ { DEFAULT | := | = } expression ]
3. } [, ...] ] )
4. [ RETURNS rettype
5. | RETURNS TABLE ( { column_name column_type } [, ...] )]
6. [
7. {IMMUTABLE | STABLE | VOLATILE}
8. | {SHIPPABLE | NOT SHIPPABLE}
9. | [ NOT ] LEAKPROOF
10. | WINDOW
11. | {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT}
12. | {[ EXTERNAL| SQL ] SECURITY INVOKER | [ EXTERNAL| SQL ] SECURITY DEFINER | AU
13. THID DEFINER | AUTHID CURRENT_USER}
14. | {FENCED | NOT FENCED}
15. | {PACKAGE}
16. | COST execution_cost
17. | ROWS result_rows
18. | SET configuration_parameter { {TO | =} value | FROM CURRENT }
19. | COMMENT 'text'
20. | {DETERMINISTIC | NOT DETERMINISTIC}
21. | LANGUAGE lang_name
22. | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
23. ] [...]
24. {
25. AS 'definition'
26. | AS 'obj_file', 'link_symbol'
27. }
- O风格的创建自定义函数的语法。
1. CREATE [ OR REPLACE ] FUNCTION function_name
2. ( [ { argname [ argmode ] argtype [ { DEFAULT | := | = } expression ] }
3. [, ...] ] )
4. RETURN rettype
5. [
6. {IMMUTABLE | STABLE | VOLATILE }
7. | {SHIPPABLE | NOT SHIPPABLE}
8. | {PACKAGE}
9. | [ NOT ] LEAKPROOF
10. | {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT }
11. | {[ EXTERNAL| SQL ] SECURITY INVOKER | [ EXTERNAL| SQL ] SECURITY DEFINER | |
12. AUTHID DEFINER | AUTHID CURRENT_USER}
13. | COST execution_cost
14. | ROWS result_rows
15. | SET configuration_parameter { {TO | =} value | FROM CURRENT }
16. | COMMENT 'text'
17. | {DETERMINISTIC | NOT DETERMINISTIC}
18. | LANGUAGE lang_name
19. | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
20. ][...]
21. {
22. IS | AS
23. } plsql_body
24. /
- MySQL风格语法格式。
1. CREATE [ OR REPLACE ] FUNCTION function_name
2. ( [ { argname [ argmode ] argtype [ { DEFAULT | := | = } expression ] }
3. [, ...] ] )
4. RETURNS rettype
5. [
6. SQL SECURITY { DEFINER | INVOKER }
7. | COMMENT 'text'
8. | {DETERMINISTIC | NOT DETERMINISTIC}
9. | LANGUAGE lang_name
10. | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
11. ][...] plsql_body
参数说明
- LANGUAGE lang_name
用以实现函数的语言的名称。PostgreSQL风格函数默认值 sql, O风格默认值 plpgsql。 MySQL风格语法格式下,LANGUAGE选项仅做语法兼容,可填入其他值,但最终将使用plpgsql作为实现函数的语言。在MySQL风格语法格式下,此选项允许重复。 - SQL SECURITY INVOKER
表明该函数将带着调用它的用户的权限执行。该参数可以省略。
SQL SECURITY INVOKER和SECURITY INVOKER和AUTHID CURRENT_USER的功能相同。
在MySQL风格语法格式下,此选项允许重复,且与SQL SECURITY DEFINER同类别。该类别的函数选项以最后一个输入为准。 - SQL SECURITY DEFINER
声明该函数将以创建它的用户的权限执行。
SQL SECURITY DEFINER和AUTHID DEFINER和SECURITY DEFINER的功能相同。
在MySQL风格语法格式下,此选项允许重复,且与SQL SECURITY INVOKER同类别。该类别的函数选项以最后一个输入为准。 - CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA
语法兼容项。此选项允许重复。
示例
1. --指定 CONTAINS SQL
2. openGauss=# CREATE FUNCTION func_test (s CHAR(20)) RETURNS int
3. CONTAINS SQL AS $$ select 1 $$ ;
5. --指定 DETERMINISTIC
6. openGauss=# CREATE FUNCTION func_test (s int) RETURNS int
7. CONTAINS SQL DETERMINISTIC AS $$ select s; $$ ;
9. --指定 LANGUAGE SQL
10. openGauss=# CREATE FUNCTION func_test (s int) RETURNS int
11. CONTAINS SQL LANGUAGE SQL AS $$ select s; $$ ;
13. --指定 NO SQL
14. openGauss=# CREATE FUNCTION func_test (s int) RETURNS int
15. NO SQL AS $$ select s; $$ ;
17. --指定 READS SQL DATA
18. openGauss=# CREATE FUNCTION func_test (s int) RETURNS int
19. CONTAINS SQL READS SQL DATA AS $$ select s; $$ ;
21. --指定 MODIFIES SQL DATA
22. openGauss=# CREATE FUNCTION func_test (s int) RETURNS int
23. CONTAINS SQL LANGUAGE SQL NO SQL MODIFIES SQL DATA AS $$ select s; $$ ;
25. --指定 SECURITY DEFINER
26. openGauss=# CREATE FUNCTION func_test (s int) RETURNS int
27. NO SQL SQL SECURITY DEFINER AS $$ select s; $$ ;
29. --指定 SECURITY INVOKER
30. openGauss=# CREATE FUNCTION func_test (s int) RETURNS int
31. SQL SECURITY INVOKER READS SQL DATA LANGUAGE SQL AS $$ select s; $$ ;
33. --MySQL风格语法格式
34. openGauss=# create function func(n int) returns varchar(50) return (select n+1);
35. CREATE FUNCTION
36. openGauss=# select func(1);
37. func
38. ------
39. 2
40. (1 row)
42. openGauss=# delimiter //
43. SET
44. openGauss=# create function func10(b int) returns int
45. openGauss-# begin
46. openGauss-# if b > 0 then return b + 10;
47. openGauss-# else return -1;
48. openGauss-# end if;
49. openGauss-# end//
50. CREATE FUNCTION
51. openGauss=# delimiter ;
52. SET
53. openGauss=# select func10(9);
54. func10
55. --------
56. 19
57. (1 row)
