--业务表
DROP TABLE TestTable; CREATE TABLE TestTable (
T_ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 0, INCREMENT BY 1, NO CACHE ),
T_HalfYear VARCHAR(12) NOT NULL,--格式形如 '2006年上半年' T_Year SMALLINT, PRIMARY KEY (T_ID) );
--存储过程出错日志记录表 DROP TABLE TestLog; CREATE TABLE TestLog (
T_ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 0, INCREMENT BY 1, NO CACHE ),
T_Message VARCHAR(100) NOT NULL,--记录存储过程出错信息 PRIMARY KEY (T_ID) );
--删除该存储过程
DROP PROCEDURE TestProc()@
--创建该存储过程
CREATE PROCEDURE TestProc() LANGUAGE SQL BEGIN
--变量定义
DECLARE sqlcode INTEGER DEFAULT 0; DECLARE sqlstate CHAR(5);
DECLARE v_Message CHAR(100);
--SQL异常处理,插入到错误日志表中 DECLARE exit handler FOR sqlexception BEGIN
--开始异常处理
VALUES ('存储过程 TestProc 调用失败,SQLCode:' || CHAR(sqlcode) || 'SQLState:' || CHAR(sqlstate))
INTO v_Message;
INSERT INTO TestLog(T_Message)
VALUES (v_Message);
--显式提交事务 COMMIT;
--设置存储过程返回值 SIGNAL SQLSTATE '99999'
SET MESSAGE_TEXT = 'TestProc throw error'; END;
--开始实现业务逻辑 UPDATE TestTable
SET T_Year = INTEGER(SUBSTR(T_HalfYear,1,4));
END@
--插入正常的数据,观察存储过程执行情况 INSERT INTO TestTable (T_HalfYear) VALUES ('2006年上半年');
--执行存储过程 CALL TestProc;
------------------------------------------------------------ --CLP
CALL TestProc
返回状态 = 0
SQLCODE: 0
------------------------------------------------------------
--查询业务表
SELECT * FROM TestTable;
------------------------------------------------------------ T_ID T_HalfYear T_Year
0 2006年上半年 2006
------------------------------------------------------------
--插入脏数据,观察存储过程执行情况 INSERT INTO TestTable (T_HalfYear) VALUES ('200年上半年');
--执行存储过程
CALL TestProc;
------------------------------------------------------------ --CLP
CALL TestProc
SQL0438N 应用程序发生错误,诊断文本:\。
SQLSTATE=99999
SQL0438N 应用程序发生错误,诊断文本:\------------------------------------------------------------
--查询业务表
SELECT * FROM TestTable;
------------------------------------------------------------ T_ID T_HalfYear T_Year 0 2006年上半年 2006 1 200年上半年
------------------------------------------------------------
--查询存储过程错误日志表 SELECT * FROM TestLog;
------------------------------------------------------------ T_ID T_Message
0 存储过程 TestProc 调用失败,SQLCode:-420 SQLState:22018
DROP TABLE TestTable; DROP TABLE TestLog;
DROP PROCEDURE TestProc;

