Объявление курсора в DB2 с другим действием приводит к сбою развертывания.

Осмотрев весь Интернет, я должен вернуться к SO :).

Резюме:

Хранимая процедура DB2 не развертывается, когда раскомментированы 3 строки, в противном случае она работает отлично. Есть предположения, почему? К вашему сведению, я новичок в DB2.

Код процедуры:

CREATE PROCEDURE TESTDB2.PROC_NAME_GOES_HERE(
    IN  P_ID INT ,
    IN  P_SEQ_NO_2 SMALLINT,
    IN  P_SEQ_NO DECIMAL(3,0))

    RESULT SETS 1
    LANGUAGE SQL
    NOT DETERMINISTIC
    CALLED ON NULL INPUT
    FENCED
    MODIFIES SQL DATA
    COLLID TESTDB2
    WLM ENVIRONMENT TDB2ENV
    ASUTIME LIMIT 5000000
    RUN OPTIONS 'NOTEST(NONE,*,*,*)' 
P1: BEGIN

    DECLARE V_SEQ_NO DECIMAL(3,0);
    DECLARE V_LVL INT;

    DECLARE GLOBAL TEMPORARY TABLE SESSION.SEQ_NO_TABLE
    (LVL INT NOT NULL, SEQ_NO DECIMAL(3,0) NOT NULL);

    SET V_LVL = 0;

    INSERT INTO SESSION.SEQ_NO_TABLE(LVL, SEQ_NO)
    VALUES(V_LVL, P_SEQ_NO);

    --**************************************************--
    --  If I uncomment following 3 lines, deployment fails --

    --DECLARE CUR_FFB CURSOR WITH RETURN FOR
    --SELECT * FROM SESSION.SEQ_NO_TABLE;
    --OPEN CUR_FFB;

END P1

Ошибка:

Разверните TESTDB2.PROC_NAME_GOES_HERE(INTEGER, SMALLINT, DECIMAL(3, 0))

Бег

TESTDB2.PROC_NAME_GOES_HERE — развертывание началось.

Вызов утилиты сборки SYSPROC.DSNTPSMP...

CONVERT SQLPRINT 1 1DB2 SQL PRECOMPILER VERSION 9 REL. 1.0 СТРАНИЦА 1

CONVERT SQLPRINT 2 0УКАЗАНЫ ОПЦИИ: STDSQL(NO) NEWFUN(YES) HOST(SQL) ONEPASS MAR(1,80) CCSID(37)

CONVERT SQLPRINT 3 DSNHDECP LOADED FROM - (SYS2.DB2T.DSNEXIT(DSNHDECP))

CONVERT SQLPRINT 4 0 ИСПОЛЬЗУЕМЫЕ ОПЦИИ — ЗАДАННЫЕ ИЛИ ПО УМОЛЧАНИЮ

ПРЕОБРАЗОВАТЬ SQLPRINT 5 APOST

ПРЕОБРАЗОВАТЬ SQLPRINT 6 APOSTSQL

ПРЕОБРАЗОВАТЬ SQLPRINT 7 ПРИСОЕДИНИТЬ (TSO)

ПРЕОБРАЗОВАТЬ SQLPRINT 8 CCSID(37)

ПРЕОБРАЗОВАТЬ SQLPRINT 9 NOPADNTSTR

ПРЕОБРАЗОВАТЬ SQLPRINT 10 ПОДКЛЮЧИТЬ(2)

ПРЕОБРАЗОВАТЬ SQLPRINT 11 ДЕК (15)

ПРЕОБРАЗОВАТЬ ФЛАГ SQLPRINT 12 (I)

ПРЕОБРАЗОВАТЬ SQLPRINT 13 HOST(SQL)

ПРЕОБРАЗОВАТЬ SQLPRINT 14 LINECOUNT (60)

ПРЕОБРАЗОВАТЬ ПОЛЯ SQLPRINT 15 (1,80)

ПРЕОБРАЗОВАТЬ SQLPRINT 16 NEWFUN (ДА)

ПРЕОБРАЗОВАТЬ SQLPRINT 17 ONEPASS

ПРЕОБРАЗОВАТЬ ВАРИАНТЫ SQLPRINT 18

ПРЕОБРАЗОВАТЬ SQLPRINT 19 ПЕРИОД

