ここには奇妙な問題があります。自分で説明することはできません。
Oracle DB バージョン 10.2.0.5.8 にビューがあります。ビューは INSTEAD OF トリガーを使用します。
トリガーのコードは次のとおりです。
CREATE OR REPLACE TRIGGER V1_T1_BIUD
INSTEAD OF INSERT OR UPDATE OR DELETE
ON V1_T1
FOR EACH ROW
DECLARE
AnyId NUMBER;
BEGIN
IF INSERTING THEN
INSERT INTO Table T1 (
F1, F2, F3, F4, F5
) VALUES (
:new.F1, :new.F2, :new.F3, :new.F4, :new.F5
);
ELSIF UPDATING THEN
UPDATE T1 SET F1 = :new.F1,
F2 = :new.F2,
F3 = :new.F3,
F4 = :new.F4,
F5 = :new.F5
WHERE F1 = :old.F1;
ELSIF DELETING THEN
DELETE FROM T1
WHERE F1 = :old.F1;
END IF;
END;
/
これは INSERT ステートメントの例です。
INSERT INTO V_T1 (
F1, F2, F3, F4, F5
)
SELECT A.V, A.S, A.F, A.T, A.Z
FROM (
SELECT 'E' V, 'N' S, 'ABC' F, 'E' T, 'E' Z FROM DUAL UNION ALL
SELECT 'E', 'Y', 'QWE', 'O', 'E' FROM DUAL UNION ALL
SELECT 'I', 'Y', 'GHJ', 'I', 'I' FROM DUAL
) A
ORDER BY 1, 2, 3;
COMMIT;
select の最後の ORDER BY 句に注意してください。この INSERT ステートメントの結果は次のようになります。
F1 F2 F3 F4 F5
---------------
E N ABC I I
E Y QWE I I
I Y GHJ I I
ご覧のとおり、4 番目と 5 番目の列には、他のすべてのデータ行の最後のデータ行の値が誤って入力されています。
INSERT ステートメントを次のように変更すると、次のようになります。
INSERT INTO V_T1 (
F1, F2, F3, F4, F5
)
SELECT A.V, A.S, A.F, A.T, A.Z
FROM (
SELECT 'E' V, 'N' S, 'ABC' F, 'E' T, 'E' Z FROM DUAL UNION ALL
SELECT 'E', 'Y', 'QWE', 'O', 'E' FROM DUAL UNION ALL
SELECT 'I', 'Y', 'GHJ', 'I', 'I' FROM DUAL
) A
ORDER BY 1, 2, 3, 4, 5;
COMMIT;
結果は次のとおりです。
F1 F2 F3 F4 F5
---------------
E N ABC E E
E Y QWE O E
I Y GHJ I I
もう一度、ORDER BY 句に注意してください。これにより、最初の挿入ステートメントの最初の 3 行ではなく、すべての行が並べ替えられます。
編集: ORDER BY 句を省略した場合、結果も期待どおりになります (例 2 のように)。
誰かが私にこの動作を説明できますか?
PSコメントについて:
今日、このトピックについて調査したり、これ以上の情報を提供したりする時間はありません。データベースで完全な例を作成し、数日中にここに公開します。お待ちいただいてありがとうございます!