Добавление SQL EXIT HANDLER FOR SQLEXCEPTION вызывает синтаксическую ошибку и неожиданный текст - PullRequest
0 голосов
/ 27 ноября 2018

Я хотел бы добавить несколько процедур к процедуре, упрощенная текущая версия выглядит следующим образом:

REPLACE PROCEDURE DM.AZ_SP ( IN IN_S_DATE DATE, IN IN_E_DATE DATE, OUT sqlMsg_result VARCHAR(133) )
SQL SECURITY INVOKER
BEGIN

    DECLARE V_S_DATE DATE;
    DECLARE V_E_DATE DATE;
    DECLARE V_REPORT_DATE DATE;
    DECLARE sted_id INTEGER DEFAULT 0;

    SET V_S_DATE = IN_S_DATE;
    SET V_E_DATE = IN_E_DATE;
    SET sted_id = 0;



    SET sted_id = 1;
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
            BEGIN
                insert into DM.t_sp_logs values (
                    current_timestamp
                ,   'AZ_SP'
                ,   sted_id
                ,   'ERROR code: '  || :SQL_CODE
                );   -- Missing/Invalid SQL statement'E(3707):Syntax error, expected something like an 'END' keyword between ';' and the 'DECLARE' keyword.'.
            END; 
END; -- Unexpected text 'END'.

Что здесь не так и как это исправить?

1 Ответ

0 голосов
/ 27 ноября 2018

Существует порядок объявлений:

DECLARE variables/condition handlers
DECLARE cursors
DECLARE handlers

Первый SET завершает часть объявления.

Вам необходимо переместить SET после обработчика.

REPLACE PROCEDURE DM.AZ_SP ( IN IN_S_DATE DATE, IN IN_E_DATE DATE, OUT sqlMsg_result VARCHAR(133) )
SQL SECURITY INVOKER
BEGIN

    DECLARE V_S_DATE DATE;
    DECLARE V_E_DATE DATE;
    DECLARE V_REPORT_DATE DATE;
    DECLARE sted_id INTEGER DEFAULT 0;

    DECLARE EXIT HANDLER FOR SQLEXCEPTION
            BEGIN
                insert into DM.t_sp_logs values (
                    current_timestamp
                ,   'AZ_SP'
                ,   sted_id
                ,   'ERROR code: '  || :SQL_CODE
                );   -- Missing/Invalid SQL statement'E(3707):Syntax error, expected something like an 'END' keyword between ';' and the 'DECLARE' keyword.'.
            END; 

    SET V_S_DATE = IN_S_DATE;
    SET V_E_DATE = IN_E_DATE;
    SET sted_id = 0;



    SET sted_id = 1;

END; 

или вы используете вложенный BEGIN / END, после каждого BEGIN

REPLACE PROCEDURE DM.AZ_SP ( IN IN_S_DATE DATE, IN IN_E_DATE DATE, OUT sqlMsg_result VARCHAR(133) )
SQL SECURITY INVOKER
BEGIN

    DECLARE V_S_DATE DATE;
    DECLARE V_E_DATE DATE;
    DECLARE V_REPORT_DATE DATE;
    DECLARE sted_id INTEGER DEFAULT 0;

    SET V_S_DATE = IN_S_DATE;
    SET V_E_DATE = IN_E_DATE;
    SET sted_id = 0;



    SET sted_id = 1;
    BEGIN
        DECLARE EXIT HANDLER FOR SQLEXCEPTION
            BEGIN
                insert into DM.t_sp_logs values (
                    current_timestamp
                ,   'AZ_SP'
                ,   sted_id
                ,   'ERROR code: '  || :SQL_CODE
                );   -- Missing/Invalid SQL statement'E(3707):Syntax error, expected something like an 'END' keyword between ';' and the 'DECLARE' keyword.'.
            END;
        ..... 
    END;
END;
появляется новая часть объявления
...