我刚接触mysql,原来是搞oracle的。对这部分不是很熟悉,下面是自己写的一个实例,大家指点指点:
-- --------------------------------------------------------------------------------
-- Routine DDL
-- --------------------------------------------------------------------------------
DELIMITER $$CREATE DEFINER=`root`@`192.168.0.90` PROCEDURE `proc_pub_src_move`( p_cmp_id int)
BEGIN
/* author : skyman
* date : 2010-06-25
* desc : 汇总src,从csf.fin_src_data获取数据到csf_pub.file_src_index里面。
*
*/
-- 错误处理
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
-- 这里是否会回滚数据库里面所有的事务,
-- 还是只回滚本存储过程里面的insert、update、delete事务呢?
INSERT INTO csf.sys_log_pub_detail (log_id, log_type, log_cmp_id, log_search_msg, log_msg)
VALUE (v_log_id, 2, p_cmp_id, "Program finshed","Finished with error!");
-- 这里我想把 "Finished with error!" 换成实际的mysql错误码或者错误信息,
-- 比如sqlserver里面的sqlerr以及oracle里面的error等,mysql里面是什么标示呢? COMMIT;
END;
DELETE FROM csf_pub.file_src_index WHERE cmp_id = p_cmp_id;
INSERT INTO csf_pub.file_src_index(cmp_id, rpt_id, col_num, source_count, sorce_data, source_status)
SELECT cmp_id, rpt_id, col_num, count(*) num, group_concat(data_value SEPARATOR '|') data, 1
FROM csf.fin_src_data
WHERE cmp_id = p_cmp_id
group by cmp_id, rpt_id, col_num;
COMMIT;
END
-- --------------------------------------------------------------------------------
-- Routine DDL
-- --------------------------------------------------------------------------------
DELIMITER $$CREATE DEFINER=`root`@`192.168.0.90` PROCEDURE `proc_pub_src_move`( p_cmp_id int)
BEGIN
/* author : skyman
* date : 2010-06-25
* desc : 汇总src,从csf.fin_src_data获取数据到csf_pub.file_src_index里面。
*
*/
-- 错误处理
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
-- 这里是否会回滚数据库里面所有的事务,
-- 还是只回滚本存储过程里面的insert、update、delete事务呢?
INSERT INTO csf.sys_log_pub_detail (log_id, log_type, log_cmp_id, log_search_msg, log_msg)
VALUE (v_log_id, 2, p_cmp_id, "Program finshed","Finished with error!");
-- 这里我想把 "Finished with error!" 换成实际的mysql错误码或者错误信息,
-- 比如sqlserver里面的sqlerr以及oracle里面的error等,mysql里面是什么标示呢? COMMIT;
END;
DELETE FROM csf_pub.file_src_index WHERE cmp_id = p_cmp_id;
INSERT INTO csf_pub.file_src_index(cmp_id, rpt_id, col_num, source_count, sorce_data, source_status)
SELECT cmp_id, rpt_id, col_num, count(*) num, group_concat(data_value SEPARATOR '|') data, 1
FROM csf.fin_src_data
WHERE cmp_id = p_cmp_id
group by cmp_id, rpt_id, col_num;
COMMIT;
END
那mysql里面如何处理类似的异常问题呢?
同样你可以在程序中用 mysql_error()得到文本的描述信息。但不是在存储过程中或者MYSQL工具中。
2:对于错误需要枚举。
如DECLARE errname CONDITION FOR SQLSTATE '23000'; 给导致错误23000的错误定义名字为errname
DECLARE continue handler for errname 当errname发生时作下面的处理
BEGIN 语句开始
set @x=1; 设置@x=1
select @x; 输出x
END; 结束出错处理。