SQL データ変更ステートメントからの結果セットの検索

INSERT、UPDATE、または DELETE ステートメントによって表を変更するアプリケーションは、変更行に追加の処理を必要とする場合があります。 この処理を簡単にするために、SELECT および SELECT INTO ステートメントの FROM 節に、SQL データ変更操作を組み込むことができます。

単一作業単位内で、アプリケーションは、SQL データ変更操作によって変更された表またはビューからの変更行を含む結果セットを検索できます。

例えば、次のステートメントは、SAMPLE データベースにある EMPLOYEE 表の給料のすべての記録を更新し、次いですべての更新済みの行に従業員番号および新規給料を戻します。

SELECT empno, salary FROM FINAL TABLE
	(UPDATE employee SET salary = salary * 1.10 WHERE job = 'CLERK')

正常にデータを戻すために、FROM SQL データ変更操作の結果セットを検索する SELECT ステートメントは、正常に実行するために SQL データ変更操作を必要とします。 正常な SQL データ変更操作では、該当する場合、すべての制約およびトリガーの処理を組み込みます。

例えば、EMPLOYEE 表に対して SELECT 特権はあるが INSERT 特権はないユーザーが、EMPLOYEE 表に対して SELECT FROM INSERT ステートメントを試行すると想定します。 INSERT 操作は特権がないために失敗し、結果として SELECT ステートメント全体が失敗します。

次の照会を考慮してください。EMPLOYEE 表からの記録が選択され、EMP という名前の別の表に挿入されます。 この SELECT ステートメントは失敗します。

SELECT empno FROM FINAL TABLE
	(INSERT INTO emp(name, salary)
	SELECT firstnme || midinit || lastname, salary
	FROM employee)

EMPLOYEE 表に行が 100 あり、90 行目に $9,999,000.00 の SALARY 値がある場合、$10,000.00 の追加は 10 進数のオーバーフローを引き起こす原因となります。 オーバーフローが発生すると、強制的にデータベース・マネージャーによる EMP 表への挿入のロールバックが行われます。

中間結果表

SELECT ステートメントの FROM 節で SQL データ変更操作によってターゲットにされた表またはビューの変更行は、中間結果表を構成します。 中間結果表は、SQL データ変更操作で定義された列を組み込むことに加えて、ターゲット表またはビューのすべての列を組み込みます。 選択リスト、ORDER BY 節、または WHERE 節内の名前によって中間結果表のすべての列を参照できます。

中間結果表の内容は、FROM 節で指定された修飾子に依存しています。 中間結果表として結果セットを検索する SELECT ステートメント内の、 次の FROM 節修飾子の 1 つを組み込む必要があります。
OLD TABLE
中間結果表の行は、BEFORE トリガーおよび SQL データ変更操作の実行の直前のターゲット表の行の値を含みます。 OLD TABLE 修飾子は UPDATE および DELETE 操作を適用します。
NEW TABLE
中間結果表の行には、SQL データ変更ステートメントが実行された直後、 および参照整合性評価といずれかの AFTER トリガーの実行前のターゲット表の行の値が入ります。 NEW TABLE 修飾子は UPDATE および INSERT 操作を適用します。
FINAL TABLE
この修飾子は、NEW TABLE と同じ中間結果表に戻ります。 さらに、AFTER トリガーまたは参照整合性制約がない FINAL TABLE を使用すると、 UPDATE または INSERT 操作のターゲットがさらに変更されることが保証されます。 FINAL TABLE 修飾子は UPDATE および INSERT 操作を適用します。

FROM 節の修飾子は、中間結果表にどのバージョンのターゲット・データがあるかを判別します。 これらの修飾子は、ターゲット表の行の追加、削除、または更新には影響しません。

ターゲット表とビュー

FROM SQL データ変更操作の結果セットを選択する場合、ターゲットは表またはビューにすることができます。

ビューに対する SQL データ変更操作で、結果表には、NEW TABLE と FINAL TABLE のビュー定義を満たさなくなった行を組み込むことはできません。 SELECT ステートメントのビューを参照する INSERT または UPDATE ステートメントを組み込む場合、ビューは WITH CASCADED CHECK OPTION として定義される必要があります。 代替として、ビューは、WITH CASCADED CHECK OPTION としてのビューの定義を許可する制限を満たす必要があります。

SELECT ステートメントの FROM 節に組み込まれた SQL データ変更操作のターゲットが全選択である場合、 結果表には、全選択に該当しない行が組み込まれることがあります。 これは、WHERE 節の述部が更新済みの値に対して再評価されないためです。

INPUT SEQUENCE に基づく結果セットのソート

ターゲット表またはビューに挿入されたのと同じ ORDER BY で行を SELECT するには、 ORDER BY 節で INPUT SEQUENCE キーワードを使用します。 INPUT SEQUENCE キーワードの使用によって、行がその提供と同じ順序で挿入されることはありません。

以下に示すのは、INSERT 操作の結果セットをソートするため、 ORDER BY 節で INPUT SEQUENCE キーワードを使用する例です。

CREATE TABLE orders (purchase_date DATE,
                     sales_person VARCHAR(16),
                     region VARCHAR(10),
                     quantity SMALLINT,
                     order_num INTEGER NOT NULL
                       GENERATED ALWAYS AS IDENTITY (START WITH 100,
		                                    INCREMENT BY 1))

SELECT * FROM FINAL TABLE
         (INSERT INTO orders
          (purchase_date, sales_person, region, quantity)
          VALUES (CURRENT DATE,'Judith','Beijing',6),
                 (CURRENT DATE,'Marieke','Medway',5),
                 (CURRENT DATE,'Hanneke','Halifax',5))
         ORDER BY INPUT SEQUENCE

PURCHASE_DATE SALES_PERSON     REGION     QUANTITY ORDER_NUM
------------- ---------------- ---------- -------- -----------
07/18/2003    Judith           Beijing           6         100
07/18/2003    Marieke          Medway            5         101
07/18/2003    Hanneke          Halifax           5         102

列の組み込みを使用して結果セットの行をソートすることもできます。