web-dev-qa-db-ja.com

DB2が、作成した一時テーブルに挿入されません。

私は通常SQL Serverを使用しますが、このプロジェクトではDB2を学ぶ必要があります。以下のコードを機能させることができれば、プロジェクト全体に設定できます。以下は、私が働けないものの基本的な例です。私がやりたいのは、Created Global Temp Table(CGTT)を作成し、それにデータを追加することだけです。以下の同じコードは、宣言されたグローバル一時テーブルを使用する場合に機能しますが、私の目的のためにCGTTが必要です。

CREATE GLOBAL TEMPORARY TABLE TEST_TBL(
    KEY_ID BIGINT,
    SOMETEXT VARCHAR(10)
);

INSERT INTO USERID.TEST_TBL
VALUES(123456,'TEST TEST');

SELECT * FROM USERID.TEST_TBL;
SELECT COUNT(*) FROM USERID.TEST_TBL;

上記はエラーなしで問題なく実行されます。挿入が実行されると、「1行が更新されました」と表示されます。ただし、select *とcount(*)はどちらも結果が0です。これは権限の問題かどうか疑問に思っていますが、CGTTを作成する権限は持っていても、挿入することはできませんか?

提供された助けは最も高く評価されます。前もって感謝します。

6
user2381870

デフォルトでは、グローバル一時テーブルはON COMMIT DELETE ROWSオプションで作成されます。ステートメントの実行にどのツールを使用する場合でも、自動コミットオプションをオンにする必要があります。そのため、INSERTステートメントを発行するとすぐに、それがコミットされ、テーブル内の行が削除されます。

ON COMMIT PRESERVE ROWSオプションを使用してテーブルを作成するか、コマンドの実行中は自動コミットを無効にし、完了したら明示的にCOMMITを発行する必要があります。どのオプションを選択するかは、ビジネスロジックによって異なります。

Screenshot of successful execution

10
mustaccio

以下の手順でお試しください

[db2inst9@jaimatadi ~]$ db2 "DECLARE GLOBAL TEMPORARY TABLE DEP6 LIKE V_TOTAL_SALES
> ON COMMIT PRESERVE ROWS
> WITH REPLACE
> NOT LOGGED
> IN USER_TEMP_TBSP"
DB20000I The SQL command completed successfully.
[db2inst9@jaimatadi ~]$ db2 "insert into SESSION.DEP6 select * from V_TOTAL_SALES""
> "
DB20000I The SQL command completed successfully.
[db2inst9@jaimatadi ~]$ db2 "select * from SESSION.DEP6"

COUNTRY              CITY                 SALES_AMT
-------------------- -------------------- ---------------------------------
UK                   London               2100.00
UK                   Manchester           1290.00
USA                  Alaska               2130.00
USA                  California           1420.00
USA                  Los Angeles          1110.00
USA                  New York             1420.00

ありがとう、Prashant

2
Prashant

テーブルは1つだけですか?つまり、スキーマなし(現在/デフォルトのスキーマを使用)のテーブルTEST_TBLを作成し、USERID.TEST_TBLにアクセスしているようです。おそらく、TEST_TBLの現在のスキーマはUSERIDではなく、空の名前(USERID.TEST_TBL)を持つ2番目のテーブルがすでにあります。

宣言済み一時テーブルの場合、スキーマはSESSIONです。作成されたグローバル一時テーブルの場合、特定のスキーマがあるようです。

0
AngocA