首页 > 数据库 > > 23.2 存储过程和函数的使用
参考官方文档:
https://dev.mysql.com/doc/refman/5.7/en/stored-routines.html
MySQL支持存储的例程(过程和函数)。 存储例程是一组可以存储在服务器中的SQL语句。 完成此操作后,客户端不需要继续重新发布单个语句,但可以引用存储的例程。
存储例程需要mysql数据库中的proc表。 此表是在MySQL安装过程中创建的。 如果要从早期版本升级到MySQL 5.7,请更新权限表确保proc表存在。
存储例程在某些情况下特别有用:
存储的例程可以提高性能,因为需要在服务器和客户端之间发送较少的信息。 权衡的是,这确实增加了数据库服务器上的负载,因为更多的工作是在服务器端完成的,而在客户端(应用程序)端完成的工作则更少。 如果许多客户端计算机(例如Web服务器)仅由一个或几个数据库服务器提供服务,请考虑这一点。
存储的例程还使您可以在数据库服务器中拥有函数库。 这是现代应用程序语言共享的一项功能,可在内部实现此类设计(例如,通过使用类)。 即使在数据库使用范围之外,使用这些客户端应用程序语言功能对程序员也是有益的。
23.2.1 存储例程 语法
存储例程是过程或函数。 使用CREATE PROCEDURE和CREATE FUNCTION语句创建存储例程。 使用CALL语句调用过程,并且只能使用输出变量传回值。 可以从语句内部调用函数,就像任何其他函数一样(即通过调用函数的名称),并且可以返回标量值。 存储例程的主体可以使用复合语句。
可以使用DROP PROCEDURE和DROP FUNCTION语句删除存储的例程(请参见第13.1.27节“DROP PROCEDURE和DROP FUNCTION语法”),并使用ALTER PROCEDURE和ALTER FUNCTION语句进行更改(请参见第13.1.6节“更改过程”) 句法”)。
存储过程或函数与特定数据库相关联。 这有几个意义:
存储的函数不能递归。
允许存储过程中的递归,但默认情况下禁用。 要启用递归,请将max_sp_recursion_depth服务器系统变量设置为大于零的值。 存储过程递归增加了对线程堆栈空间的需求。 如果增加max_sp_recursion_depth的值,可能需要通过在服务器启动时增加thread_stack的值来增加线程堆栈大小。
MySQL支持一个非常有用的扩展,它允许在存储过程中使用常规SELECT语句(即,不使用游标或局部变量)。 这种查询的结果集只是直接发送到客户端。 多个SELECT语句生成多个结果集,因此客户端必须使用支持多个结果集的MySQL客户端库。 这意味着客户端必须使用MySQL版本的客户端库,至少与4.1版本一样。 客户端还应在连接时指定CLIENT_MULTI_RESULTS选项。 对于C程序,可以使用mysql_real_connect()完成
23.2.2 存储例程和mysql 权限
MySQL授权系统将存储的例程考虑在内,如下所示:
服务器操作mysql.proc表以响应创建,更改或删除存储例程的语句。 服务器不支持手动操作此表。
23.2.3存储例程元数据
有关存储例程的元数据可以通过以下方式获得:
23.2.4 存储过程,函数,触发器和LAST_INERT_ID()
在存储例程(过程或函数)或触发器的主体内,LAST_INSERT_ID()的值的更改方式与在这些类型的对象体外执行的语句的更改方式相同。 存储的例程或触发器对以下语句所看到的LAST_INSERT_ID()值的影响取决于例程的类型:
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69946831/viewspace-3143832/ ,如需转载,请注明出处,否则将追究法律责任。