1 delimiter //
2 CREATE PROCEDURE EXIT_DEMO()
3 BEGIN
4 BEGIN
5 DECLARE EXIT HANDLER FOR SQLSTATE '23000'
6 .......
7 END;
8 END;
9 delimiter ;
上述代码中,一旦出现23000错误,代码行4到7的BEGIN...END闭合语句立刻终止执行。
3.3、声明CURSOR游标 :
声明一个CURSOR游标:
DECLARE cursor_name CURSOR FOR select_statement
比如说最基本的:
DECLARE cur1 CURSOR FOR SELECT id,data FROM tbl;
此时cur1表示的即是SELECT语句返回的首个结果,有点类似于指针。
下面不妨看一个比较完整的例子:
1 delimiter //
2 CREATE PROCEDURE CURSOR_DEMO()
3 BEGIN
4 DECLARE done INT DEFAULT 0; --INT型值,默认为0
5 DECLARE a CHAR(5);
6 DECLARE b,c INT;
7 /*声明两个游标*/
8 DECLARE CUR1 CURSOR FOR SELECT ID,DATA FROM tbl1;
9 DECLARE CUR2 CURSOR FOR SELECT I FROM tbl2;
10 /*声明CONTINUE句柄,当游标触底时被触发*/
11 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
12
13 /*打开游标*/
14 OPEN CUR1;
15 OPEN CUR2;
16
17 /*循环插入数据,使用REPEAT...UNTIL语句*/
18 REPEAT
19 FETCH CUR1 INTO a,b; --读取游标中的数据,并移向下一行
20 FETCH CUR2 INTO c;
21 IF NOT done THEN --当done为0的时候条件成立
22 IF b < c THEN --取b和c的较小者插入表3
23 INSERT INTO tbl3 VALUES(a,b);
24 ELSE
25 INSERT INTO tbl3 VALUES(a,c);
26 END IF;
27 END IF; --当游标触底,句柄将被触发,done值被设为1,然后从这里继续执行主程序
28 UNTIL done --句柄触发后,done为1,执行UNTIL
29 END REPEAT;
30
31 /*使用完毕,关闭游标*/
32 CLOSE CUR1;
33 CLOSE CUR2;
34 END//
35
36 delimiter ;
其中,FETCH语句的基本语法如下:
FETCH cursor_name INTO var_name [, var_name] ...
该语句每次都会返回SELECT结果中的下一行(如果有的话)。
CREATE PROCEDURE LOOP_DEMO(param INT)
BEGIN
label1: LOOP
SET param = param +1;
IF param < 100 THEN
ITERATE label1; --回到标签开始处
END IF;
LEAVE label1; --离开标签,退出流控制结构
END LOOP label1; --结束循环
END;
delimiter ;
2、REPEAT:
先给出REPEAT语法定义:
1 [begin_label:] REPEAT
2 statement_list
3 UNTIL search_condition
4 END REPEAT [end_label]
可见,同样是可以在代码开始处插入label标签,不过REPEAT循环是自己有控制条件的,最好能直接使用UNTIL来进行条件判断。
比如下面这个例子:
1 delimiter //
2 CREATE PROCEDURE REPEAT_DEMO(param INT)
3 BEGIN
4 SET @x = 0;
5 REPEAT
6 SET @x = @x+1;
7 UNTIL @x > param
8 END REPEAT;
9 END//
10
11 delimiter ;
3、WHILE:
WHILE循环语法定义如下:
[begin_label:] WHILE search_condition DO
statement_list
END WHILE [end_label]
比如下面这个小例子:
delimiter //
CREATE PROCEDURE WHILE_DEMO()
BEGIN
SET param INT DEFAULT 10;
WHILE param < 1000
.... --循环内书写具体需要处理的事务
SET param = param + 100;
END WHILE;
END;
CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_body
同样的,可以通过DEFINER自行指定触发器的适用对象。