【www.gdgbn.com--php函数】
MySQL在存储过程的异常处理部分使用多个语句
-- 创建测试表格,且没有任何数据
drop table if exists t;
create table t(id int);
-- 创建存储过程
drop procedure if exists test;
delimiter |
create procedure test()
begin
declare vId int;
-- 游标,没有数据的结果集
declare cTest cursor for select * from t;
-- 使用begin, end在发生异常时执行多个命令
DECLARE CONTINUE HANDLER FOR SQLSTATE "02000" begin
set @done=1;
set @done2 = 222;
-- 各种语句都可以使用
insert into t values (1);
end;
-- 启动游标
open cTest;
-- 没有数据,抛出异常
fetch next from cTest into vid;
set @done2 = 333;
close cTest;
end;
|
delimiter ;
-- 测试调用
call test();
-- 查看结果
select @done2 from dual;
select * from t;
结果
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 6
Server version: 5.1.30-community MySQL Community Server (GPL)
Type "help;" or "h" for help. Type "c" to clear the buffer.
mysql教程> use test;
Database changed
mysql> -- 测试在数据库教程的异常里使用多个语句
mysql> -- 创建测试表格,且没有任何数据
mysql> drop table if exists t;
Query OK, 0 rows affected, 1 warning (0.03 sec)
mysql> create table t(id int);
Query OK, 0 rows affected (0.17 sec)
mysql> -- 创建存储过程
mysql> drop procedure if exists test;
Query OK, 0 rows affected, 1 warning (0.02 sec)
mysql> delimiter |
mysql> create procedure test()
-> begin
-> declare vId int;
-> -- 游标,没有数据的结果集
-> declare cTest cursor for select * from t;
-> -- 使用begin, end在发生异常时执行多个命令
-> DECLARE CONTINUE HANDLER FOR SQLSTATE "02000" begin
-> set @done=1;
-> set @done2 = 222;
-> -- 各种语句都可以使用
-> insert into t values (1);
-> end;
-> -- 启动游标
-> open cTest;
-> -- 没有数据,抛出异常
-> fetch next from cTest into vid;
-> set @done2 = 333;
-> close cTest;
-> end;
-> |
Query OK, 0 rows affected (0.05 sec)
mysql> delimiter ;
mysql>
mysql> -- 测试调用
mysql> call test();
Query OK, 0 rows affected (0.13 sec)
mysql> -- 查看结果
mysql> select @done2 from dual;
+--------+
| @done2 |
+--------+
| 333 |
+--------+
1 row in set (0.00 sec)
mysql> select * from t;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
mysql>