我有一个从不受监控的系统调用的存储过程,我需要捕获发生的所有错误。
目前,我可以捕获数据格式正确时发生的任何错误,但不能捕获数据类型不匹配时发生的错误。
有人有捕获因格式错误的数据而发生的错误的经验吗?
这是我的测试文件和程序:
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';
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';
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 是正确捕获的错误。运行 3 是一次故意的错误数据运行,似乎没有被我的错误捕获捕获。
您将无法在第三次运行中捕获错误。
基本上,错误是在数据库到达存储过程之前发生的。
假设您的外部系统正在使用参数正确调用存储过程,而不是构建动态字符串。那么错误就会被抛出到外部系统中,甚至不会到达 Db2。