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;
/
-
+```
+
+
+
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