ПРЕОБРАЗОВАТЬ SQLPRINT 20 NOSOURCE

ПРЕОБРАЗОВАТЬ SQLPRINT 21 STDSQL(НЕТ)

ПРЕОБРАЗОВАТЬ SQLPRINT 22 SQL(DB2)

ПРЕОБРАЗОВАТЬ SQLPRINT 23 NOXREF

CONVERT SQLPRINT 24 СООБЩЕНИЯ ПРЕДКОМПИЛЬЕРА SQL 1DB2 СТРАНИЦА 2

CONVERT SQLPRINT 25 0DSNH016I E DSNHPARS LINE 26 COL 10 "GLOBAL" ТРЕБУЕТСЯ

CONVERT SQLPRINT 26 DSNH104I E DSNHPARS LINE 26 COL 10 НЕПРАВИЛЬНЫЙ СИМВОЛ "CUR_FFB". НЕКОТОРЫЕ СИМВОЛЫ, КОТОРЫЕ МОГУТ БЫТЬ ЗАКОННЫМИ: ГЛОБАЛЬНЫЕ

CONVERT SQLPRINT 27 СТАТИСТИКА ПРЕДКОМПИЛЯТОРА SQL 1DB2 СТРАНИЦА 3

ПРЕОБРАЗОВАТЬ SQLPRINT 28 0ИСТОЧНАЯ СТАТИСТИКА

CONVERT SQLPRINT 29 SOURCE LINES READ: 32

ПРЕОБРАЗОВАТЬ SQLPRINT 30 КОЛИЧЕСТВО СИМВОЛОВ: 14

ПРЕОБРАЗОВАТЬ SQLPRINT 31 БАЙТ ТАБЛИЦЫ СИМВОЛОВ, ИСКЛЮЧАЯ АТРИБУТЫ: 1952

CONVERT SQLPRINT 32 - ДЛЯ ЭТОЙ ПРОГРАММЫ БЫЛО 2 СООБЩЕНИЯ.

CONVERT SQLPRINT 33 БЫЛО 0 СООБЩЕНИЙ, ПОДАВЛЕННЫХ ОПЦИЕЙ ФЛАГА.

CONVERT SQLPRINT 34 272544 БАЙТА ПАМЯТИ БЫЛО ИСПОЛЬЗОВАНО ПРЕДКОМПИЛЯТОРОМ.

ПРЕОБРАЗОВАТЬ SQLPRINT 35 КОД ВОЗВРАТА 8

CONVERT SQLTERM 1 DSNH016I E DSNHPARS LINE 26 COL 10 "GLOBAL" ТРЕБУЕТСЯ

CONVERT SQLTERM 2 DSNH104I E DSNHPARS LINE 26 COL 10 ILLEGAL SYMBOL "CUR_FFB". НЕКОТОРЫЕ СИМВОЛЫ, КОТОРЫЕ МОГУТ БЫТЬ ЗАКОННЫМИ: ГЛОБАЛЬНЫЕ

CONVERT SQLTERM 3 CREATE PROCEDURE TESTDB2.PROC_NAME_GOES_HERE(IN P_ID INT,IN P_SEQ_NO_2 SMALLINT,IN P_SEQ_NO DECIMAL(3,0))RESULT S

ПРЕОБРАЗОВАТЬ SQLTERM 4 ETS 1 ЯЗЫК SQL НЕ ДЕТЕРМИНИСТИЧЕСКИЙ ВЫЗЫВАЕТСЯ ПРИ НУЛЕВОМ ВВОДЕ ОГРАНИЧЕННЫЕ ИЗМЕНЕНИЯ SQL DATA COLLID TESTDB2 WLM ENVIRONMENT TDB2ENV ASUTIME

CONVERT SQLTERM 5 LIMIT 5000000 RUN OPTIONS'NOTEST(NONE,,,*)'P1 : BEGIN DECLARE V_SEQ_NO DECIMAL(3,0); ОБЪЯВИТЬ V_LVL INT ; ЗАЯВИТЬ ГЛОБАЛЬНЫЙ ВРЕМЕННЫЙ

