Source: https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/procedures/create/ Documentation version: v5.3.2 # CREATE PROCEDURE `CREATE PROCEDURE`语句用于在当前 Schema 中创建用户定义的过程(User-Defined Procedure,简称 UDP)。所有 UDP 必须是命名过程。 执行该语句的用户即为新创建的 UDP 的所有者。创建成功后,UDP 的所有者可以执行[调用](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/call/call-procedure/)、[修改](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/procedures/alter/)或[删除](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/procedures/drop/) UDP 等操作。UDP 的所有权可以通过执行 [ALTER OWNER](https://dev-docs.yueshu.com.cn/v5.3.2/server-admin/authorization/alter-owner/) 语句转移给其他用户。 Note 对非默认 Schema 或其中的对象执行操作时,用户既要通过隐式访问规则或显式`USAGE`授权获得该 Schema 的访问权,也要具备目标操作所需的权限。Schema 访问校验和目标操作所需的权限校验相互独立,满足其中一项不能替代另一项。Schema 访问控制不适用于临时图、内置 Procedure 和内置 Function。更多信息,请参见 [Schema 访问控制](https://dev-docs.yueshu.com.cn/v5.3.2/server-admin/authorization/schema-access-control/)。 ## 前提条件 若要创建 UDP,必须具备在当前 Schema 执行`CREATE PROCEDURE`操作的权限。更多信息,请参见[角色与权限](https://dev-docs.yueshu.com.cn/v5.3.2/server-admin/authorization/)。 ## 语法 语法图源码 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`必须是一个标识符。更多信息,请参见[标识符命名规则](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/overview/keywords-identifiers/)。 Note 尽管在执行`CREATE PROCEDURE`时必须为 UDP 指定唯一名称,若您通过加载过程插件的方式往悦数图数据库开发版添加 UDP,则仍可能在同一个 Schema 出现同名的 UDP。若同名 UDP 被调用,则优先执行由插件定义的 UDP。 支持[重载](https://zh.wikipedia.org/wiki/%E5%87%BD%E6%95%B0%E9%87%8D%E8%BD%BD)。只要调用时不出现冲突,您可以创建多个同名,但输入参数不同的 UDP。更多信息,请参见[重载 UDP](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/procedures/create/#udp_5)。 ### `parameter_name` UDP 接受的输入参数的名称。同一个 UDP 的所有入参的名称必须唯一。 `parameter_name`必须是一个标识符。更多信息,请参见[标识符命名规则](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/overview/keywords-identifiers/)。 ### `parameter_type` UDP 的输入参数类型,可以是普通值类型、图元素引用类型或[表类型](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/data-types/table-type/)。 - 关于数据类型的更多信息,请参见[数据类型](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/data-types/)。 - 当指定[图元素引用类型](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/data-types/graph-element-reference-type/)时,语法为`parameter_name NODE`或`parameter_name EDGE`,分别表示该参数接受点引用值或边引用值。 - 当指定[表类型](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/data-types/table-type/)时,语法为`parameter_name TABLE`,表示该参数接受传入表变量。 ### `default_value` 输入参数的默认值。默认值必须是一个常量。更多信息,请参见[常量表达式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/expressions/constant/)。 注意,带默认值的参数必须从右到左指定。例如,`test(a STRING, b STRING DEFAULT 'Hello')`是有效的,而`test(a STRING DEFAULT 'Hello', b STRING)`是无效的。 ### `return_name` UDP 返回的输出参数的名称。同一个 UDP 的所有出参的名称必须唯一。输出参数的数量必须与`procedure_body`返回的字段数量相同。 `return_name`必须是一个标识符。更多信息,请参见[标识符命名规则](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/overview/keywords-identifiers/)。 ### `return_type` UDP 的输出参数的数据类型。更多信息,请参见[数据类型](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/data-types/)。 ### `comment_string` UDP 的描述。描述必须是一个字符串字面量,且用双引号(`"`)或单引号(`'`)包围。更多信息,请参见[字符串字面量](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/literals/#_6)。 ### `procedure_body` UDP 的处理逻辑。更多信息,请参见[过程体](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/procedures/#_3)。 ## 示例 以下示例基于[示例数据集](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/overview/example-dataset/)。 ### 创建无入参的 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`的值。 ## 更多信息 - [DESCRIBE PROCEDURE](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/data-admin/describe/describe-proc/) - [SHOW PROCEDURES](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/data-admin/show/show-procedures/) - [调用命名过程](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/call/call-procedure/) - [调用内联过程](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/call/call-inline-procedure/)