BEGIN ... END复合语句
[begin_label:]BEGIN [statement_list]END [end_label]
BEGIN ... END
语法用于编写复合语句,复合语句可以出现在存储程序(存储过程和函数,触发器和事件)中。复合语句可以包含多个语句,BEGIN
并用和END
关键字括起来。statement_list
表示一个或多个语句的列表,每个语句以分号(;
)语句定界符终止。在statement_list
本身是可选的,所以空复合语句(BEGIN END
)是合法的。
BEGIN ... END
块可以嵌套。
使用多个语句要求客户端能够发送包含;
语句定界符的语句字符串。在mysql命令行客户端中,这是通过delimiter
命令处理的。将;
语句结尾定界符更改为(例如//
);
可以在程序主体中使用。有关示例,请参见“定义存储程序”。
BEGIN ... END
可以标记一个块。
[NOT] ATOMIC
不支持 optional 子句。这意味着在指令块的开始处未设置任何事务保存点,并且BEGIN
在此上下文中使用的子句对当前事务没有影响。
在所有存储的程序中,解析器将BEGIN[WORK]
视为BEGIN ... END
块的开始。要在这种情况下开始交易,请START TRANSACTION
改用。
语句标签
[begin_label:]BEGIN [statement_list]END [end_label] [begin_label:]LOOP statement_listEND LOOP [end_label] [begin_label:]REPEAT statement_listUNTIL search_conditionEND REPEAT [end_label] [begin_label:]WHILE search_conditionDO statement_listEND WHILE [end_label]
标签被允许BEGIN ... END
块和对LOOP
,REPEAT
和WHILE
语句。这些语句的标签使用遵循以下规则:
begin_label
必须在冒号后面。begin_label
可以不带给出end_label
。如果end_label
存在,则必须与相同begin_label
。end_label
没有不能给予begin_label
。- 同一嵌套级别的标签必须不同。
- 标签最多可包含16个字符。
要引用带标签的构造中的标签,请使用ITERATE
或LEAVE
语句。下面的示例使用这些语句继续迭代或终止循环:
CREATE PROCEDURE doiterate(p1 INT)BEGIN label1:LOOP SET p1 = p1 + 1;IF p1 < 10THEN ITERATE label1;END IF ;LEAVE label1;END LOOP label1;END ;
块标签的范围不包括在块内声明的处理程序的代码。有关详细信息,请参见“ DECLARE ... HANDLER语句”。
DECLARE声明
该DECLARE
语句用于定义程序本地的各种项目:
DECLARE
仅允许在BEGIN ... END
复合语句内部使用,并且必须在复合语句的开始处以及其他任何语句之前。
声明必须遵循一定顺序。游标声明必须出现在处理程序声明之前。变量和条件声明必须出现在游标或处理程序声明之前。