如果我在写存储过程中 数组下边越界,或者出现什么字符乱码的错误。但是我想继续执行下面的代码?
我用什么办法控制呢。主要是不想去查。所以希望写的足够清晰。谢谢
我用什么办法控制呢。主要是不想去查。所以希望写的足够清晰。谢谢
解决方案 »
- mysql union 与union all 使用
- 远程连接mysql"Can't connect to mysql server on IP(10060)"
- mysql 与javaweb开发时,向MySQL插入中文显示??
- mysql数据库中中文字符为空白
- 新手提问,请高手看看!
- 各位好!我要找一个MYSQL 的客户端进行备份服务器上的数据,那个MYSQL 的确良客户端好用一些呀??
- 请问怎么用SQL修改MYSQL中的存储过程
- 这问这几条sql语句在MySql里面应该怎样写?急
- 请问该选择什么版本的MYSQL
- 基础问题,mysql时间格式如果省略时分秒,是不是代表0时0分0秒
- 从数据表中检索出比它前面的所有数都大的数
- 存储过程的问题
-- 开游标 --
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;
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 |
+------+
FOR condition_value [, condition_value] ...
statementhandler_type:
CONTINUE
| EXIT
| UNDOcondition_value:
SQLSTATE [VALUE] sqlstate_value
| condition_name
| SQLWARNING
| NOT FOUND
| SQLEXCEPTION
| mysql_error_code上面三种基本上可以覆盖大部分错误了。
-- 开游标 --
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;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND set _err=1;
后面的语句即使发生异常,也可以往下走,你上面的代码发的太乱了,没劲改了