diff --git "a/content/zh/post/wzr/\345\207\275\346\225\260\347\232\204\345\210\233\345\273\272.md" "b/content/zh/post/wzr/\345\207\275\346\225\260\347\232\204\345\210\233\345\273\272.md" index 0f970d5cd6df787fb68dad0176a602a683268e84..eae9a8656d59a05a03cf0d66eb545da44724b7ed 100644 --- "a/content/zh/post/wzr/\345\207\275\346\225\260\347\232\204\345\210\233\345\273\272.md" +++ "b/content/zh/post/wzr/\345\207\275\346\225\260\347\232\204\345\210\233\345\273\272.md" @@ -1,112 +1,128 @@ -+++ -title="openGauss社区入门(opengauss-函数的创建)" -date="2022-09-26" -tags=["openGauss社区开发入门"] -archives="2022-09" -author="wangrururu" -summary="openGauss社区开发入门" -img="/zh/post/wzr/title/title.jpg" -times="21:15" -+++ ++++ +title="openGauss社区入门(opengauss-函数的创建)" +date="2022-09-26" +tags=["openGauss社区开发入门"] +archives="2022-09" +author="wangrururu" +summary="openGauss社区开发入门" +img="/zh/post/wzr/title/title.jpg" +times="21:15" ++++ -1.函数的两种语法风格 -(1)兼容PostgreSQL风格 -CREATE [ OR REPLACE ] FUNCTION function_name - [ ( [ { argname [ argmode ] argtype [ { DEFAULT | := | = } expression ]} [, ...] ] ) ] - [ RETURNS rettype [ DETERMINISTIC ] | RETURNS TABLE ( { column_name column_type } [, ...] )] LANGUAGE lang_name - [ - {IMMUTABLE | STABLE | VOLATILE } - | {SHIPPABLE | NOT SHIPPABLE} - | WINDOW - | [ NOT ] LEAKPROOF - | {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT } - | {[ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | AUTHID DEFINER | AUTHID CURRENT_USER} - | {fenced | not fenced} - | {PACKAGE} - | COST execution_cost - | ROWS result_rows - | SET configuration_parameter { {TO | =} value | FROM CURRENT }} - ][...] - { - AS 'definition' - } -(2)O风格 -CREATE [ OR REPLACE ] FUNCTION function_name - ( [ { argname [ argmode ] argtype [ { DEFAULT | := | = } expression ] } [, ...] ] ) - RETURN rettype [ DETERMINISTIC ] - [ - {IMMUTABLE | STABLE | VOLATILE } - | {SHIPPABLE | NOT SHIPPABLE} - | {PACKAGE} - | {FENCED | NOT FENCED} - | [ 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 - / -2.参数说明 -#### 参数说明 -**function_name:**要创建的函数名称(可以用模式修饰)。 -取值范围:字符串,要符合标识符的命名规范,且最多为63个字符,若超过63个字符,数据库会截断并保留前63个字符当做函数名称。 -**argname:**函数参数的名称。 -取值范围:字符串,要符合标识符的命名规范,且最多为63个字符,若超过63个字符,数据库会截断并保留前63个字符当做函数参数名称。 -**argmode:**函数参数的模式。 -取值范围:IN,OUT,INOUT或VARIADIC。缺省值是IN。并且OUT和INOUT模式的参数不能用在RETURNS TABLE的函数定义中。VARIADIC用于声明数组类型的参数。 -**argtype:**函数参数的类型。可以使用%TYPE或%ROWTYPE间接引用变量或表的类型。 -**expression:**参数的默认表达式。 -**rettype:**函数返回值的数据类型。 -如果存在OUT或INOUT参数,可以省略RETURNS子句。如果存在,该子句必须和输出参数所表示的结果类型一致:如果有多个输出参数,则为RECORD,否则与单个输出参数的类型相同。SETOF修饰词表示该函数将返回一个集合,而不是单独一项。与argtype相同,同样可以使用%TYPE或%ROWTYPE间接引用类型。 -**column_name:**字段名称。 -**column_type:**字段类型。 -**definition:**一个定义函数的字符串常量,含义取决于语言。 -它可以是一个内部函数名称、一个指向某个目标文件的路径、一个SQL查询、一个过程语言文本。 -**DETERMINISTIC:**SQL语法兼容接口,未实现功能,不推荐使用。 -**LANGUAGE lang_name:**用以实现函数的语言的名称。 -可以是SQL,internal,或者是用户定义的过程语言名称。 -**WINDOW:**表示该函数是窗口函数。 -替换函数定义时不能改变WINDOW属性。 -自定义窗口函数只支持LANGUAGE是internal,并且引用的内部函数必须是窗口函数。 -**IMMUTABLE:**表示该函数在给出同样的参数值时总是返回同样的结果。 -**STABLE:**表示该函数不能修改数据库,对相同参数值,在同一次表扫描里,该函数的返回值不变,但是返回值可能在不同SQL语句之间变化。 -**VOLATILE:**表示该函数值可以在一次表扫描内改变,因此不会做任何优化。 -**SHIPPABLE**|**NOT SHIPPABLE:**表示该函数是否可以下推执行。 -预留接口,不推荐使用。 -**FENCED**|**NOT FENCED:**声明用户定义的C函数是在保护模式还是非保护模式下执行。 -预留接口,不推荐使用。 -**PACKAGE:**表示该函数是否支持重载。PostgreSQL风格的函数本身就支持重载,此参数主要是针对其它风格的函数。 -不允许package函数和非package函数重载或者替换。 -package函数不支持VARIADIC类型的参数。 -不允许修改函数的package属性。 -**LEAKPROOF:**指出该函数的参数只包括返回值。 -LEAKPROOF只能由系统管理员设置。 -**CALLED ON NULL INPUT:**表明该函数的某些参数是NULL的时候可以按照正常的方式调用。 -该参数可以省略。 -**RETURNS NULL ON NULL INPUTSTRICT**STRICT:用于指定如果函数的某个参数是NULL,此函数总是返回NULL。 -如果声明了这个参数,当有NULL值参数时该函数不会被执行;而只是自动返回一个NULL结果。RETURNS NULL ON NULL INPUT和STRICT的功能相同。 -**EXTERNAL:**目的是和SQL兼容,是可选的,这个特性适合于所有函数,而不仅是外部函数。 -**SECURITY INVOKERAUTHID CURRENT_USER:**表明该函数将带着调用它的用户的权限执行。 -该参数可以省略。SECURITY INVOKER和AUTHID CURRENT_USER的功能相同。 -**SECURITY DEFINERAUTHID DEFINER:**声明该函数将以创建它的用户的权限执行。 -AUTHID DEFINER和SECURITY DEFINER的功能相同。 -**COST execution_cost:**用来估计函数的执行成本。execution_cost以cpu_operator_cost为单位。 -取值范围:正数 -**ROWS result_rows:**估计函数返回的行数。用于函数返回的是一个集合。 -取值范围:正数,默认值是1000行。 -**plsql_body**PL/SQL存储过程体。 -3.示例 -(1)兼容PostgreSQL风格 +# 1.函数的两种语法风格 +## (1)兼容PostgreSQL风格 + +``` +CREATE [ OR REPLACE ] FUNCTION function_name + [ ( [ { argname [ argmode ] argtype [ { DEFAULT | := | = } expression ]} [, ...] ] ) ] + [ RETURNS rettype [ DETERMINISTIC ] | RETURNS TABLE ( { column_name column_type } [, ...] )] + LANGUAGE lang_name + [ + {IMMUTABLE | STABLE | VOLATILE } + | {SHIPPABLE | NOT SHIPPABLE} + | WINDOW + | [ NOT ] LEAKPROOF + | {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT } + | {[ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | AUTHID DEFINER | AUTHID CURRENT_USER} + | {fenced | not fenced} + | {PACKAGE} + | COST execution_cost + | ROWS result_rows + | SET configuration_parameter { {TO | =} value | FROM CURRENT }} + ][...] + { + AS 'definition' + } +``` + +## (2)O风格 + +``` +CREATE [ OR REPLACE ] FUNCTION function_name + ( [ { argname [ argmode ] argtype [ { DEFAULT | := | = } expression ] } [, ...] ] ) + RETURN rettype [ DETERMINISTIC ] + [ + {IMMUTABLE | STABLE | VOLATILE } + | {SHIPPABLE | NOT SHIPPABLE} + | {PACKAGE} + | {FENCED | NOT FENCED} + | [ 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 + / +``` + +# 2.参数说明 + +- function_name:要创建的函数名称(可以用模式修饰)。
+ 取值范围:字符串,要符合标识符的命名规范,且最多为63个字符,若超过63个字符,数据库会截断并保留前63个字符当做函数名称。
+- argname:函数参数的名称。
+ 取值范围:字符串,要符合标识符的命名规范,且最多为63个字符,若超过63个字符,数据库会截断并保留前63个字符当做函数参数名称。
+- argmode:函数参数的模式。
+ 取值范围:IN,OUT,INOUT或VARIADIC。缺省值是IN。并且OUT和INOUT模式的参数不能用在RETURNS TABLE的函数定义中。VARIADIC用于声明数组类型的参数。
+- argtype:函数参数的类型。可以使用%TYPE或%ROWTYPE间接引用变量或表的类型。
+- expression:参数的默认表达式。
+- rettype:函数返回值的数据类型。
+ 如果存在OUT或INOUT参数,可以省略RETURNS子句。如果存在,该子句必须和输出参数所表示的结果类型一致:如果有多个输出参数,则为RECORD,否则与单个输出参数的类型相同。SETOF修饰词表示该函数将返回一个集合,而不是单独一项。与argtype相同,同样可以使用%TYPE或%ROWTYPE间接引用类型。
+- column_name:字段名称。
+- column_type:字段类型。
+- definition:一个定义函数的字符串常量,含义取决于语言。
+ 它可以是一个内部函数名称、一个指向某个目标文件的路径、一个SQL查询、一个过程语言文本。
+- DETERMINISTIC:SQL语法兼容接口,未实现功能,不推荐使用。
+ LANGUAGE lang_name:用以实现函数的语言的名称。
+ 可以是SQL,internal,或者是用户定义的过程语言名称。
+- WINDOW:表示该函数是窗口函数。
+ 替换函数定义时不能改变WINDOW属性。
+ 自定义窗口函数只支持LANGUAGE是internal,并且引用的内部函数必须是窗口函数。
+- IMMUTABLE:表示该函数在给出同样的参数值时总是返回同样的结果。
+- STABLE:表示该函数不能修改数据库,对相同参数值,在同一次表扫描里,该函数的返回值不变,但是返回值可能在不同SQL语句之间变化。
+- VOLATILE:表示该函数值可以在一次表扫描内改变,因此不会做任何优化。
+- SHIPPABLE|NOT SHIPPABLE:表示该函数是否可以下推执行。
+ 预留接口,不推荐使用。
+- FENCED|NOT FENCED:声明用户定义的C函数是在保护模式还是非保护模式下执行。
+ 预留接口,不推荐使用。
+- PACKAGE:表示该函数是否支持重载。PostgreSQL风格的函数本身就支持重载,此参数主要是针对其它风格的函数。
+ 不允许package函数和非package函数重载或者替换。
+- package函数不支持VARIADIC类型的参数。
+ 不允许修改函数的package属性。
+- LEAKPROOF:指出该函数的参数只包括返回值。
+- LEAKPROOF只能由系统管理员设置。
+- CALLED ON NULL INPUT:表明该函数的某些参数是NULL的时候可以按照正常的方式调用。
+ 该参数可以省略。
+- RETURNS NULL ON NULL INPUTSTRICT STRICT:用于指定如果函数的某个参数是NULL,此函数总是返回NULL。
+ 如果声明了这个参数,当有NULL值参数时该函数不会被执行;而只是自动返回一个NULL结果。RETURNS NULL ON NULL INPUT和STRICT的功能相同。
+- EXTERNAL:目的是和SQL兼容,是可选的,这个特性适合于所有函数,而不仅是外部函数。
+- SECURITY INVOKERAUTHID CURRENT_USER:表明该函数将带着调用它的用户的权限执行。
+ 该参数可以省略。SECURITY INVOKER和AUTHID CURRENT_USER的功能相同。
+- SECURITY DEFINERAUTHID DEFINER:**声明该函数将以创建它的用户的权限执行。
+- AUTHID DEFINER和SECURITY DEFINER的功能相同。
+- COST execution_cost:用来估计函数的执行成本。execution_cost以cpu_operator_cost为单位。
+ 取值范围:正数
+- ROWS result_rows:**估计函数返回的行数。用于函数返回的是一个集合。
+ 取值范围:正数,默认值是1000行。
+- plsql_body:PL/SQL存储过程体。
+ +# 3.示例
+## (1)兼容PostgreSQL风格
+ +``` CREATE FUNCTION func_add_sql(integer, integer) RETURNS integer AS 'select $1 + $2;' LANGUAGE SQL IMMUTABLE RETURNS NULL ON NULL INPUT; -(2)o风格 +``` + +## (2)o风格
+ +``` CREATE or replace FUNCTION func1(in a integer, out b integer) RETURN int AS c int; @@ -116,5 +132,8 @@ CREATE or replace FUNCTION func1(in a integer, out b integer) RETURN int return c; END; / -![image.png](https://cdn.nlark.com/yuque/0/2022/png/32435345/1664524047972-3dca4ace-202a-4770-bb4e-5af8bc3bc9da.png#clientId=u37a8719b-90ba-4&crop=0&crop=0&crop=1&crop=1&errorMessage=unknown%20error&from=paste&height=266&id=uc2f3d560&margin=%5Bobject%20Object%5D&name=image.png&originHeight=332&originWidth=905&originalType=binary&ratio=1&rotation=0&showTitle=false&size=155384&status=error&style=none&taskId=ucb50e9a2-ddd3-443b-894e-d7707fbc0f3&title=&width=724) +``` + +![输入图片说明](%E5%88%9B%E5%BB%BA%E5%87%BD%E6%95%B0.png) + diff --git "a/content/zh/post/wzr/\345\210\233\345\273\272\345\207\275\346\225\260.png" "b/content/zh/post/wzr/\345\210\233\345\273\272\345\207\275\346\225\260.png" new file mode 100644 index 0000000000000000000000000000000000000000..d2594b4d053a932f11f606bba441f71cd5a78a5e Binary files /dev/null and "b/content/zh/post/wzr/\345\210\233\345\273\272\345\207\275\346\225\260.png" differ