相关文件10bet官方网站 本手册下载 从本手册中摘录

MySQL 8.0参考手册/存储的对象/存储程序的限制

25.8存储程序限制

这些限制适用于所描述的特征第25章,存储的对象

这里注意到的一些限制适用于所有存储的例程;这是存储过程和存储的函数。也有一些特定于存储函数的限制但不是存储程序。

存储函数的限制也适用于触发器。也有一些特定于触发的限制

存储过程的限制也适用于事件计划程序事件定义的条款。也有一些特定于事件的限制

存储例程中不允许SQL语句

存储例程不能包含任意SQL语句。不允许下列语句:

  • 锁语句锁定表打开表

  • 改变观点

  • 加载数据

  • SQL准备的陈述(准备执行Deallocate准备)可以用于存储过程,但不是存储的函数或触发器。因此,存储的函数和触发器不能使用动态SQL(将语句构造为字符串然后执行它们)。

  • 通常,在存储的程序中也不允许在SQL准备好语句中允许的语句。有关准备好陈述支持的语句列表,请参阅第13.5节,“书面陈述”.异常信号兽人, 和获取诊断,它不允许作为准备语句,但允许在存储程序中。

  • 因为局部变量只在存储程序执行时才在作用域内,所以在存储程序中创建的预处理语句中不允许引用它们。预备语句的作用域是当前会话,而不是存储的程序,因此该语句可以在程序结束后执行,此时变量将不再在作用域内。例如,选择……成local_var不能用作准备好的声明。该限制也适用于存储过程和功能参数。看到第13.5.1节,“PREPARE声明”

  • 在所有存储程序(存储过程和函数、触发器和事件)中,解析器处理开始[工作]作为一个开始......结束堵塞。在此上下文中开始交易,使用开始事务代替。

存储函数的限制

在存储函数中不允许使用以下附加语句或操作。存储过程中允许使用它们,但从存储函数或触发器中调用的存储过程除外。例如,如果您使用fl在存储过程中,无法从存储的函数或触发调用存储过程。

  • 执行显式或隐式提交或回滚的语句。SQL标准并不要求对这些语句的支持,它规定每个DBMS供应商可以决定是否允许它们。

  • 返回结果集的语句。这包括选择没有var_list如子句和其他语句显示解释, 和检查表.函数可以使用函数设置选择……成var_list或者用光标和拿来语句。看到第13.2.10.1节“选择......陈述”, 和第13.6.6节“游标”

  • fl语句。

  • 存储的功能不能递归地使用。

  • 存储的函数或触发器无法通过调用函数或触发器的语句来修改已使用的表(用于读取或写入)。

  • 如果您在不同别名下的存储功能中引用临时表,则不能重新打开表:'tbl_name.即使在函数内的不同语句中发生引用,也会发生错误。

  • 处理程序...阅读调用存储函数的语句可能导致复制错误,因此不允许使用。

对触发的限制

对于触发器,适用以下附加限制:

  • 触发器不会被外语操作激活。

  • 当使用基于行的复制时,复制上的触发器不会被源上的语句激活。在使用基于语句的复制时,副本上的触发器将被激活。有关更多信息,请参见第17.5.1.36条,“复制和触发器”

  • 返回语句在触发器中是不允许的,因为触发器不能返回值。要立即退出触发器,请使用离开陈述。

  • 表格中不允许触发器mysql数据库。也不允许他们上Information_Schema.或者performance_schema.表。这些表实际上是视图中的视图,视图上不允许触发。

  • 当基础对象的元数据发生更改时,触发器缓存不会检测到。如果触发器使用了一个表,并且自从触发器被加载到缓存后,该表已经发生了更改,那么触发器将使用过时的元数据进行操作。

在存储的例程中的名称冲突

相同的标识符可能用于例程参数,局部变量和表列。此外,相同的本地变量名称可用于嵌套块。例如:

创建过程p(i int)开始声明i int默认值0;选择我来自t;开始声明I int默认值1;选择我来自t;结尾;结尾;

在这种情况下,标识符是二义性的,适用以下优先规则:

  • 局部变量优先于例程参数或表列。

  • 例程参数优先于表列。

  • 内部块中的局部变量优先于外部块中的局部变量。

