1

インターネット中を見回した後、私はSOに戻らなければなりません:)。

概要:

3 行のコメントを外すと、DB2 ストアド プロシージャはデプロイされません。それ以外の場合は、完全に正常に動作します。なぜだと思いますか?参考までに、私は 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 プリコンパイラ バージョン 9 REL。1.0 ページ 1

CONVERT SQLPRINT 2 0OPTIONS SPECIFIED: 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 0OPTIONS USED - 指定またはデフォルト

SQLPRINT 5 APOST の変換

CONVERT SQLPRINT 6 APOSTSQL

CONVERT SQLPRINT 7 ATTACH(TSO)

CONVERT SQLPRINT 8 CCSID(37)

CONVERT SQLPRINT 9 NOPADNTSTR

CONVERT SQLPRINT 10 CONNECT(2)

CONVERT SQLPRINT 11 DEC(15)

CONVERT SQLPRINT 12 フラグ(I)

CONVERT SQLPRINT 13 ホスト (SQL)

CONVERT SQLPRINT 14 LINECOUNT(60)

CONVERT SQLPRINT 15 MARGINS(1,80)

CONVERT SQLPRINT 16 NEWFUN(YES)

CONVERT SQLPRINT 17 ONEPASS

SQLPRINT 18 オプションの変換

CONVERT SQLPRINT 19 PERIOD

SQLPRINT 20 NOSOURCE の変換

CONVERT SQLPRINT 21 STDSQL(いいえ)

CONVERT SQLPRINT 22 SQL(DB2)

CONVERT SQLPRINT 23 NOXREF

CONVERT SQLPRINT 24 1DB2 SQL プリコンパイラ メッセージ ページ 2

CONVERT SQLPRINT 25 0DSNH016I E DSNHPARS 行 26 COL 10 "GLOBAL" が必要です

CONVERT SQLPRINT 26 DSNH104I E DSNHPARS LINE 26 COL 10 ILLEGAL SYMBOL "CUR_FFB". 合法であるかもしれないいくつかのシンボルは次のとおりです: グローバル

CONVERT SQLPRINT 27 1DB2 SQL プリコンパイラ統計ページ 3

CONVERT SQLPRINT 28 0SOURCE STATISTICS

CONVERT SQLPRINT 29 ソース行の読み取り: 32

CONVERT SQLPRINT 30 シンボル数: 14

属性を除く SQLPRINT 31 シンボル テーブル バイトの変換: 1952

CONVERT SQLPRINT 32 - このプログラムには 2 つのメッセージがありました。

CONVERT SQLPRINT 33 フラグ オプションによって抑制されたメッセージはありません。

CONVERT SQLPRINT 34 272544 バイトのストレージがプリコンパイラによって使用されました。

CONVERT SQLPRINT 35 戻りコードは 8 です

CONVERT SQLTERM 1 DSNH016I E DSNHPARS 行 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

CONVERT SQLTERM 4 ETS 1 LANGUAGE SQL NOT DETERMINISTIC CALLED ON NULL INPUT FENCED MODIFIES 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); DECLARE V_LVL INT ; グローバル TEMPORAR を宣言する

CONVERT SQLTERM 6 Y 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,S

CONVERT SQLTERM 7 EQ_NO)VALUES(V_LVL,P_SEQ_NO); CUR_FFB を宣言する

SQLTERM 8 の変換

SQLTERM 9 ソース統計の変換

CONVERT SQLTERM 10 ソース行 READ: 32

CONVERT SQLTERM 11 記号の数: 14

属性を除く SQLTERM 12 SYMBOL テーブル バイトの変換: 1952

CONVERT SQLTERM 13 このプログラムには 2 つのメッセージがありました。

CONVERT SQLTERM 14 フラグ オプションによって抑制されたメッセージはありません。

CONVERT SQLTERM 15 272544 バイトのストレージがプリコンパイラによって使用されました。

SQLTERM 16 を変換すると、戻りコードは 8 になります。

DSNTPSMP コンソール 1 * DB2 V9R1 SQL プロシージャー プロセッサー DSNTPSMP 1.21 (PM09148 2010-03-23)

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 - ロールバックが正常に完了しました。

4

1 に答える 1

0

最後に、この混乱に後で遭遇する可能性のある人のためのソリューションを追加して、わずかな変更でうまくいきました。

解決策 -テーブルを宣言する前にカーソルを宣言します。

まだ私を混乱させているのは、まだ存在していないオブジェクトにカーソルを作成する方法だけです。

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
于 2013-04-25T19:07:02.700 に答える