DB2/iSeries 存储过程错误捕获 SQL 状态

问题描述 投票:0回答:1

我有一个从不受监控的系统调用的存储过程,我需要捕获发生的所有错误。

目前,我可以捕获数据格式正确时发生的任何错误,但不能捕获数据类型不匹配时发生的错误。

有人有捕获因格式错误的数据而发生的错误的经验吗?

这是我的测试文件和程序:

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 是一次故意的错误数据运行,似乎没有被我的错误捕获捕获。 Three test runs

sql stored-procedures error-handling db2-400
1个回答
0
投票

您将无法在第三次运行中捕获错误。

基本上,错误是在数据库到达存储过程之前发生的。

假设您的外部系统正在使用参数正确调用存储过程,而不是构建动态字符串。那么错误就会被抛出到外部系统中,甚至不会到达 Db2。

© www.soinside.com 2019 - 2024. All rights reserved.