好学IT学院:IT信息技术分享交流平台
来源:互联网  作者:mysql-AB;翻译:陈朋奕  发布时间:2006-12-24  ★★★加入收藏〗〖手机版
摘要:The New SQL Statements 新SQL语句Variables 变量在复合语句中声明变量的指令是DECLARE。(1) Example with two DECLARE statements两个DECLARE语句的例子CREA……

REPEAT ... END REPEAT: look at the UNTIL: UNTIL的作用

CREATE PROCEDURE p15 ()
BEGIN
DECLARE v INT;
SET v = 0;
REPEAT
INSERT INTO t VALUES (v);
SET v = v + 1;
UNTIL v >= 5 <--
END REPEAT;
END; //

注意到UNTIL语句后面没有分号,在这里可以不写分号,当然你加上额外的分号更好。

REPEAT ... END REPEAT: calling :调用

mysql> CALL p15()//
Query OK, 1 row affected (0.00 sec)

mysql> SELECT COUNT(*) FROM t//
+----------+

COUNT(*)


+----------+

14


+----------+
1 row in set (0.00 sec)

我们可以看到调用p15过程后又插入了5行记录

LOOP ... END LOOP

CREATE PROCEDURE p16 ()
BEGIN
DECLARE v INT;
SET v = 0;
loop_label: LOOP
INSERT INTO t VALUES (v);
SET v = v + 1;
IF v >= 5 THEN
LEAVE loop_label;
END IF;
END LOOP;
END; //

以上是LOOP循环的例子。

LOOP循环不需要初始条件,这点和WHILE循环相似,同时它又和REPEAT循环一样也不需要结束条件。

LOOP ... END LOOP: with IF and LEAVE 包含IF和LEAVE的LOOP循环

CREATE PROCEDURE p16 ()
BEGIN
DECLARE v INT;
SET v = 0;
loop_label: LOOP
INSERT INTO t VALUES (v);
SET v = v + 1;
IF v >= 5 THEN <--
LEAVE loop_label;
END IF;
END LOOP;
END; //

在循环内部加入IF语句,在IF语句中包含LEAVE语句。这里LEAVE语句的意义是离开循环。

LEAVE的语法是LEAVE加循环语句标号,关于循环语句的标号问题我会在后面进一步讲解。

LOOP ... END LOOP: calling :调用

mysql> CALL p16()//
Query OK, 1 row affected (0.00 sec)

mysql> SELECT COUNT(*) FROM t//
+----------+

COUNT(*)


+----------+

19


+----------+
1 row in set (0.00 sec)

调用过程p16后,结果是另5行被插入表t中。

Labels 标号

CREATE PROCEDURE p17 ()
label_1: BEGIN
label_2: WHILE 0 = 1 DO LEAVE label_2; END
WHILE;
label_3: REPEAT LEAVE label_3; UNTIL 0 =0
END REPEAT;
label_4: LOOP LEAVE label_4; END LOOP;
END; //

最后一个循环例子中我使用了语句标号。现在这里有一个包含4个语句标号的过程的例子。我们可以在BEGIN、 WHILE、REPEAT或者LOOP语句前使用语句标号,语句标号只能在合法的语句前面使用。因此"LEAVE label_3"意味着离开语句标号名定义为label_3的语句或复合语句。

End Labels 标号结束符

CREATE PROCEDURE p18 ()
label_1: BEGIN
label_2: WHILE 0 = 1 DO LEAVE label_2; END
WHILE label_2;
label_3: REPEAT LEAVE label_3; UNTIL 0 =0
END REPEAT label_3 ;
label_4: LOOP LEAVE label_4; END LOOP
label_4 ;
END label_1 ; //

你也可以在语句结束时使用语句标号,和在开头时使用一样。这些标号结束符并不是十分有用。

它们是可选的。如果你需要,他们必须和开始定义的标号名字一样当然为了有良好的编程习惯,方便他人阅读,最好还是使用标号结束符。

LEAVE and Labels 跳出和标号

CREATE PROCEDURE p19 (parameter1 CHAR)
label_1: BEGIN
label_2: BEGIN
label_3: BEGIN
IF parameter1 IS NOT NULL THEN
IF parameter1 = 'a' THEN
LEAVE label_1;
ELSE BEGIN
IF parameter1 = 'b' THEN
LEAVE label_2;
ELSE
LEAVE label_3;
END IF;
END;
END IF;
END IF;
END;
END;
END;//
LEAVE

语句使程序跳出复杂的复合语句。

ITERATE

迭代如果目标是ITERATE(迭代)语句的话,就必须用到LEAVE语句

CREATE PROCEDURE p20 ()
BEGIN
DECLARE v INT;
SET v = 0;
loop_label: LOOP
IF v = 3 THEN
SET v = v + 1;
ITERATE loop_label;
END IF;
INSERT INTO t VALUES (v);
SET v = v + 1;
IF v >= 5 THEN
LEAVE loop_label;
END IF;
END LOOP;
END; //
ITERATE

(迭代)语句和LEAVE语句一样也是在循环内部的循环引用,它有点像C语言中的“Continue”,同样它可以出现在复合语句中,引用复合语句标号,ITERATE(迭代)意思是重新开始复合语句。那我们启动并观察下面这个循环,这是个需要迭代过程的循环:ITERATE: Walking through the loop。

MySQL中文索引解决方案:二元分词法
  首先,我们来想想MySQL不支持中文索引的关键原因还是中文是双字节的,如果能把中文转换成单字节的字母或数字,那不就可以使用全文索引…
  • 好学触屏公众号虎力全开、杨帆起航!
  • 好学考试H5触屏版开放内测