5.6 FINAL TABLE のサポート
Db2 for i では FINAL TABLE 節は主に、SELECT FROM FINAL/NEW/OLD TABLE 構文を使用する際に、INSERT、UPDATE、および DELETE 文と組み合わせて使用されます。
FINAL TABLE 節を使用すると、更新または削除操作の実行後に影響を受けた行の最終値を取得できます。
5.6.1 中間結果表
SELECT 文の FROM 節で表またはビューを対象とする SQL データ変更操作は、中間結果表を作成します。この表には、対象表またはビューのすべての列と、データ変更操作で定義された包含列が含まれます。中間結果表内のすべての列は、SELECT リスト、ORDER BY 節、または WHERE 節で名前によって参照できます。
中間結果表の内容は、FROM 節で指定された修飾子によって異なります。結果セットを中間結果表として取得するSELECT文には、以下のFROM句修飾子のいずれかを含める必要があります。
OLD TABLE
中間結果表の行には、BEFOREトリガーとSQLデータ変更操作の実行直前の時点におけるターゲット表の行の値が含まれます。OLD TABLE修飾子は、UPDATEおよびDELETE操作に適用されます。
NEW TABLE
中間結果表の行には、SQLデータ変更文の実行直後、参照整合性評価とAFTERトリガーの実行前の時点におけるターゲット表の行の値が含まれます。NEW TABLE修飾子は、UPDATEおよびINSERT操作に適用されます。
FINAL TABLE
この修飾子は、NEW TABLEと同じ中間結果表を返します。 さらに、FINAL TABLEを使用することで、AFTERトリガーや参照整合性制約によってUPDATEまたはINSERT操作のターゲットがそれ以上変更されることがなくなります。FINAL TABLE修飾子は、UPDATEおよびINSERT操作に適用されます。
FROM句の修飾子は、中間結果テーブルに含まれる対象データのバージョンを決定します。これらの修飾子は、対象テーブル行の挿入、削除、または更新には影響しません。
ムー、分かったような分からないような(^^;
以下、使用方法に続きます。
FINAL TABELの準備
以下のSQLをACS SQLスクリプト実行画面などから実行して、IBM i に付属のサンプルスキーマ(TOYSTORE)、テーブルその他を生成します。
-- ①create Sample Schema TOYSTORE
call qsys.create_sql_sample('TOYSTORE');
-- ②Add a Generated ID SALES_ID to the Table inside TOYSTORE
alter table
toystore.sales
add column SALES_ID BIGINT AS IDENTITY (START WITH 1 no cycle);
実行してみます。
ジョブログを参照しろ、とありますので、IBM i サービス QSYS2.JOBLOG_INFO でジョブログを検索します。
SELECT * FROM TABLE(QSYS2.JOBLOG_INFO('023576/QUSER_NC/QZDASOINIT'));
※ジョブ番号は各自の値に合わせてください。
ジョブログを参照すると、16行目のエラー = ライブラリー TOYSTORE が既に存在している というのが原因のようです。

エラーは問題無いと判断し、②を実行します。
***②はテーブルSALESにアイデンティティカラム識別列SALES_IDを追加します。
こちらは正常に実行されました。(画面省略)
INSERT の実行
事前のデータ追加
事前に以下の処理を行い、アイデンティカラムSALES_IDに値をセットします。
以下のサンプルで SALESテーブルに営業担当者のレコードを挿入します。
insert into toystore.sales
(SALES_DATE, SALES_PERSON, REGION, SALES)
values
(current date, 'ROWE', 'Eyota', 1);
インサート後にテーブルを確認すると、私の環境では42行目にレコードが追加されていました。
また、アイデンティティカラム SALES_ID は42でセットされていました。
※Redbookには、テーブルからSALES_IDの最大値=最後に追加されたレコードの値 を取得するSQLサンプルもありました。こちらでも同様な確認ができます。
select
MAX(SALES_ID) AS SALES_ID
from
toystore.sales;
FINALテーブルの確認
FINAL TABLE を使用すると以下のSQLで値を取得できます。
例 1 つのテーブルで ID と名前を取得するクエリ
--- FINAL TABLEのサンプル
select SALES_ID , sales , SALES_PERSON
from FINAL table
(
insert into toystore.sales
(SALES_DATE, SALES_PERSON, REGION, SALES)
values
(current date, 'ROWE', 'Eyota', 1)
);
上記の実行結果は以下になります。43行目に指定したレコードが追加されています。

fyi.で全カラムを検索すると、下記のようにSALES_DATEにはCURRENT DATEで本日の日付がセットされています。

これでもまだわかり難いですね…

