CREATE FUNCTION

功能描述

创建一个函数。

注意事项

相比于原始的openGauss,dolphin对于CREATE FUNCTION语法的修改为:

  1. 增加 LANGUAGE 默认值 plpgsql。
  2. 增加语法兼容项 [NOT] DETERMINISTIC。
  3. 增加语法兼容项 { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } 。
  4. 增加语法兼容项 SQL SECURITY { DEFINER | INVOKER }。
  5. 增加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)

相关链接

CREATE FUNCTION