PL 语法结构
存储程序的语法主要包括 BEGIN ... END 块、DECLARE 声明和语句标签三个部分。
BEGIN ... END 块
BEGIN ... END 块支持复合语句,用于编写存储程序(存储过程、存储函数和触发器)。
BEGIN ... END 复合语句可以包含多个语句,并用 BEGIN 和 END 关键字括起来。语法如下:
[begin_label:] BEGIN
[statement_list]
END [end_label]
其中,statement_list 表示一个或多个语句的列表,每个语句以分号(;)结尾。statement_list 是可选的,因此空复合语句 BEGIN END 是合法的。
BEGIN ... END 块支持嵌套。BEGIN ... END 也可以被标记,详细信息请参考 语句标签。
PL 存储程序的默认分隔符为"/",用户也可以使用 delimiter 命令自定义分隔符,以使整个定义能够作为单个语句传递给服务器。分隔符可以由单个字符或多个字符组成,应该避免使用反斜杠(\)字符,它一般会被用作转义字符。示例如下:
DELIMITER $$
DELIMITER //
使用 seekdb 开发时,一般需要自定义分隔符。如果 PL 块内部定义中不包含由 ; 分隔的语句,则不需要使用分隔符
DECLARE 声明
DECLARE 语句用于定义程序的局部变量、异常处理和游标,详细信息请分别参见 存储程序的变量、异常处理和游标。
DECLARE 仅允许在 BEGIN ... END 块内使用,并且必须在其开始的位置,即在其他语句的前面。
声明必须遵循如下使用顺序:
-
游标声明必须出现在异常处理程序声明之前。
-
变量和条件声明必须出现在游标或异常处理程序声明之前。
语句标签
标签可用于 BEGIN ... END 块的 LOOP、REPEAT 和 WHILE 语句中。语法如下:
[begin_label:] BEGIN
[statement_list]
END [end_label]
[begin_label:] LOOP
statement_list
END LOOP [end_label]
[begin_label:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label]
[begin_label:] WHILE search_condition DO
statement_list
END WHILE [end_label]
这些语句的标签遵循以下使用规则:
-
begin_label后面必须跟随一个冒号。 -
begin_label可以在没有end_label的情况下给出。如果存在end_label,则必须与begin_label相同。 -
如果没有
begin_label,则无法给出end_label。 -
同一嵌套级别的标签必须是不同的。
-
标签最长可达 16 个字符。
要引用已构造的标签,请使用 ITERATE 或 LEAVE 语句。以下示例为使用标签标记语句继续迭代或终止循环:
DELIMITER //
CREATE PROCEDURE doiterate()
BEGIN
DECLARE p1 INT DEFAULT 0;
label1: LOOP
SET p1 = p1 + 1;
IF p1 < 10 THEN ITERATE label1; END IF;
LEAVE label1;
END LOOP label1;
END //
Query OK, 0 rows affected
有关块内异常处理程序的声明,请参见 DECLARE ... HANDLER。