Teradata存储过程中的错误处理

时间:2016-09-15 04:59:57

标签: stored-procedures ssis teradata

我正在尝试在TERADATA中开发存储过程来处理和管理异常。

存储过程应该将错误引发给调用者,这是一个SSIS包。

我试图通过创建仅用于说明的存储过程来说明这一点。

我有这些表格:

表-A

- ID           INT
- ITEM_NUM     INT
- DESC         VARCHAR(20)
- CREATE_DTTM  VARCHAR(2O)

表-B

- ID           INT
- ITEM_NUM     INT
- DESC         VARCHAR(20)
- CREATE_DTTM  VARCHAR(2O)

我有两个表将从两个SELECT语句中插入数据。

REPLACE PROCEDURE csTest2()
SQL SECURITY OWNER
BEGIN
    DECLARE varErrorMessage char(256);
    DECLARE varSQLState char(5);
    DECLARE varReturnCode char(5);

    DECLARE varRollbackNeededInd char(1);           /* transaction mgt */
    SET varRollbackNeededInd = 'N';

    SET varReturnCode = '00000';
    SET varErrorMessage = '';

    BEGIN TRANSACTION;

    -- USING A SINGLE HANDLER WITH MULTIPLE STATEMENTS
    -- PLANING TO CHANGE ERROR MESSAGE IN EACH STATEMENT.
    ins6: BEGIN
        DECLARE EXIT HANDLER FOR SQLEXCEPTION 

        H99:Begin
            set varSQLState = SQLSTATE;
            set varErrorMessage= 'This message should not be displayed'; -- 
        end H99;

        -- IMAGINE THAT I AM GETTING THE VALUES AS INPUT PARAMERS IN THE PROCEDURE 
        INSERT INTO "Table_A"
         (ID , ITEM_NUM, DESC, CREATE_DTTM)
         SELECT 1, '222', 'SOME DESC',CURRENT_TIMESTAMP;


         H98:Begin
             set varSQLState = SQLSTATE;
             set varErrorMessage= 'This message is displayed, ITEM_NUM invalid characters';
         end H98;

        -- NOW I AM DOING A SECOND INSERT TO table b WITH INVALID DATA
        -- THE VALUE FOR THE ITEM NUMBER CONTAINS ALPHANUMERICE CHARACTERS
        INSERT INTO "Table_b"
         (ID , ITEM_NUM, DESC, CREATE_DTTM)
         SELECT 1, '333F', 'SOME DESC',CURRENT_TIMESTAMP;

    END ins6;

    EndTrans: BEGIN

        IF varSQLState <> '0' THEN
            SET varRollbackNeededInd = 'Y';
            SET varReturnCode = '9999';
        END IF;

        IF  varRollbackNeededInd = 'Y' THEN
            ROLLBACK;        -- ROLLBACK AND SEND ERROR TO CALLER
            SIGNAL SQLSTATE 'U0123' SET MESSAGE_TEXT = 'SQlState is - ' || varSQLSTATE || ' - and error is - ' || varErrorMessage;
        ELSE
            END TRANSACTION; -- COMMIT TRANSACTION

        END IF;
   END EndTrans;

END;

我面对上述存储过程的问题是我得到的错误消息不是我期望的错误消息。由于错误是在我的第二个声明中故意创建的,我希望得到:显示此消息,ITEM_NUM无效字符但我收到此消息不应显示

现在如果我修改PROCEDURE有多个处理程序,每个语句一个,我确实得到了正确的错误消息,但是现在因为我故意在第一个语句中生成错误它不会终止程序,它处理错误并设置正确的消息,但继续处理下一个我不希望这样做的语句,那么如何终止此过程?

REPLACE PROCEDURE csTest2()
SQL SECURITY OWNER
BEGIN

    DECLARE varErrorMessage char(256);
    DECLARE varSQLState char(5);
    DECLARE varReturnCode char(5);

    DECLARE varRollbackNeededInd char(1);           /* transaction mgt */
    SET varRollbackNeededInd = 'N';

    SET varReturnCode = '00000';
    SET varErrorMessage = '';

    BEGIN TRANSACTION;

    ins6: BEGIN
        DECLARE EXIT HANDLER FOR SQLEXCEPTION 

        H99:Begin
            set varSQLState = SQLSTATE;
            set varErrorMessage= 'Error is displayed in this case because ITEM_NUM';

        -- ERROR IS PRESENT IN THIS STATEMENT AND SHOULD TERMINATE THE PROCEDURE. 
        INSERT INTO "Table_A"
         (ID , ITEM_NUM, DESC, CREATE_DTTM)
         SELECT 1, '222F', 'SOME DESC',CURRENT_TIMESTAMP;
    END ins6;

    ins7: BEGIN      
         H98:Begin
             set varSQLState = SQLSTATE;
             set varErrorMessage= 'no error is displayed in this case';
         end H98;

        -- NO ERROR IS EXPECTED, BUT IT SHOULD NOT REACH HERE SINCE WE HAD ERROR ON FIRST STATEMENT. 
        INSERT INTO "Table_b"
         (ID , ITEM_NUM, DESC, CREATE_DTTM)
         SELECT 1, '333', 'SOME DESC',CURRENT_TIMESTAMP;

    END ins7;

    EndTrans: BEGIN

        IF varSQLState <> '0' THEN
            SET varRollbackNeededInd = 'Y';
            SET varReturnCode = '9999';
        END IF;

        IF  varRollbackNeededInd = 'Y' THEN
            ROLLBACK;        -- ROLLBACK AND SEND ERROR TO CALLER
            SIGNAL SQLSTATE 'U0123' SET MESSAGE_TEXT = 'SQlState is - ' || varSQLSTATE || ' - and error is - ' || varErrorMessage;
        ELSE
            END TRANSACTION; -- COMMIT TRANSACTION

        END IF;
   END EndTrans;

END;

0 个答案:

没有答案