变量优先于表列的行为是非标准的。

复制考虑因素

使用存储例程可能导致复制问题。这一问题将在今后进一步讨论第25.7节“存储程序二进制记录”

- 普通话 - 野生Do-table =db_name.tbl_name.选项适用于表、视图和触发器。它不适用于存储过程和函数,或事件。要过滤操作后一个对象的语句,请使用- 一次性 - * - dB选项。

调试注意事项

没有存储的例程调试工具。

SQL:2003标准不支持的语法

MySQL存储例程语法是基于SQL:2003标准的。该标准的以下项目目前不支持:

  • 撤销处理程序

  • 循环

存储的常规并发考虑因素

为防止会话之间的交互问题,当客户端发出语句时,服务器使用可用于执行该语句的例程和触发器的快照。也就是说,服务器计算可以在执行语句期间使用的过程,函数和触发器列表,加载它们,然后继续执行该语句。虽然该语句执行,但它不会看到其他会话执行的例程更改。

对于最大并发性,存储功能应最大限度地减少其副作用;特别地,更新存储函数内的表可以减少该表上的并发操作。存储函数在执行之前获取表锁,以避免由于语句执行的顺序的不匹配而导致的二进制日志中的不一致状态,并且当它们出现在日志中时。使用基于语句的二进制记录时,将记录调用函数的语句,而不是在函数内执行的语句。因此,更新相同的底层表的存储函数不会并行执行。相比之下,存储过程不收购表级锁。在存储过程中执行的所有语句都将写入二进制日志,即使是基于语句的二进制日志记录。看到第25.7节“存储程序二进制记录”

事件调度程序限制

以下限制特定于事件调度程序:

  • 事件名称以不敏感的方式处理。例如,您不能使用同一数据库中的两个事件爱德和爱德和

  • 如果事件名称通过变量指定,则可能不会在存储的程序中创建,更改或删除事件。事件也可能无法创建,更改或删除存储的例程或触发器。

  • 事件的DDL语句被禁止锁定表语句生效。

  • 使用间隔进行事件计时一年25美分硬币, 和年_Month.在几个月内得到解决;使用任何其他间隔的那些是以秒为单位解决的。没有办法导致计划以在给定顺序执行的同一秒处发生的事件。另外 - 由于舍入,线程应用的性质,以及非零时间需要创建事件的事实以及信号执行事件可能会被延迟为1或2秒。但是,时间所示的时间Information_Schema.Events.表的LAST_EXECUTED列始终准确到实际事件执行时间的一秒内。(另见Bug#16522。)

  • 每个执行事件主体中包含的语句都在新连接中进行;因此,这些语句在服务器的语句计数上的给定用户会话中没有任何影响Com_selectcom_insert.显示的是显示状态.但是,这样的计数在全局范围内更新。(bug#16422)

  • 事件不支持unix epoch结束后的时间不支持;这大约是2038年的开始。事件调度程序特别不允许这样的日期。(bug#16396)

  • 对存储函数,用户定义的函数和表的引用引用按照时间表条款的创建事件改变事件不支持陈述。不允许使用这些引用。(有关更多信息,请参阅Bug#22830。)

存储例程和触发器在NDB集群

类的表支持存储过程、存储函数、触发器和计划事件NDB.存储引擎,您必须记住这些都这样做在充当群集SQL节点的MySQL服务器之间自动传播。这是因为存储的例程和触发定义存储在表中mysql系统数据库使用InnoDB表格,不会在群集节点之间复制。

必须通过运行适当的方式重新创建与MySQL群集表交互的任何存储的例程或触发器创建程序创建功能,或创建触发器在每个MySQL服务器上参与要使用存储的例程或触发器的群集的语句。同样,必须使用适当的情况下显式对现有存储例程或触发器的任何更改都明确执行改变,更改或者下降每个MySQL服务器上访问群集的语句。

警告

尝试通过转换任何内容来解决此问题mysql数据库表使用NDB.存储引擎。中的系统表mysql不支持数据库并且非常可能产生不良结果。