CONVERT SQLTERM 6 Y TABLE SESSION.SEQ_NO_TABLE(LVL INT NOT NULL,SEQ_NO DECIMAL(3,0)NOT NULL); УСТАНОВИТЬ V_LVL = 0 ; ВСТАВИТЬ В SESSION.SEQ_NO_TABLE(LVL,S

ПРЕОБРАЗОВАТЬ SQLTERM 7 EQ_NO) ЗНАЧЕНИЯ (V_LVL, P_SEQ_NO); ЗАЯВИТЬ CUR_FFB

ПРЕОБРАЗОВАТЬ SQLTERM 8

ПРЕОБРАЗОВАТЬ СТАТИСТИЧЕСКИЕ ИСТОЧНИКИ SQLTERM 9

CONVERT SQLTERM 10 SOURCE LINES READ: 32

ПРЕОБРАЗОВАТЬ SQLTERM 11 КОЛИЧЕСТВО СИМВОЛОВ: 14

ПРЕОБРАЗОВАТЬ SQLTERM 12 БАЙТОВ ТАБЛИЦЫ СИМВОЛОВ, ИСКЛЮЧАЯ АТРИБУТЫ: 1952

CONVERT SQLTERM 13 ДЛЯ ЭТОЙ ПРОГРАММЫ БЫЛО 2 СООБЩЕНИЯ.

CONVERT SQLTERM 14 БЫЛО 0 СООБЩЕНИЙ, ПОДАВЛЕННЫХ ОПЦИЕЙ ФЛАГА.

CONVERT SQLTERM 15 272544 БАЙТА ПАМЯТИ БЫЛО ИСПОЛЬЗОВАНО ПРЕДКОМПИЛЯТОРОМ.

ПРЕОБРАЗОВАТЬ SQLTERM 16 КОД ВОЗВРАТА 8

DSNTPSMP CONSOLE 1 * Процессор процедур SQL DB2 V9R1 DSNTPSMP 1.21 (PM09148 23-03-2010)

DSNTPSMP CONSOLE 2 Предупреждения и/или ошибки преобразования языка, rc=8

DSNTPSMP CONSOLE 3 Предварительная компиляция PSM завершилась неудачно, продолжение невозможно

Сводка DSNTPSMP 1 Запрос: процедура ALTER_REBUILD TESTDB2.PROC_NAME_GOES_HERE не завершена.

Запрошена вспомогательная функция сборки: ALTER_REBUILD

SYSPROC.DSNTPSMP — возвращено +8

TESTDB2.PROC_NAME_GOES_HERE — Ошибка развертывания.

TESTDB2.PROC_NAME_GOES_HERE — Откат выполнен успешно.


person Abhinav    schedule 24.04.2013    source источник


Ответы (1)


Итак, наконец, это сработало для меня с небольшой модификацией, добавив решение для всех, кто может столкнуться с этой путаницей позже.

Решение. Объявите курсор перед объявлением таблицы.

Единственное, что меня все еще смущает, это то, как я могу создать курсор на объекте, которого еще даже не существует.

CREATE PROCEDURE TESTDB2.PROC_NAME_GOES_HERE(
IN  P_ID INT ,
IN  P_SEQ_NO_2 SMALLINT,
IN  P_SEQ_NO DECIMAL(3,0))

RESULT SETS 1
LANGUAGE SQL
NOT DETERMINISTIC
CALLED ON NULL INPUT
FENCED
MODIFIES SQL DATA
COLLID TESTDB2
WLM ENVIRONMENT TDB2ENV
ASUTIME LIMIT 5000000
RUN OPTIONS 'NOTEST(NONE,*,*,*)' 
P1: BEGIN

    DECLARE V_SEQ_NO DECIMAL(3,0);
    DECLARE V_LVL INT;

    DECLARE CUR_FFB CURSOR WITH RETURN FOR
    SELECT * FROM SESSION.SEQ_NO_TABLE;

    DECLARE GLOBAL TEMPORARY TABLE SESSION.SEQ_NO_TABLE
    (LVL INT NOT NULL, SEQ_NO DECIMAL(3,0) NOT NULL);

    SET V_LVL = 0;

    INSERT INTO SESSION.SEQ_NO_TABLE(LVL, SEQ_NO)
    VALUES(V_LVL, P_SEQ_NO);

    OPEN CUR_FFB;

END P1
person Abhinav    schedule 25.04.2013