DB2/iSeries存储过程如何捕获数据类型不匹配错误?
捕获DB2/iSeries存储过程中数据类型不匹配的错误
我有一个从无人监控系统调用的DB2/iSeries存储过程,需要捕获所有发生的错误。目前能捕获数据格式合规时的错误,但无法捕获数据类型不匹配的错误。求问如何捕获这类由格式错误数据引发的错误?
补充说明:任何可捕获该错误的方案均可,不局限于存储过程内部。若知晓此类错误的日志存储位置,也能提供帮助,任何相关信息都有用。
测试用存储过程代码
CREATE OR REPLACE PROCEDURE test_error_trap ( IN_TEST_DATA_01 DECIMAL(10,0) DEFAULT 0, IN_TEST_DATA_02 CHAR(50) DEFAULT ' ' ) SPECIFIC SPROC001 LANGUAGE SQL MODIFIES SQL DATA BEGIN DECLARE Exit HANDLER FOR SQLEXCEPTION BEGIN DECLARE sqlstate$ CHAR(5) DEFAULT '00000'; DECLARE sqlcode# integer; DECLARE sendMSG varchar(100); SET sqlstate$ = SQLSTATE; SET sqlcode# = SQLCODE; SET sendMSG = 'SQL Error Code from trap = ' || sqlcode#; INSERT INTO LOGERROR ( OUT_SQLSTATE, OUT_SQLCODE ) VALUES ( sqlstate$, sqlcode# ); SIGNAL SQLSTATE sqlstate$ SET MESSAGE_TEXT = sendMSG; END; INSERT INTO LOGPASS ( TEST_DATA_01, TEST_DATA_02 ) VALUES ( IN_TEST_DATA_01, IN_TEST_DATA_02 ); END; LABEL ON SPECIFIC PROCEDURE SPROC001 IS 'SQL Error Trap Test';
LOGPASS表定义
CREATE OR REPLACE TABLE LOGPASS ( -- Test Data 01 TEST_DATA_01 FOR COLUMN TST01 DECIMAL(10 , 0) DEFAULT 0 NOT NULL, -- Test Data 02 TEST_DATA_02 FOR COLUMN TST02 CHAR(50) DEFAULT ' ' NOT NULL, CONSTRAINT LOGPASS_PK PRIMARY KEY ( TEST_DATA_01, TEST_DATA_02 ) ) RCDFMT PASSREC ; LABEL ON TABLE LOGPASS IS 'Stored Procedure Pass Log';
LOGERROR表定义
CREATE OR REPLACE TABLE LOGERROR ( -- SQL State OUT_SQLSTATE FOR COLUMN ERRSQLS CHAR(5) DEFAULT ' ' NOT NULL, -- SQL Code OUT_SQLCODE FOR COLUMN ERRSQLC INTEGER DEFAULT 0 NOT NULL, -- RECORD TIMESTAMP OUT_RECORD_TIMESTAMP FOR COLUMN DLRECTS TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, CONSTRAINT LOGERROR_PK PRIMARY KEY ( OUT_RECORD_TIMESTAMP ) ) RCDFMT ERRORREC ; LABEL ON TABLE LOGERROR IS 'Stored Procedure Error Log';
测试运行情况
- 运行1:正常运行,无错误
- 运行2:触发合规性错误,已被存储过程的异常处理器正确捕获并记录到LOGERROR表
- 运行3:传入错误数据(数据类型不匹配),但未被存储过程捕获,无错误日志记录
内容的提问来源于stack exchange,提问作者Kenneth McKinney
相关产品推荐
相关产品推荐

