存储过程内创建异常处理机制-自动检测错误类型并且用表记录.(详细请进贴)
DROP TRIGGER if EXISTS qweqwe;
DROP TABLE if EXISTS tbl_eeeeeee;
DROP TABLE IF EXISTS strud_name;
CREATE TABLE strud_name (
`id` int(11) NOT NULL,
`class` int(11) NOT NULL,
`name` varchar(5) NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE tbl_eeeeeee(
`uuid` int(11) NOT NULL AUTO_INCREMENT COMMENT '从数据库主键id',
`error` varchar(10) NOT NULL COMMENT '错误代码',
`report_time` datetime NOT NULL COMMENT '异常生成时间',
`rec_status` varchar(10) NOT NULL COMMENT '异常生成状态',
`disposechart` varchar(20) NOT NULL COMMENT '异常生成表',
`anomalydomain` varchar(20) NOT NULL COMMENT '异常告警域',
PRIMARY KEY (`uuid`)
);
DELIMITER $$
CREATE TRIGGER qweqwe
before INSERT ON strud_name FOR EACH ROW
BEGIN
DECLARE code CHAR(5) DEFAULT '00000';
DECLARE msg TEXT;
DECLARE rows INT;
DECLARE result TEXT;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1
code = RETURNED_SQLSTATE, msg = MESSAGE_TEXT;
END;
IF code = '00000' THEN
-- 数据插入成功 记录这条记录
INSERT INTO tbl_eeeeeee(error,report_time,rec_status,disposechart,anomalydomain)VALUES('00000',NOW(),'OK','异常生成表','异常告警域');
ELSE
-- 可是数据插入失败,没有记录这条记录。
INSERT INTO tbl_eeeeeee(error,report_time,rec_status,disposechart,anomalydomain)VALUES('66666',NOW(),'no','异常生成表','异常告警域');
END IF;
insert into test.strud_name (id,class,name)VALUES(new.id,new.class,new.name);
END
$$
DELIMITER;
-- 重复插入第二次数据的时候会提示错误 可sql是先执行触发器 后实现sql语句
insert into strud_name (id,class,name)VALUES(1,2,'123');
select * from strud_name;
select * from tbl_eeeeeee; 以上的代码,可以直接在电脑上跑,看客如果想了解的话 也可以一起了解下mysql触发器的异常机制。
我现在遇到的问题在于我跑第一次的时候,会成功的执行00000参数 并且插入成功数据
使用的是before 触发器-等于是说先执行这个触发器,判断是否有错误,然后再进行数据的插入
可是在测试的时候-如果插入重复的id - 提示错误后,没有记录下来这个错误的信息。
参考内容:https://dev.mysql.com/doc/refman/5.7/en/get-diagnostics.html
问题重点是-增删改数据库的时候,我们提交sql 在数据库中经历了什么? 而我这儿为什么会提示插入数据库错误的情况下,触发器没有记录下来我插入的错误到表中
相关推荐
oracle存储过程超详细使用手册
oracle存储过程超详细使用手册,内容很详细,绝对受用
MySQL存储过程的异常处理方法
本文实例讲述了MySQL存储过程的异常处理方法。分享给大家供大家参考。具体如下: mysql> mysql> delimiter $$ mysql> mysql> CREATE PROCEDURE myProc -> (p_first_name VARCHAR(30), -> p_last_name VARCHAR(30), -> p_city VARCHAR(30), -> p_description VARCHAR(30), -> OUT p_sqlcode INT, -> OUT
养老院管理系统mysql建表记录.txt
养老院管理系统mysql建表记录.txt
清空数据库中所有表记录 记录ID恢复从0开始
1.搜索出所有表名,构造为一条SQL语句 代码如下: declare @trun_name varchar(8000) set @trun_name=” select @trun_name=@trun_name + ‘truncate table ‘ + [name] + ‘ ‘ from sysobjects where xtype=’U’ and status > 0 exec (@trun_name) 该方法适合表不是非常多的情况,否则表数量过多,超过字符串的长度,不能进行完全清理. 2.利用游标清理所有表 代码如下: declare @trun_name varchar(50)
MySQL存储过程中一些基本的异常处理教程
有时候,不希望存储过程抛出错误中止执行,而是希望返回一个错误码。 Mysql 支持异常处理,通过定义 CONTINUE/EXIT 异常处理的 HANDLER 来捕获 SQLWARNING/NOT FOUND/SQLEXCEPTION (警告 / 无数据 / 其他异常)。其中, FOR 后面可以改为 SQLWARNING, NOT FOUND, SQLEXCEPTION 来指示所有异常都处理,相当于 oracle 中的 others 。例如,当不进行异常处理时,以下代码将直接抛出一个 ERROR 1062 (23000) 错误: CREATE PROCEDURE test_proc_ins1


