Mysql这几种语句标签,你用过几个

在《mysql存储过程细节窥探》这篇文章中我们简单介绍了存储过程的使用,其中在创建存储过程的语法中有BEGIN……END。除了BEGIN……END之外,在存储过程的存储体内可以使用的语句标签有下面几种:

[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,则后面必须带着冒号(:)。并且给出了begin_label,最后不一定非得跟着end_label。但是,如果给出end_label,那end_label必须和begin_label相同。

end_label 对于这个标签,不能在没有begin_label的情况下单独给出end_label。

还有一点需要说明,对于这些label,每一层中的label必须是唯一的,不能相同。并且每个label的字符串长度最长为16个字符。

下面我们举个例子。

例一

mysql>delimiter //

mysql>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;

       -->END;

mysql>delimiter ;

上面的例子中label1就是上面我们说到的begin_label和end_label。根据上面我们的说明,上面的例子也可以改成如下的形式。

例二

mysql>delimiter //

mysql>CREATE PROCEDURE doiterate(p1 INT)

       -->BEGIN

       -->  label1: LOOP

       -->   SET p1 = p1 + 1;

       -->   IF p1 < 10 THEN ITERATE label1; END IF;

       -->   LEAVE label1;

       -->  END LOOP;

       -->END;

mysql>delimiter ;

接下来我们分别看一下上述几种语句标签的应用。

1. BEGIN……END

BEGIN … END主要用于写复合语句的。一个复合语句可能会包含多条语句,这些语句都是由BEGIN … END界定的。就像我们下面这个例子。

例三

mysql> delimiter //

mysql> create procedure adddata()

         -->begin

         -->  declare n int default 0;

         -->  while n<100000

         -->  do

         -->       insert into proced(name,type) values(‘迹忆博客’,’onmpw’);

         -->       set n = n+1;

         -->  end while;

         -->end

         -->//

mysql> delimiter ;

并且BEGIN … END块儿是可以被嵌套的。而且还可以被冠以名称。

例四

mysql> delimiter //

mysql> CREATE PROCEDURE adddata()

         -->label1:BEGIN

         -->  declare n int default 0;

         -->  while n<100000

         -->  do

         -->    insert into proced(name,type) values(‘迹忆博客’,’onmpw’);

         -->  set n = n+1;

         -->  end while;

         -->END label1

         -->//

mysql> delimiter ;

2. LOOP

[begin_label:] LOOP

    statement_list

END LOOP [end_label]

LOOP 作用是重复执行statement_list,它可能包含一条或多条执行语句。这些语句都是用分号(;)来界定的,所以之前我们需要先使用delimiter //命令改变客户端命令行的界定符。这个命令在《mysql存储过程细节窥探》中有说过。对于这个标签的使用实例如下。

例五

mysql> delimiter //

mysql>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;

mysql> delimiter ;

LOOP的需要借助ITERATE 来重复,而LOOP的循环结束需要有LEAVE来完成,当然也可以使用RETURN。这里的LEAVE我们可以理解成编程语言中的break来跳出循环。RETURN可以理解成编程语言中的return,亦可以跳出循环,不过这个是整个程序的退出。

3. REPEAT

[begin_label:] REPEAT

       statement_list

UNTIL search_condition

END REPEAT [end_label]

同样REPEAT重复执行块儿内的statement_list,直到UNTIL的条件不成立的时候结束循环。因此,我们可以看出statement_list至少被执行一次。此语句标签可以理解成编程语言中的do{}while();

使用示例如下。

例六

mysql> delimiter //

mysql> CREATE PROCEDURE dorepeat(p1 INT)

    -->BEGIN

    -->   SET @x = 0;

    -->   REPEAT

    -->     SET @x = @x + 1;

    -->   UNTIL @x > p1

    -->END REPEAT;

    --> END

    --> //

mysql>delimiter ;

mysql> CALL dorepeat(1000);

mysql> SELECT @x;

+---------+

| @x  |

+---------+

| 1001 |

+---------+

4. WHILE

[begin_label:] WHILE search_condition DO

    statement_list

END WHILE [end_label]

WHILE表示在此块儿内的statement_list被重复执行,只要search_condition为真就会执行。也就是说此WHILE语句标签相当于编程语言中的while(){}语句。

使用示例如下。

例七

mysql> delimiter //

mysql>CREATE PROCEDURE dowhile()

       -->BEGIN

       -->    DECLARE v1 INT DEFAULT 5;

       -->    label1:WHILE v1 > 0 DO

       -->             SET v1 = v1 - 1;

       -->    END WHILE label1;

       -->END//

mysql>delimiter ;

以上就是对几种语句标签的简单介绍。

本文转载自:迹忆客(https://www.jiyik.com)

以上是 Mysql这几种语句标签,你用过几个 的全部内容, 来源链接: utcz.com/z/290036.html

回到顶部