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

2.CALL p12 (0) //我们调用这个过程,传入值为0,这样parameter1的值将为0。

3.

CREATE PROCEDURE p12 (IN parameter1 INT)
BEGIN
DECLARE variable1 INT;
SET variable1 = parameter1 + 1; <--
IF variable1 = 0 THEN
INSERT INTO t VALUES (17);
END IF;
IF parameter1 = 0 THEN
UPDATE t SET s1 = s1 + 1;
ELSE
UPDATE t SET s1 = s1 + 2;
END IF;
END; //

这里变量variable1被赋值为parameter1加1的值,所以执行后变量variable1为1。

4.

CREATE PROCEDURE p12 (IN parameter1 INT)
BEGIN
DECLARE variable1 INT;
SET variable1 = parameter1 + 1;
IF variable1 = 0 THEN <--
INSERT INTO t VALUES (17);
END IF;
IF parameter1 = 0 THEN
UPDATE t SET s1 = s1 + 1;
ELSE
UPDATE t SET s1 = s1 + 2;
END IF;
END; //

因为变量variable1值为1,因此条件"if variable1 = 0"为假,

IF
……
END IF

被跳过,没有被执行。

5.

CREATE PROCEDURE p12 (IN parameter1 INT)
BEGIN
DECLARE variable1 INT;
SET variable1 = parameter1 + 1;
IF variable1 = 0 THEN
INSERT INTO t VALUES (17);
END IF;
IF parameter1 = 0 THEN <--
UPDATE t SET s1 = s1 + 1;
ELSE
UPDATE t SET s1 = s1 + 2;
END IF;
END; //

到第二个IF条件,判断结果为真,于是中间语句被执行了

6.

CREATE PROCEDURE p12 (IN parameter1 INT)
BEGIN
DECLARE variable1 INT;
SET variable1 = parameter1 + 1;
IF variable1 = 0 THEN
INSERT INTO t VALUES (17);
END IF;
IF parameter1 = 0 THEN
UPDATE t SET s1 = s1 + 1; <--
ELSE
UPDATE t SET s1 = s1 + 2;
END IF;
END; //

因为参数parameter1值等于0,UPDATE语句被执行。如果parameter1值为NULL,则下一条UPDATE语句将被执行现在表t中有两行,他们都包含值5,所以如果我们调用p12,两行的值会变成6。

7.

mysql> CALL p12(0)//
Query OK, 2 rows affected (0.28 sec)
mysql> SELECT * FROM t//
+------+

s1


+------+

6


6


+------+
2 rows in set (0.01 sec)

结果也是我们所期望的那样。

CASE 指令

1.

CREATE PROCEDURE p13 (IN parameter1 INT)
BEGIN
DECLARE variable1 INT;
SET variable1 = parameter1 + 1;
CASE variable1
WHEN 0 THEN INSERT INTO t VALUES (17);
WHEN 1 THEN INSERT INTO t VALUES (18);
ELSE INSERT INTO t VALUES (19);
END CASE;
END; //

如果需要进行更多条件真假的判断我们可以使用CASE语句。CASE语句使用和IF一样简单。

我们可以参考上面的例子:

2.

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

mysql> SELECT * FROM t//
+------+

s1


+------+

6


6


19


+------+
3 rows in set (0.00 sec)

执行过程后,传入值1,如上面例子,值19被插入到表t中。

Question 问题

问题: CALL p13(NULL) //的作用是什么?
  另一个:这个CALL语句做了那些动作?
  你可以通过执行后观察SELECT做了什么,也可以根据代码判断,在5秒内做出。

Answer 答案

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

mysql> SELECT * FROM t//
+------+

s1


+------+

6


6


19


19


+------+
4 rows in set (0.00 sec)

答案是当你调用p13时,MySQL插入了另一条包含数值19的记录。原因是变量variable1的值为NULL,CASE语句的ELSE部分就被执行了。希望这对大家有意义。如果你回答不出来,没有问题,我们可以继续向下走。

Loops 循环语句

WHILE ... END WHILE
LOOP ... END LOOP
REPEAT ... END REPEAT
GOTO

下面我们将会创建一些循环。我们有三种标准的循环方式:

WHILE循环,LOOP循环以及REPEAT循环。还有一种非标准的循环方式:GO TO(译者语:最好不要用吧,用了就使流程混乱)。

WHILE ... END WHILE

CREATE PROCEDURE p14 ()
BEGIN
DECLARE v INT;
SET v = 0;
WHILE v < 5 DO
INSERT INTO t VALUES (v);
SET v = v + 1;
END WHILE;
END; //

这是WHILE循环的方式。我很喜欢这种方式,它跟IF语句相似,因此不需要掌握很多新的语法。这里的INSERT和SET语句在WHILE和END WHILE之间,当变量v大于5的时候循环将会退出。使用"SET v = 0;"

语句使为了防止一个常见的错误,如果没有初始化,默认变量值为NULL,而NULL和任何值操作结果都为NULL。

WHILE ... END WHILE example

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

以上就是调用过程p14的结果不用关注系统返回是"one row affected"还是"five rows affected",因为这里的计数只对最后一个INSERT动作进行计数。

WHILE ... END WHILE example: CALL

mysql> select * from t; //
+------+

s1


+------+
....

0


1


2


3


4


+------+
9 rows in set (0.00 sec)

调用后可以看到程序向数据库中插入了5行。

REPEAT ... END REPEAT

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

这是一个REPEAT循环的例子,功能和前面WHILE循环一样。区别在于它在执行后检查结果,而WHILE则是执行前检查。(译者语:可能等同于DO WHILE吧)