复合语句

2021-01-10
[begin_label:] BEGIN
    [statement_list]
END [end_label]

BEGIN ... END 块可以嵌套

修改定界符,定界符默认为;修改后语句结束标签改为指定的定界符

delimiter

声明变量,可以在存储程序中使用

DECLARE

退出具有给定标签的流控制构造。如果标签用于最外层存储的程序块,则LEAVE退出程序。
LEAVE可以在BEGIN ... END或循环结构(LOOP, REPEAT, WHILE)中使用。

LEAVE label

终止存储函数的执行,并将expr值返回给函数调用者。存储的函数中必须至少有一个RETURN语句。如果函数具有多个退出点,则可能有多个。
在存储过程,触发器或事件中不使用该语句。

RETURN expr

循环

LOOP实现了一个简单的循环结构,使语句列表可以重复执行,该语句列表由一个或多个语句组成,每个语句以分号语句定界符(;)终止。重复循环中的语句,直到循环终止。通常,通过LEAVE声明来退出循环。在已存储的函数中,也可以使用RETURN完全退出该函数。

[begin_label:] LOOP
    statement_list
END LOOP [end_label]

CREATE PROCEDURE doiterate(p1 INT)
BEGIN
  label1: LOOP
    SET p1 = p1 + 1;
    IF p1 < 10 THEN
      ITERATE label1;
    END IF;
    LEAVE label1;
  END LOOP label1;
  SET @x = p1;
END;

REPEAT重复语句列表中的语句,直到search_condition表达式为真为止。因此,REPEAT总是至少进入一次循环。 statement_list由一个或多个语句组成,每个语句以分号(;)语句定界符终止。

[begin_label:] REPEAT
    statement_list
UNTIL search_condition
END REPEAT [end_label]

CREATE PROCEDURE dorepeat(p1 INT)
   BEGIN
      SET @x = 0;
      REPEAT
         SET @x = @x + 1;
      UNTIL @x > p1 END REPEAT;
   END

WHILE只要search_condition表达式为真,就会重复语句列表中的语句。statement_list由一个或多个SQL语句组成,每个语句以定界符(;)终止。

[begin_label:] WHILE search_condition DO
    statement_list
END WHILE [end_label]

CREATE PROCEDURE dowhile()
BEGIN
  DECLARE v1 INT DEFAULT 5;

  WHILE v1 > 0 DO
    ...
    SET v1 = v1 - 1;
  END WHILE;
END;

判断

IF search_condition THEN statement_list
    [ELSEIF search_condition THEN statement_list] ...
    [ELSE statement_list]
END IF

DELIMITER //

CREATE FUNCTION VerboseCompare (n INT, m INT)
  RETURNS VARCHAR(50)

  BEGIN
    DECLARE s VARCHAR(50);

    IF n = m THEN SET s = 'equals';
    ELSE
      IF n > m THEN SET s = 'greater';
      ELSE SET s = 'less';
      END IF;

      SET s = CONCAT('is ', s, ' than');
    END IF;

    SET s = CONCAT(n, ' ', s, ' ', m, '.');

    RETURN s;
  END //

DELIMITER ;

对于第一种语法,case_value是一个表达式。将该值与when_value每个WHEN子句中的表达式进行比较, 直到其中一个相等为止。when_value找到相等时,将执行相应的THEN子句statement_list。如果不等于when_value,则执行ELSE子句statement_list(如果存在)。
由于NULL = NULL为false ,因此无法使用此语法测试是否相等。
对于第二种语法,将评估每个WHEN子句search_condition表达式,直到一个为真为止,然后执行其相应的THEN子句statement_list。如果不等于search_condition,则执行ELSE子句 statement_list(如果存在)。
如果when_value为否或search_condition与测试的值匹配,并且该CASE语句不包含任何ELSE子句,则导致CASE语句错误找不到Case。
每个statement_list包含一个或多个SQL语句;statement_list不允许为空 。
要处理任何WHEN子句都没有值匹配的情况 ,请使用ELSE包含一个空 BEGIN ... END块的,如本示例所示。(在此ELSE子句中使用的缩进仅是为了清楚起见,在其他方面并不重要。)
要处理任何WHEN子句都不匹配值的情况,请使用包含空BEGIN…END
用于存储程序的CASE语句实现了复杂的条件构造。

CASE case_value
    WHEN when_value THEN statement_list
    [WHEN when_value THEN statement_list] ...
    [ELSE statement_list]
END CASE

CASE
    WHEN search_condition THEN statement_list
    [WHEN search_condition THEN statement_list] ...
    [ELSE statement_list]
END CASE

DELIMITER |

CREATE PROCEDURE p()
  BEGIN
    DECLARE v INT DEFAULT 1;

    CASE v
      WHEN 2 THEN SELECT v;
      WHEN 3 THEN SELECT 0;
      ELSE
        BEGIN
        END;
    END CASE;
  END;
  |

 

{/if}