文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  存储例程语法

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 客户端库。这意味着客户端必须使用至少与 4.1 一样新的 MySQL 版本的客户端库。客户端在连接时还应指定 CLIENT_MULTI_RESULTS 选项。对于 C 程序,可以使用 mysql_real_connect() C API 函数完成此操作。请参阅 mysql_real_connect()多语句执行支持

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