CREATE PROCEDURE¶
CREATE PROCEDURE语句用于在当前 Schema 中创建用户定义的过程(User-Defined Procedure,简称 UDP)。所有 UDP 必须是命名过程。
执行该语句的用户即为新创建的 UDP 的所有者。创建成功后,UDP 的所有者可以执行调用、修改或删除 UDP 等操作。UDP 的所有权可以通过执行 ALTER OWNER 语句转移给其他用户。
Note
对非默认 Schema 或其中的对象执行操作时,用户既要通过隐式访问规则或显式USAGE授权获得该 Schema 的访问权,也要具备目标操作所需的权限。Schema 访问校验和目标操作所需的权限校验相互独立,满足其中一项不能替代另一项。Schema 访问控制不适用于临时图、内置 Procedure 和内置 Function。更多信息,请参见 Schema 访问控制。
前提条件¶
若要创建 UDP,必须具备在当前 Schema 执行CREATE PROCEDURE操作的权限。更多信息,请参见角色与权限。
语法¶
- create_procedure_statement
- parameter_declaration
- returns_clause
create_procedure_statement ::=
'CREATE' (('PROCEDURE' ('IF NOT EXISTS')?) | ('OR REPLACE' 'PROCEDURE')) procedure_name '(' ( parameter_declaration ( ',' parameter_declaration )* )? ')' returns_clause? ('COMMENT' comment_string)? 'AS'? '{' procedure_body '}'
parameter_declaration ::=
parameter_name parameter_type ('DEFAULT' default_value )?
returns_clause ::=
'RETURNS' '(' ')'
| 'RETURNS' return_name return_type
| 'RETURNS' '(' return_name return_type (',' return_name return_type )+ ')'
参数¶
IF NOT EXISTS¶
该子句会检查是否已经存在同名的 UDP。如果已存在,但无法重载,则不会创建 UDP,也不会抛出异常。
若不指定该子句,且已经存在同名 UDP,且无法重载,则会抛出异常。
OR REPLACE¶
该子句会替换现有 UDP 的定义。如果 UDP 不存在,则会创建一个新的 UDP。
注意,在使用该子句时,不能更改现有 UDP 的名称、输入参数和输出参数。
procedure_name¶
待创建的 UDP 的名称。
procedure_name必须是一个标识符。更多信息,请参见标识符命名规则。
Note
尽管在执行CREATE PROCEDURE时必须为 UDP 指定唯一名称,若您通过加载过程插件的方式往悦数图数据库开发版添加 UDP,则仍可能在同一个 Schema 出现同名的 UDP。若同名 UDP 被调用,则优先执行由插件定义的 UDP。
支持重载。只要调用时不出现冲突,您可以创建多个同名,但输入参数不同的 UDP。更多信息,请参见重载 UDP。
parameter_name¶
UDP 接受的输入参数的名称。同一个 UDP 的所有入参的名称必须唯一。
parameter_name必须是一个标识符。更多信息,请参见标识符命名规则。
parameter_type¶
UDP 的输入参数类型,可以是普通值类型、图元素引用类型或表类型。
- 关于数据类型的更多信息,请参见数据类型。
- 当指定图元素引用类型时,语法为
parameter_name NODE或parameter_name EDGE,分别表示该参数接受点引用值或边引用值。 - 当指定表类型时,语法为
parameter_name TABLE,表示该参数接受传入表变量。
default_value¶
输入参数的默认值。默认值必须是一个常量。更多信息,请参见常量表达式。
注意,带默认值的参数必须从右到左指定。例如,test(a STRING, b STRING DEFAULT 'Hello')是有效的,而test(a STRING DEFAULT 'Hello', b STRING)是无效的。
return_name¶
UDP 返回的输出参数的名称。同一个 UDP 的所有出参的名称必须唯一。输出参数的数量必须与procedure_body返回的字段数量相同。
return_name必须是一个标识符。更多信息,请参见标识符命名规则。
return_type¶
UDP 的输出参数的数据类型。更多信息,请参见数据类型。
comment_string¶
UDP 的描述。描述必须是一个字符串字面量,且用双引号(")或单引号(')包围。更多信息,请参见字符串字面量。
procedure_body¶
UDP 的处理逻辑。更多信息,请参见过程体。
示例¶
以下示例基于示例数据集。
创建无入参的 UDP¶
CREATE PROCEDURE test1() RETURNS ret INT AS { RETURN 1 }
创建带单个入参的 UDP¶
'''
// 创建一个入参为整数类型的 UDP
CREATE OR REPLACE PROCEDURE set_proc_param_test1 (a INT) RETURNS r INT {
SET a = a + 1
RETURN a
}
'''
'''
// 创建一个入参为点类型的 UDP
CREATE OR REPLACE PROCEDURE set_proc_param_node (a NODE) RETURNS r INT { RETURN 1 }
'''
'''
// 创建一个入参为边类型的 UDP
CREATE OR REPLACE PROCEDURE set_proc_param_edge (a EDGE) RETURNS r INT { RETURN 1 }
'''
'''
// 创建一个入参为表类型的 UDP
CREATE OR REPLACE PROCEDURE set_proc_param_table (a TABLE) RETURNS r INT { RETURN size(a) AS r }
'''
创建带多个入参的 UDP¶
CREATE PROCEDURE test2(a INT DEFAULT 100, b STRING DEFAULT 'test2') RETURNS ret INT AS { RETURN a }
创建无出参的 UDP¶
'''
// 方法 1
CREATE PROCEDURE test3(a INT, b STRING) RETURNS () AS { LET y = 2 FINISH }
'''
'''
// 方法 2
CREATE PROCEDURE test3(a INT, b STRING) AS { LET y = 2 FINISH }
'''
创建带多个出参的 UDP¶
CREATE PROCEDURE test4(a INT, b STRING) RETURNS (x INT, y STRING) AS { RETURN a, b }
替换现有 UDP¶
CREATE OR REPLACE PROCEDURE test1() RETURNS ret INT COMMENT 'test function 1' AS { RETURN 2 }
重载 UDP¶
CREATE PROCEDURE test(a INT) RETURNS ret INT AS { RETURN a }
CREATE PROCEDURE test(a INT, b STRING) AS { FINISH }
CREATE PROCEDURE test(a INT, b INT) RETURNS ret INT AS { RETURN b }
CREATE PROCEDURE test(a INT16, b INT32) RETURNS ret INT AS { RETURN a+b }
上述语句创建了 4 个名为test的 UDP,但各个 UDP 的输入参数不同。
创建一个更新图的 UDP¶
CREATE OR REPLACE PROCEDURE update_name (n STRING) RETURNS () { USE movie MATCH (v@Actor {id: 1608}) SET v.name = n }
上述语句创建了一个名为update_name的 UDP,该 UDP 将 ID 为1608的点的名称更新为输入参数n的值。