私は通常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を作成する権限は持っていても、挿入することはできませんか?
提供された助けは最も高く評価されます。前もって感謝します。
デフォルトでは、グローバル一時テーブルはON COMMIT DELETE ROWS
オプションで作成されます。ステートメントの実行にどのツールを使用する場合でも、自動コミットオプションをオンにする必要があります。そのため、INSERTステートメントを発行するとすぐに、それがコミットされ、テーブル内の行が削除されます。
ON COMMIT PRESERVE ROWS
オプションを使用してテーブルを作成するか、コマンドの実行中は自動コミットを無効にし、完了したら明示的にCOMMIT
を発行する必要があります。どのオプションを選択するかは、ビジネスロジックによって異なります。
以下の手順でお試しください
[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
テーブルは1つだけですか?つまり、スキーマなし(現在/デフォルトのスキーマを使用)のテーブルTEST_TBLを作成し、USERID.TEST_TBLにアクセスしているようです。おそらく、TEST_TBLの現在のスキーマはUSERIDではなく、空の名前(USERID.TEST_TBL)を持つ2番目のテーブルがすでにあります。
宣言済み一時テーブルの場合、スキーマはSESSIONです。作成されたグローバル一時テーブルの場合、特定のスキーマがあるようです。