存储的常规语法
存储例程可以是过程,也可以是函数。使用CREATE PROCEDURE
和CREATE FUNCTION
语句创建存储的例程(请参见“ CREATE PROCEDURE和CREATE FUNCTION语句”)。使用CALL
语句调用过程(请参见“ CALL语句”),并且只能使用输出变量传回值。可以像其他任何函数一样从语句内部调用一个函数(即,通过调用该函数的名称),并且可以返回标量值。存储例程的主体可以使用复合语句(请参见“复合语句”)。
可以使用DROP PROCEDURE
和DROP FUNCTION
语句删除存储的例程(请参见“ DROP PROCEDURE和DROP FUNCTION语句”),并可以使用ALTER PROCEDURE
和ALTER FUNCTION
语句对其进行更改(请参见“ ALTER PROCEDURE语句”)。
存储过程或函数与特定数据库相关联。这有几个含义:
- 调用例程时,将执行隐式操作(例程终止时撤消操作)。不允许在存储的例程中使用语句。
USE db_name
USE
- 您可以使用数据库名称来限定例程名称。这可以用来引用不在当前数据库中的例程。例如,要调用与数据库关联的存储过程
p
或函数f
,test
可以说CALL test.p()
或test.f()
。 - 删除数据库时,所有与之关联的存储例程也将删除。
存储的函数不能递归。
存储过程中的递归是允许的,但默认情况下被禁用。要启用递归,请将max_sp_recursion_depth
服务器系统变量设置为大于零的值。存储过程递归增加了对线程堆栈空间的需求。如果增加的值max_sp_recursion_depth
,则可能有必要通过增加thread_stack
服务器启动时的值来增加线程堆栈的大小。有关更多信息,请参见“服务器系统变量”。
MySQL支持一个非常有用的扩展,该扩展允许在SELECT
存储过程内部使用正则语句(即,不使用游标或局部变量)。此类查询的结果集只是直接发送到客户端。多个SELECT
语句生成多个结果集,因此客户端必须使用支持多个结果集的MySQL客户端库。这意味着客户端必须使用至少从4.1开始的MySQL版本的客户端库。客户端CLIENT_MULTI_RESULTS
在连接时还应指定选项。对于C程序,可以使用mysql_real_connect()
C API函数来完成。请参见“ mysql_real_connect()”和“ C API多语句执行支持”。