<B>请求给个 MYSQL 异常处理的示例 急急急急急急!!</B> 本帖最后由 yuanzheng45 于 2010-12-28 15:43:53 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 MySQL5的异常处理http://www.51cto.com/html/2005/1129/12498.htm这个网站可以去看下,应该看的懂的 给你贴几个:1. Sample Problem: Log Of Failures 问题样例:故障记录当INSERT失败时,我希望能将其记录在日志文件中我们用来展示出错处理的问题样例是很普通的。我希望得到错误的记录。当INSERT失败时,我想在另一个文件中记下这些错误的信息,例如出错时间,出错原因等。我对插入特别感兴趣的原因是它将违反外键关联的约束2. Sample Problem: Log Of Failures (2)mysql> CREATE TABLE t21 INT, PRIMARY KEY (s1))engine=innodb;//mysql> CREATE TABLE t3 (s1 INT, KEY (s1),FOREIGN KEY (s1) REFERENCES t2 (s1))engine=innodb;//mysql> INSERT INTO t3 VALUES (5);//...ERROR 1216 (23000): Cannot add or update a child row: a foreign keyconstraint fails(这里显示的是系统的出错信息)我开始要创建一个主键表,以及一个外键表。我们使用的是InnoDB,因此外键关联检查是打开的。然后当我向外键表中插入非主键表中的值时,动作将会失败。当然这种条件下可以很快找到错误号1216。3. Sample Problem: Log Of FailuresCREATE TABLE error_log (error_messageCHAR(80))//下一步就是建立一个在做插入动作出错时存储错误的表。4. Sample Problem: Log Of ErrorsCREATE PROCEDURE p22 (parameter1 INT)BEGINDECLARE EXIT HANDLER FOR 1216INSERT INTO error_log VALUES(CONCAT('Time: ',current_date,'. Foreign Key Reference Failure ForValue = ',parameter1));INSERT INTO t3 VALUES (parameter1);END;//上面就是我们的程序。这里的第一个语句DECLARE EXIT HANDLER是用来处理异常的。意思是如果错误1215发生了,这个程序将会在错误记录表中插入一行。EXIT意思是当动作成功提交后退出这个复合语句。5. Sample Problem: Log Of ErrorsCALL p22 (5) //调用这个存储过程会失败,这很正常,因为5值并没有在主键表中出现。但是没有错误信息返回因为出错处理已经包含在过程中了。t3表中没有增加任何东西,但是error_log表中记录下了一些信息,这就告诉我们INSERT into table t3动作失败。DECLARE HANDLER syntax 声明异常处理的语法DECLARE{ EXIT | CONTINUE }HANDLER FOR{ error-number | { SQLSTATE error-string } | condition }SQL statement上面就是错误处理的用法,也就是一段当程序出错后自动触发的代码。MySQL允许两种处理器,一种是EXIT处理,我们刚才所用的就是这种。另一种就是我们将要演示的,CONTINUE处理,它跟EXIT处理类似,不同在于它执行后,原主程序仍然继续运行,那么这个复合语句就没有出口了。1. DECLARE CONTINUE HANDLER example CONTINUE处理例子CREATE TABLE t4 (s1 int,primary key(s1));//CREATE PROCEDURE p23 ()BEGINDECLARE CONTINUE HANDLERFOR SQLSTATE '23000' SET @x2 = 1;SET @x = 1;INSERT INTO t4 VALUES (1);SET @x = 2;INSERT INTO t4 VALUES (1);SET @x = 3;END;//这是MySQL参考手册上的CONTINUE处理的例子,这个例子十分好,所以我把它拷贝到这里。通过这个例子我们可以看出CONTINUE处理是如何工作的。2. DECLARE CONTINUE HANDLER声明CONTINUE异常处理CREATE TABLE t4 (s1 int,primary key(s1));//CREATE PROCEDURE p23 ()BEGINDECLARE CONTINUE HANDLERFOR SQLSTATE '23000' SET @x2 = 1; <--SET @x = 1;INSERT INTO t4 VALUES (1);SET @x = 2;INSERT INTO t4 VALUES (1);SET @x = 3;END;//这次我将为SQLSTATE值定义一个处理程序。还记得前面我们使用的MySQL错误代码1216吗?事实上这里的23000SQLSTATE是更常用的,当外键约束出错或主键约束出错就被调用了。3. DECLARE CONTINUE HANDLERCREATE TABLE t4 (s1 int,primary key(s1));//CREATE PROCEDURE p23 ()BEGINDECLARE CONTINUE HANDLERFOR SQLSTATE '23000' SET @x2 = 1;SET @x = 1; <--INSERT INTO t4 VALUES (1);SET @x = 2;INSERT INTO t4 VALUES (1);SET @x = 3;END;//这个存储过程的第一个执行的语句是"SET @x = 1"。4. DECLARE CONTINUE HANDLER exampleCREATE TABLE t4 (s1 int,primary key(s1));//CREATE PROCEDURE p23 ()BEGINDECLARE CONTINUE HANDLERFOR SQLSTATE '23000' SET @x2 = 1;SET @x = 1;INSERT INTO t4 VALUES (1);SET @x = 2;INSERT INTO t4 VALUES (1); <--SET @x = 3;END;//运行后值1被插入到主键表中。5. DECLARE CONTINUE HANDLERCREATE TABLE t4 (s1 int,primary key(s1));//CREATE PROCEDURE p23 ()BEGINDECLARE CONTINUE HANDLERFOR SQLSTATE '23000' SET @x2 = 1;SET @x = 1;INSERT INTO t4 VALUES (1);SET @x = 2; <--INSERT INTO t4 VALUES (1);SET @x = 3;END;//然后@x的值变为2。 如果大哥给的没问题我就BS一下公司网速太慢了 也BS下自己 怎么看不懂 ACMAIN_CHM大哥给的东西呢 额 又是这个 东东 咱能不能直接点。我要一个 可以捕获 大部分错误(不是执行 SQL 时的错。可能是解析串的错)然后 我回滚 顺便跟新数据(更新可用 UPDATE 代替)直接给我代码行吗?算帮帮小第了5楼的东西我看了看的有点蒙 http://blog.chinaunix.net/u3/116107/showart.php?id=2349490看看这个。 如何一条sql关联查出所需数据,详细如下 查询每类最大的两个值的SQL要怎么写啊~~ mysql5.5复制心跳怎么应用? 怎样将一个表的integer类型字段改成serial类型? MySQL乱码(MySQL ODBC 3.5.1驱动问题) 怎么不能连接mysql?? 在mysqlcc0.9.2-beta中,包含中文的sql语句存储再打开就成了乱码,写入库中的中文也成乱码,直接录入就执行则可以 如何在mysql中存储文件和图片啊? 请教一个mysql的sql语句 php在做MySQL还原功能,报诡异的错误 求助这个mysql的语法给修正了 用shell脚本执行mysql数据库操作
http://www.51cto.com/html/2005/1129/12498.htm
这个网站可以去看下,应该看的懂的
1. Sample Problem: Log Of Failures 问题样例:故障记录
当INSERT失败时,我希望能将其记录在日志文件中我们用来展示出错处理的问题样例是很普通的。我希望得到错误的记录。当INSERT失败时,我想在另一个文件中记下这些错误的信息,例如出错时间,出错原因等。我对插入特别感兴趣的原因是它将违反外键关联的约束
2. Sample Problem: Log Of Failures (2)
mysql> CREATE TABLE t2
1 INT, PRIMARY KEY (s1))
engine=innodb;//
mysql> CREATE TABLE t3 (s1 INT, KEY (s1),
FOREIGN KEY (s1) REFERENCES t2 (s1))
engine=innodb;//
mysql> INSERT INTO t3 VALUES (5);//
...
ERROR 1216 (23000): Cannot add or update a child row: a foreign key
constraint fails(这里显示的是系统的出错信息)
我开始要创建一个主键表,以及一个外键表。我们使用的是InnoDB,因此外键关联检查是打开的。然后当我向外键表中插入非主键表中的值时,动作将会失败。当然这种条件下可以很快找到错误号1216。
3. Sample Problem: Log Of Failures
CREATE TABLE error_log (error_message
CHAR(80))//
下一步就是建立一个在做插入动作出错时存储错误的表。
4. Sample Problem: Log Of Errors
CREATE PROCEDURE p22 (parameter1 INT)
BEGIN
DECLARE EXIT HANDLER FOR 1216
INSERT INTO error_log VALUES
(CONCAT('Time: ',current_date,
'. Foreign Key Reference Failure For
Value = ',parameter1));
INSERT INTO t3 VALUES (parameter1);
END;//
上面就是我们的程序。这里的第一个语句DECLARE EXIT HANDLER是用来处理异常的。意思是如果错误1215发生了,这个程序将会在错误记录表中插入一行。EXIT意思是当动作成功提交后退出这个复合语句。
5. Sample Problem: Log Of Errors
CALL p22 (5) //
调用这个存储过程会失败,这很正常,因为5值并没有在主键表中出现。但是没有错误信息返回因为出错处理已经包含在过程中了。t3表中没有增加任何东西,但是error_log表中记录下了一些信息,这就告诉我们INSERT into table t3动作失败。
DECLARE HANDLER syntax 声明异常处理的语法
DECLARE
{ EXIT | CONTINUE }
HANDLER FOR
{ error-number | { SQLSTATE error-string } | condition }
SQL statement
上面就是错误处理的用法,也就是一段当程序出错后自动触发的代码。MySQL允许两种处理器,一种是EXIT处理,我们刚才所用的就是这种。另一种就是我们将要演示的,CONTINUE处理,它跟EXIT处理类似,不同在于它执行后,原主程序仍然继续运行,那么这个复合语句就没有出口了。
1. DECLARE CONTINUE HANDLER example CONTINUE处理例子
CREATE TABLE t4 (s1 int,primary key(s1));//
CREATE PROCEDURE p23 ()
BEGIN
DECLARE CONTINUE HANDLER
FOR SQLSTATE '23000' SET @x2 = 1;
SET @x = 1;
INSERT INTO t4 VALUES (1);
SET @x = 2;
INSERT INTO t4 VALUES (1);
SET @x = 3;
END;//
这是MySQL参考手册上的CONTINUE处理的例子,这个例子十分好,所以我把它拷贝到这里。通过这个例子我们可以看出CONTINUE处理是如何工作的。
2. DECLARE CONTINUE HANDLER声明CONTINUE异常处理
CREATE TABLE t4 (s1 int,primary key(s1));//
CREATE PROCEDURE p23 ()
BEGIN
DECLARE CONTINUE HANDLER
FOR SQLSTATE '23000' SET @x2 = 1; <--
SET @x = 1;
INSERT INTO t4 VALUES (1);
SET @x = 2;
INSERT INTO t4 VALUES (1);
SET @x = 3;
END;//
这次我将为SQLSTATE值定义一个处理程序。还记得前面我们使用的MySQL错误代码1216吗?事实上这里的23000SQLSTATE是更常用的,当外键约束出错或主键约束出错就被调用了。
3. DECLARE CONTINUE HANDLER
CREATE TABLE t4 (s1 int,primary key(s1));//
CREATE PROCEDURE p23 ()
BEGIN
DECLARE CONTINUE HANDLER
FOR SQLSTATE '23000' SET @x2 = 1;
SET @x = 1; <--
INSERT INTO t4 VALUES (1);
SET @x = 2;
INSERT INTO t4 VALUES (1);
SET @x = 3;
END;//
这个存储过程的第一个执行的语句是"SET @x = 1"。
4. DECLARE CONTINUE HANDLER example
CREATE TABLE t4 (s1 int,primary key(s1));//
CREATE PROCEDURE p23 ()
BEGIN
DECLARE CONTINUE HANDLER
FOR SQLSTATE '23000' SET @x2 = 1;
SET @x = 1;
INSERT INTO t4 VALUES (1);
SET @x = 2;
INSERT INTO t4 VALUES (1); <--
SET @x = 3;
END;//
运行后值1被插入到主键表中。
5. DECLARE CONTINUE HANDLER
CREATE TABLE t4 (s1 int,primary key(s1));//
CREATE PROCEDURE p23 ()
BEGIN
DECLARE CONTINUE HANDLER
FOR SQLSTATE '23000' SET @x2 = 1;
SET @x = 1;
INSERT INTO t4 VALUES (1);
SET @x = 2; <--
INSERT INTO t4 VALUES (1);
SET @x = 3;
END;//
然后@x的值变为2。
如果大哥给的没问题我就BS一下公司
网速太慢了 也BS下自己 怎么看不懂 ACMAIN_CHM大哥给的东西呢
我要一个 可以捕获 大部分错误(不是执行 SQL 时的错。可能是解析串的错)
然后 我回滚 顺便跟新数据(更新可用 UPDATE 代替)
直接给我代码行吗?
算帮帮小第了
5楼的东西我看了看的有点蒙