23.2.1 存储的常规语法

存储的例程可以是过程,也可以是函数。存储的例程是使用CREATE PROCEDURECREATE FUNCTION语句创建的(请参见第 13.1.16 节“ CREATE PROCEDURE 和 CREATE FUNCTION 语句”)。使用CALL语句(请参见第 13.2.1 节“ CALL 语句”)调用过程,并且只能使用输出变量传递回值。可以像其他任何函数一样从语句内部调用一个函数(即,通过调用该函数的名称),并且可以返回标量值。存储例程的主体可以使用复合语句(请参见第 13.6 节“复合语句”)。

可以使用DROP PROCEDUREDROP FUNCTION语句删除存储的例程(请参见第 13.1.27 节“ DROP PROCEDURE 和 DROP FUNCTION 语句”),并可以使用ALTER PROCEDUREALTER FUNCTION语句更改存储的例程(请参见第 13.1.6 节“ ALTER PROCEDURE 语句”)。

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

  • 调用该例程时,将执行隐式USE db_name(并且在例程终止时撤消)。不允许在存储例程中使用USE语句。

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

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

存储的函数不能递归。

存储过程中的递归是允许的,但默认情况下被禁用。要启用递归,请将max_sp_recursion_depth服务器系统变量设置为大于零的值。存储过程递归增加了对线程堆栈空间的需求。如果增加max_sp_recursion_depth的值,则可能有必要在服务器启动时通过增加thread_stack的值来增加线程堆栈的大小。有关更多信息,请参见第 5.1.7 节“服务器系统变量”

MySQL 支持一个非常有用的扩展,该扩展允许在存储过程中使用常规的SELECT语句(即,不使用游标或局部变量)。这种查询的结果集只是直接发送到 Client 端。多个SELECT语句生成多个结果集,因此 Client 端必须使用支持多个结果集的 MySQLClient 端库。这意味着 Client 端必须使用至少从 4.1 版本开始的 MySQL 版本的 Client 端库。Client 端在连接时还应指定CLIENT_MULTI_RESULTS选项。对于 C 程序,可以使用mysql_real_connect() C API 函数来完成。参见第 27.7.6.54 节,“ mysql_real_connect()”第 27.7.15 节“ C API 多语句执行支持”