跳到主要内容

PL 语法结构

存储程序的语法主要包括 BEGIN ... END 块、DECLARE 声明和语句标签三个部分。

BEGIN ... END 块

BEGIN ... END 块支持复合语句,用于编写存储程序(存储过程、存储函数和触发器)。

BEGIN ... END 复合语句可以包含多个语句,并用 BEGINEND 关键字括起来。语法如下:

[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 块的 LOOPREPEATWHILE 语句中。语法如下:

[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 个字符。

要引用已构造的标签,请使用 ITERATELEAVE 语句。以下示例为使用标签标记语句继续迭代或终止循环:

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