db2 删除存储过程_23.2 存储过程和函数的使用

9b261812700793ead57cfc282378ee9f.png

参考官方文档:

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节“更改过程”) 句法”)。

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

  • 调用例程时,将执行隐式USE db_name(并在例程终止时撤消)。 不允许存储例程中的USE语句。
  • 您可以使用数据库名称限定例程名称。 这可以用于引用当前数据库中不存在的例程。 例如,要调用与test数据库相关的存储过程p或函数f,可以使用CALL test.p()或test.f()。
  • 删除数据库时,也会删除与其关联的所有存储例程。

存储的函数不能递归。

允许存储过程中的递归,但默认情况下禁用。 要启用递归,请将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授权系统将存储的例程考虑在内,如下所示:

  • 创建存储例程需要CREATE ROUTINE特权。
  • 需要ALTER ROUTINE权限才能更改或删除存储例程。如有必要,此权限将自动授予例程的创建者,并在例程被删除时从创建者中删除。
  • 执行存储例程需要EXECUTE特权。此特权将自动授予例程的创建者(并在例程被删除时从创建者中删除)。此外,例程的默认SQL SECURITY特性是DEFINER,它允许有权访问与例程关联的数据库的用户执行例程。
  • 如果automatic_sp_privileges系统变量为0,则不会自动向例程创建者授予EXECUTE和ALTER ROUTINE权限。
  • 例程的创建者是用于为其执行CREATE语句的帐户。这可能与例程定义中DEFINER命名的帐户不同。

服务器操作mysql.proc表以响应创建,更改或删除存储例程的语句。 服务器不支持手动操作此表。

23.2.3存储例程元数据

有关存储例程的元数据可以通过以下方式获得:

  • 查询INFORMATION_SCHEMA数据库的ROUTINES表。
  • 使用SHOW CREATE PROCEDURE和SHOW CREATE FUNCTION语句查看例程定义。
  • 使用SHOW PROCEDURE STATUS和SHOW FUNCTION STATUS语句查看常规特性。

23.2.4 存储过程,函数,触发器和LAST_INERT_ID()

在存储例程(过程或函数)或触发器的主体内,LAST_INSERT_ID()的值的更改方式与在这些类型的对象体外执行的语句的更改方式相同。 存储的例程或触发器对以下语句所看到的LAST_INSERT_ID()值的影响取决于例程的类型:

  • 如果存储过程执行更改LAST_INSERT_ID()值的语句,则更改的值将由过程调用之后的语句看到。
  • 对于更改值的存储函数和触发器,当函数或触发器结束时,将恢复该值,因此后续语句不会看到更改的值。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值