本帖最后由 yuanzheng45 于 2010-12-28 15:43:53 编辑

解决方案 »

  1.   

    MySQL5的异常处理
    http://www.51cto.com/html/2005/1129/12498.htm
    这个网站可以去看下,应该看的懂的
      

  2.   

    给你贴几个:
    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。
      

  3.   


    如果大哥给的没问题我就BS一下公司
    网速太慢了 也BS下自己 怎么看不懂 ACMAIN_CHM大哥给的东西呢
      

  4.   

    额 又是这个 东东 咱能不能直接点。
    我要一个 可以捕获 大部分错误(不是执行 SQL 时的错。可能是解析串的错)
    然后 我回滚 顺便跟新数据(更新可用 UPDATE 代替)
    直接给我代码行吗?
    算帮帮小第了
    5楼的东西我看了看的有点蒙
      

  5.   

    http://blog.chinaunix.net/u3/116107/showart.php?id=2349490看看这个。