Получить SQLCODE и SQLSTATE из хранимой процедуры с выполнением оператора из переменной - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть это:

CREATE OR replace PROCEDURE log_test
                                 ( IN QUERY VARCHAR(24576),
                                   IN LOGTBL varchar(20) ) LANGUAGE SQL
BEGIN
DECLARE v_select_query VARCHAR(24576);
DECLARE v_query VARCHAR(24576);
DECLARE v_logtbl varchar(20);
DECLARE v_errormsg varchar(2048);
DECLARE v_time TIMESTAMP;
DECLARE v_temp_select varchar(1024);
DECLARE stmt STATEMENT;
DECLARE SQLCODE INTEGER DEFAULT 0;
DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
DECLARE CONTINUE HANDLER 
FOR SQLEXCEPTION,SQLWARNING,NOT FOUND
    SET v_sqlcode = SQLCODE;




set v_select_query  = 'Set (?) = ('||QUERY||')';
set v_query  = 'Set (?) = ('||QUERY||')';
set v_bezug  = bezug;
set v_logtbl = logtbl;
set v_time   = CURRENT TIMESTAMP;



PREPARE stmt from v_select_query;

EXECUTE stmt into v_temp_select;

END @

Запрос оператора:

 select count(*) from testtbl;

и без перехвата sqlstate работает.

В результате я хочу, чтобы sqlcode был сохранен в переменных, когда оператор выполнен успешно или не выполнен.Однако теперь я получаю только сообщение об ошибке, которое после «неожиданного токена».

Есть идеи как это исправить?Позже я хочу записать sqlcode со вставкой в ​​другую таблицу.

DB2 Windows v10.5

Спасибо за вашу помощь

1 Ответ

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

Согласно комментариям, исправьте синтаксические ошибки в вашем коде.Приведенный ниже пример будет скомпилирован для Db2-LUW, но в вашем коде есть другие ошибки и проблемы, которые вы обнаружите позже при тестировании.

CREATE OR replace PROCEDURE log_test
( IN QUERY VARCHAR(24576),
  IN LOGTBL varchar(20) ) 
LANGUAGE SQL
specific log_test
BEGIN
    DECLARE SQLCODE INTEGER DEFAULT 0;
    DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
    DECLARE v_select_query VARCHAR(24576);
    DECLARE v_query VARCHAR(24576);
    DECLARE v_logtbl varchar(20);
    DECLARE v_errormsg varchar(2048);
    DECLARE v_time TIMESTAMP;
    DECLARE v_temp_select varchar(1024);
    DECLARE v_sqlcode INTEGER;
    DECLARE v_sqlstate CHAR(5);
    DECLARE v_bezug varchar(1024);

    DECLARE stmt STATEMENT;
    DECLARE CONTINUE HANDLER FOR SQLWARNING,NOT FOUND
        SET v_sqlcode = SQLCODE;
    DECLARE EXIT HANDLER FOR SQLEXCEPTION 
        SET v_sqlstate = SQLSTATE;


    set v_select_query  = 'Set (?) = ('||QUERY||')';
    set v_query  = 'Set (?) = ('||QUERY||')';
    set v_bezug  = 'bezug';
    set v_logtbl = logtbl;
    set v_time   = CURRENT TIMESTAMP;



    PREPARE stmt from v_select_query;

    EXECUTE stmt into v_temp_select;

END@
...