如果我在写存储过程中 数组下边越界,或者出现什么字符乱码的错误。但是我想继续执行下面的代码?
我用什么办法控制呢。主要是不想去查。所以希望写的足够清晰。谢谢

解决方案 »

  1.   


    -- 开游标 --
    OPEN cur1;
         /* 游标向下走一步 */
         FETCH cur1 INTO v_id,v_queue_sql;
         WHILE ( v_id IS NOT NULL)
         DO     
              -- 开始事务 --
              start transaction;
              WHILE ( LENGTH(v_queue_sql) >= 1)
              DO     
                 set v_str_site = INSTR(v_queue_sql,';');-- 取';' 在 v_queue_sql 中的位置 --
                 set v_one_sql = LEFT(v_queue_sql,v_str_site); -- 取 v_queue_sql中v_str_site 左边的字符串 --            /* select v_one_sql as aaa;*/             SET @insert_stmt= v_one_sql;  /*在单引号中间填入要执行的sql语句*/
                 PREPARE stmt FROM @insert_stmt;
                 EXECUTE stmt;             set v_str_len = LENGTH(v_queue_sql);
                 set v_start = v_str_site +1;      /* 判断sql语句是否已执行完 */     
                 if v_start>v_str_len then
                     set v_queue_sql = '';
                 else
                     set v_end = v_str_len - v_str_site;
                     /* 取 v_queue_sql 中从 v_start 开始,共取 v_end个字符串 */
                     set v_str = SUBSTRING(v_queue_sql,v_start,v_end);
                     set v_queue_sql = v_str;
                 end if;           end while;
          /* 插入成功修改status */     
               set v_one_sql = 'update pmp_task_details_queue q set q.status = \'qs01\',q.e_time = now()
                             where q.ID=';
               set v_one_sql = CONCAT(v_one_sql,v_id);
               SET @insert_stmt= v_one_sql;  /*在单引号中间填入要执行的sql语句*/
               PREPARE stmt FROM @insert_stmt;
               EXECUTE stmt;      /* 事务控制判断是否报错 */     
             if @@error_count=0 then     
                   commit;
               else
                   rollback;
              /* 插入失败修改type */     
                   set v_one_sql = 'update pmp_task_details_queue q set q.status = \'qs02\',q.e_time = now()
                             where q.ID=';
                   set v_one_sql = CONCAT(v_one_sql,v_id);
                   SET @insert_stmt= v_one_sql;  /*在单引号中间填入要执行的sql语句*/
                   PREPARE stmt FROM @insert_stmt;
                   EXECUTE stmt;
               end if;
         
          /* 游标向下走一步 */
          FETCH cur1 INTO v_id,v_queue_sql;
         END WHILE; CLOSE cur1;我想的是 程序发生错误时。继续执行 
    rollback;
              /* 插入失败修改type */     
                   set v_one_sql = 'update pmp_task_details_queue q set q.status = \'qs02\',q.e_time = now()
                             where q.ID=';
                   set v_one_sql = CONCAT(v_one_sql,v_id);
                   SET @insert_stmt= v_one_sql;  /*在单引号中间填入要执行的sql语句*/
                   PREPARE stmt FROM @insert_stmt;
                   EXECUTE stmt;
      

  2.   

    mysql> CREATE TABLE test.t (s1 INT, PRIMARY KEY (s1));
    Query OK, 0 rows affected (0.00 sec)mysql> delimiter //mysql> CREATE PROCEDURE handlerdemo ()
        -> BEGIN
        ->   DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1;
        ->   SET @x = 1;
        ->   INSERT INTO test.t VALUES (1);
        ->   SET @x = 2;
        ->   INSERT INTO test.t VALUES (1);
        ->   SET @x = 3;
        -> END;
        -> //
    Query OK, 0 rows affected (0.00 sec)mysql> CALL handlerdemo()//
    Query OK, 0 rows affected (0.00 sec)mysql> SELECT @x//
        +------+
        | @x   |
        +------+
        | 3    |
        +------+
      

  3.   

    ACMAIN_CHM 你永远都是那么 强悍呀! 
      

  4.   

    DECLARE handler_type HANDLER
        FOR condition_value [, condition_value] ...
        statementhandler_type:
        CONTINUE
      | EXIT
      | UNDOcondition_value:
        SQLSTATE [VALUE] sqlstate_value
      | condition_name
      | SQLWARNING
      | NOT FOUND
      | SQLEXCEPTION
      | mysql_error_code上面三种基本上可以覆盖大部分错误了。
      

  5.   

    [b][b][b][b][b]谢了 [/b][/b][/b][/b][/b]
      

  6.   

    A 大哥我怎么老报错呀。应该写的语法不对吧。需要注意啥呀?我写的不对吗?
    -- 开游标 --
    OPEN cur1;
         /* 游标向下走一步 */
         FETCH cur1 INTO v_id,v_queue_sql;
         WHILE ( v_id IS NOT NULL)
         DO                -- 开始事务 --
              start transaction;
              WHILE ( LENGTH(v_queue_sql) >= 1)
              DO     

    DECLARE CONTINUE HANDLER  FOR SQLWARNING statement              set v_str_site = INSTR(v_queue_sql,';');-- 取';' 在 v_queue_sql 中的位置 --
                 set v_one_sql = LEFT(v_queue_sql,v_str_site); -- 取 v_queue_sql中v_str_site 左边的字符串 --            /* select v_one_sql as aaa;*/             SET @insert_stmt= v_one_sql;  /*在单引号中间填入要执行的sql语句*/
                 PREPARE stmt FROM @insert_stmt;
                 EXECUTE stmt;             set v_str_len = LENGTH(v_queue_sql);
                 set v_start = v_str_site +1;      /* 判断sql语句是否已执行完 */     
                 if v_start>v_str_len then
                     set v_queue_sql = '';
                 else
                     set v_end = v_str_len - v_str_site;
                     /* 取 v_queue_sql 中从 v_start 开始,共取 v_end个字符串 */
                     set v_str = SUBSTRING(v_queue_sql,v_start,v_end);
                     set v_queue_sql = v_str;
                 end if;           end while;
          /* 插入成功修改status */     
               set v_one_sql = 'update pmp_task_details_queue q set q.status = \'qs01\',q.e_time = now()
                             where q.ID=';
               set v_one_sql = CONCAT(v_one_sql,v_id);
               SET @insert_stmt= v_one_sql;  /*在单引号中间填入要执行的sql语句*/
               PREPARE stmt FROM @insert_stmt;
               EXECUTE stmt;      /* 事务控制判断是否报错 */     
             if @@error_count=0 and  @@error_count = 0 then     
                   commit;
               else
                   rollback;
              /* 插入失败修改type */     
                   set v_one_sql = 'update pmp_task_details_queue q set q.status = \'qs02\',q.e_time = now()
                             where q.ID=';
                   set v_one_sql = CONCAT(v_one_sql,v_id);
                   SET @insert_stmt= v_one_sql;  /*在单引号中间填入要执行的sql语句*/
                   PREPARE stmt FROM @insert_stmt;
                   EXECUTE stmt;
               end if;
          /* 游标向下走一步 */
          FETCH cur1 INTO v_id,v_queue_sql;
         END WHILE; CLOSE cur1;
      

  7.   

    BEGIN declare _row,_err,_count int default 0; DECLARE CONTINUE  HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND set _err=1; while _row<3 DO   START TRANSACTION;      insert into t1(cond_val)values(null);   COMMIT;  if _err=1 then    set _count=_count+1;  end if;  set _row=_row+1; end while; select _count; END你把可能出现的异常放在这个地方
    DECLARE CONTINUE  HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND set _err=1;
    后面的语句即使发生异常,也可以往下走,你上面的代码发的太乱了,没劲改了