存储例程要么是过程要么是函数。存储例程是使用 CREATE PROCEDURE
和 CREATE FUNCTION
语句创建的(见 第 15.1.17 节,“CREATE PROCEDURE 和 CREATE FUNCTION 语句”)。过程使用 CALL
语句调用(见 第 15.2.1 节,“CALL 语句”),只能通过输出变量传回值。函数可以像其他函数一样从语句中调用(即,通过调用函数的名称),并可以返回标量值。存储例程的主体可以使用复合语句(见 第 15.6 节,“复合语句语法”)。
存储例程可以使用 DROP PROCEDURE
和 DROP FUNCTION
语句删除(见 第 15.1.29 节,“DROP PROCEDURE 和 DROP FUNCTION 语句”),并可以使用 ALTER PROCEDURE
和 ALTER 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(),和 多语句执行支持。
在存储过程中,某语句引用的用户变量的类型将在第一次调用过程时确定,并在随后每次调用过程时保留该类型。