在MySQL文档中,“程序”的范围是什么?

时间:2013-09-17 18:20:45

标签: mysql stored-procedures

特别是我在这里阅读exit handlers

  

handler_action值指示执行处理程序语句后处理程序执行的操作:   CONTINUE:继续执行当前程序。

这句话中“程序”的范围是什么?我可以提出更具体的问题,这应该回答:

  • 必须在存储过程或存储函数中吗?
  • 它是否仅适用于我正在执行的语句集,或者通过 驱动程序(如JDBC)中的一个execute语句,或作为块运行 在像MySQL Workbench这样的程序中?
  • 驱动程序是否有责任将一个程序与另一个程序分开?

我这里唯一的“线索”是declare的文档:

  

DECLARE只允许在BEGIN ... END复合语句中使用,并且必须在任何其他语句之前的开头。

至少暗示声明的处理程序的范围很紧,所以这不会污染整个连接。

我正在构思这个问题,因为我试图从选择,更新,插入和删除的SQL 101毕业,编写更复杂的,性能感知的任务。但是我发现的一个绊脚石是MySQL程序“是”的基础,除了一系列语句之外我很难理解。

1 个答案:

答案 0 :(得分:0)

此处使用的程序与“存储程序”的含义相同。

  

存储的程序包括以下对象:

     

存储例程,即存储过程 [存储]函数。使用CALL语句调用存储过程。过程没有返回值,但可以修改其参数以供调用者稍后检查。它还可以生成要返回给客户端程序的结果集。存储函数的使用方式与内置函数非常相似。您在表达式中调用它,并在表达式求值期间返回一个值。

     

触发器。触发器是一个命名的数据库对象,它与表关联,并在表发生特定事件时激活,例如插入或更新。

     

事件。事件是服务器根据计划运行的任务。

     

- http://dev.mysql.com/doc/refman/5.6/en/stored-programs-views.html

这排除了您作为查询可能执行的任何操作,包括服务器端预处理语句和multiple statement execution

稍微不准确,但总的来说,它认为存储过程具有最全面的功能,通常较少restrictions on the kinds of things you can do,但是4种类型的存储程序具有很多共性。

如果可以在不使用任何分号的情况下表达存储的程序,例如......

CREATE TRIGGER t1_ai AFTER INSERT ON t1 FOR EACH ROW DELETE FROM t2 WHERE t2.id = NEW.id;

...然后存储的程序不需要BEGIN / END块。几乎任何更复杂的内容基本上都是compound statement,并且必须被BEGIN / END包围,这是唯一可以使用HANDLER的地方。

这些块可以嵌套在单个存储程序的主体中,除了最简单的情况外,每个存储的程序至少有一个 - 最外层的程序。

HANDLER的范围是最外面的块,它包含处理程序的声明,以及该块中没有可以捕获条件的处理程序的任何块。在任何情况下,处理程序都不能捕获在声明它的块的开始之前或结束之后发生的条件。

HANDLER的范围包括程序在处理程序处于范围内时所执行的任何操作,其中可能包括调用其他存储过程或没有其处理程序的函数拥有相同的条件。

CONTINUE处理程序因指定的条件发生而触发时,执行处理程序声明(见下文)指定的语句,然后程序执行继续,优雅地继续执行语句后的下一个语句导致异常的地方,无论发生在哪里。当然,这里的约束是它只能在处理程序在范围内的某个地方。严格地使用其他不必要的BEGIN / END块并不常见,只是为了将处理程序保留在单个语句或少量语句的范围内,当它不适合处理程序时徘徊并抓住不应被抓住的条件。

CONTINUE处理程序相反,当EXIT处理程序触发时,执行处理程序指定的语句(见下文),然后在END之后继续执行程序声明处理程序的块的底部。如果这是过程结束时的END,则过程会正常终止,因为错误是由处理程序处理的。如果该过程由另一个过程调用,则控制权返回到调用过程。

无论哪种方式,处理程序在适当的点继续执行之前执行“语句”。 “声明”可以很简单,

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @something_happened = 1;

或复合(带有BEGIN / END)。

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN SET @foo = 1; DELETE FROM t1; ROLLBACK; END;

在前一种情况下,简单语句有时用于设置在其他地方编码的变量,以后可用于检测条件发生并在适当的时间做出相应的反应,而不是在处理程序时立即做出反应火灾。