Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Stored Routine Syntax

27.2.1 存储例程语法

存储例程要么是过程要么是函数。存储例程是使用 CREATE PROCEDURECREATE FUNCTION 语句创建的(见 第 15.1.17 节,“CREATE PROCEDURE 和 CREATE FUNCTION 语句”)。过程使用 CALL 语句调用(见 第 15.2.1 节,“CALL 语句”),只能通过输出变量传回值。函数可以像其他函数一样从语句中调用(即,通过调用函数的名称),并可以返回标量值。存储例程的主体可以使用复合语句(见 第 15.6 节,“复合语句语法”)。

存储例程可以使用 DROP PROCEDUREDROP FUNCTION 语句删除(见 第 15.1.29 节,“DROP PROCEDURE 和 DROP FUNCTION 语句”),并可以使用 ALTER PROCEDUREALTER FUNCTION 语句修改(见 第 15.1.7 节,“ALTER PROCEDURE 语句”)。

存储过程或函数与特定的数据库关联。这有几个含义:

  • 当例程被调用时,会隐式执行 USE db_name 语句(并在例程终止时撤销)。USE 语句在存储例程中不允许。

  • 你可以使用数据库名称限定例程名称。这可以用来引用不是当前数据库的例程。例如,要调用与 test 数据库关联的存储过程 p 或函数 f,可以说 CALL test.p()test.f()

  • 当数据库被删除时,与其关联的所有存储例程也将被删除。

存储函数不能递归。

存储过程递归是允许的,但默认情况下是禁用的。要启用递归,设置 max_sp_recursion_depth 服务器系统变量的值大于零。存储过程递归增加了线程栈空间的需求。如果你增加 max_sp_recursion_depth 的值,可能需要在服务器启动时增加 thread_stack 的值。见 第 7.1.8 节,“服务器系统变量”,以获取更多信息。

MySQL 支持一个非常有用的扩展,允许在存储过程中使用常规 SELECT 语句(即,不使用游标或局部变量)。这样的查询结果集将直接发送到客户端。多个 SELECT 语句生成多个结果集,因此客户端必须使用支持多个结果集的 MySQL 客户端库。客户端还必须在连接时指定 CLIENT_MULTI_RESULTS 选项。对于 C 程序,可以使用 mysql_real_connect() C API 函数。见 mysql_real_connect(),和 多语句执行支持

在存储过程中,某语句引用的用户变量的类型将在第一次调用过程时确定,并在随后每次调用过程时保留该类型。