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

27.2.1 存储例程语法

存储例程是一种过程或函数。存储例程使用CREATE PROCEDURECREATE FUNCTION语句创建(见第15.1.17节,“CREATE PROCEDURE and CREATE FUNCTION Statements”)。过程使用CALL语句调用(见第15.2.1节,“CALL Statement”),只能通过输出变量返回值。函数可以像任何其他函数一样在语句中调用,并返回标量值。存储例程的体可以使用复合语句(见第15.6节,“Compound Statement Syntax”)。

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

存储例程与特定的数据库相关联。这有几个重要的含义:

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

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

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

存储函数不能是递归的。

存储过程中的递归是允许的,但默认情况下是禁用的。要启用递归,请将max_sp_recursion_depth 服务器系统变量设置为一个大于零的值。存储过程中的递归增加了对线程堆栈空间的需求。如果您增加了max_sp_recursion_depth的值,可能需要在服务器启动时增加线程堆栈大小 bằng增加thread_stack的值。请参阅第7.1.8节,“服务器系统变量”,了解更多信息。

MySQL 支持在存储过程中使用常规SELECT 语句(即不使用游标或本地变量)。结果集将直接发送给客户端。多个SELECT 语句生成多个结果集,因此客户端必须使用支持多个结果集的 MySQL 客户端库。这意味着客户端必须使用至少 MySQL 4.1 的版本。客户端也应在连接时指定 CLIENT_MULTI_RESULTS 选项。对于 C 程序,可以使用mysql_real_connect() C API 函数。请参阅mysql_real_connect(),和多语句执行支持

用户变量在存储过程中被引用时,它的类型将在第一次调用过程时确定,并且在后续调用过程时保持该类型。