Source: https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/procedures/ Documentation version: v5.3.2 # 过程概述 本文介绍 GQL 中的过程(Procedure)的定义、类型及使用方法。 ## 过程定义 在 GQL 中,过程是对一段计算过程的描述,其执行会计算出执行结果,并可能造成数据对象的修改。使用过程的主要目的是封装复杂的逻辑,简化查询过程,提高通用计算的重用性,从而提高操作效率。 ## 过程体 每个过程都有一个过程体,其描述了过程的处理逻辑。过程体的语法如下: 语法图源码 procedure_body ```` procedure_body ::= (variable_definition+)? statement_block+ ```` 如语法所示,过程体由零或多个的变量定义,和一条或多条按顺序执行的语句块组成。只有最后一个语句块的输出会作为过程体的结果返回。 关于过程体中的语句,注意以下规则: - 只有过程体中的最后一条语句可以用`RETURN`语句结尾。 - 只有当其返回通过关键字`NEXT`被后续语句使用时,非最后一条语句中才可以出现`RETURN`语句。 - 若要提前终止语句且不返回任何结果,可使用`FINISH`。 过程体中的参数解释如下: ### `variable_definition` 在过程中使用的变量的定义。变量可以是以下类型之一: - [原始值变量](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/variable-definition/value-variable/) - [聚合值变量](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/variable-definition/agg/) - [活动集变量](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/variable-definition/active-set-variable/) - [图变量](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/variable-definition/graph-variable/) - [表变量](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/variable-definition/table-variable/) - [文件变量](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/variable-definition/file-variable/) 当在过程体中使用时,点绑定聚合值变量和活动集变量只能对过程所调用的单个临时图进行操作。 更多信息,请参见[变量](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/variable-definition/)。 ### `statement_block` 一个包含一条或多条按顺序执行的语句的语句块。语句可以是以下类型之一: - [数据定义语句](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/ddl/) - [数据操作语句](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dml/) - [数据查询语句](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/) - [匹配计算语句](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/match-compute/) - [控制流语句](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/control-flow/) - `WHILE` - `IF` - `BREAK` - `CONTINUE` - [变量操作语句](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/set/) - 导入导出语句 - [IMPORT](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/in-out/import/) - [EXPORT](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/in-out/export/) - [日志语句](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/log/) 当在过程体中使用匹配计算语句时,该语句只能对过程所调用的单个临时图进行操作。 当在过程体中使用`WHILE`语句时,注意以下规则: - `WHILE`循环不得返回任何结果。也即,它不得包含任何`RETURN`语句。 - 要将值传递出`WHILE`循环,可以更新变量并使用`BREAK`跳出循环。 - 要生成最终结果,可以在`WHILE`循环之后添加`RETURN`语句 当在过程体中使用`IF`语句时,注意以下规则: - 如果`IF`块是过程体中的最后一条语句,其分支可以使用`RETURN`语句来生成结果。 - 如果`IF`块不是过程体中的最后一条语句,其分支不得以`RETURN`语句结尾。此时,可以在分支内更新变量。 更多信息,请参见[语句块](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/statement-block/)。 ## 过程类型 根据数据或数据结构是否被修改,过程可以分为: - 修改数据结构的过程:修改数据结构。例如,创建图、删除图、创建标签、删除标签等。 - 修改数据的过程:修改数据。例如,插入数据、删除数据、更新数据等。 - 检索过程:不修改数据,只返回结果。例如,查询数据、计算数据等。 在 GQL 中,过程根据定义和使用方法的不同,分为两种类型:命名过程和内联过程。 ### 命名过程 命名过程是在 GQL Catalog 中定义了过程体,并可以通过过程名称引用的过程。它适用于通用的、可重用的查询。 悦数图数据库开发版提供了一组内置的命名过程,同时允许您定义自己的命名过程。 #### 内置过程 要查看完整的内置过程列表,可运行`SHOW PROCEDURES`语句。更多信息,请参见 [SHOW PROCEDURES](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/data-admin/show/show-procedures/)。有关内置过程、与其对应的`SHOW`、`KILL`等命令及调用方式的更多信息,请参见[内置命名过程](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/procedures/built-in/)。 #### 用户定义过程 您可以用 GQL 创建用户定义过程(User-Defined Procedure,简称 UDP)。更多信息,请参见 [CREATE PROCEDURE](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/procedures/create/) 学习如何创建 UDF。 ### 内联过程 内联过程是在 GQL 查询中直接定义和使用过程体的过程,不需要像命名过程一样在 Catalog 中预定义。适合临时或特定的查询。 目前,内联过程的过程体中不能包含任何 DDL 或 DML 语句。 ## 用法 子句`CALL`用于调用过程。 - 命名过程:通过引用过程的名称调用过程。例如: ```` ''' CALL show_graphs() RETURN * ''' ```` 更多信息,请参见[使用 CALL 调用命名过程](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/call/call-procedure/)。 - 内联过程:在查询语句中直接定义和使用过程。例如: ```` ''' LET a = 1, b = 2 CALL { LET c = 3 RETURN c + 1 AS d } RETURN d ''' ```` 更多信息,请参见[使用 CALL 调用内联过程](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/call/call-inline-procedure/)。