我们这里有一个奇怪的问题,我们无法向自己解释。
我们在 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;
注意选择末尾的 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 子句,它现在对所有行进行排序,而不是第一个插入语句中的前三行。
编辑:如果您省略 ORDER BY 子句,结果也符合预期(例如示例 2)。
有人可以向我解释这种行为吗?
PS关于评论:
我今天没有时间调查或提供有关此主题的更多信息。我将在我们的数据库上创建一个完整的示例,并在接下来的几天内将其发布在这里。感谢您的耐心等待!