众所周知(或至少是这样),您不能在触发器内的变异表上使用DML语句。Oracle文档摘录:
变异表是由UPDATE,DELETE或INSERT语句修改的表,或者是可能由DELETE CASCADE约束的影响而更新的表。
发出触发语句的会话无法查询或修改变异表。此限制可防止触发器看到不一致的数据集。
但是,我无法理解为什么当我insert into emp
使用SQL Developer或SQL * Plus 执行此演示触发器时不会出现“突变表”错误:
CREATE OR REPLACE TRIGGER emp_bri
BEFORE INSERT ON emp
FOR EACH ROW
BEGIN
SELECT max(id) + 1 INTO :NEW.id FROM emp;
UPDATE emp SET salary = 5000;
END emp_bri;
插入成功完成并显示下一个id
值,并更新所有emp
记录。我正在使用Oracle Database 11g企业版11.2.0.1.0。我已经阅读了有关复合触发器的信息,但样本未使用它们。
是的,我知道:)在这种情况下,示例可能不是很好...自动增量值必须通过使用序列和触发器来明确实现。
—
Centurion
这肯定很奇怪。顺便说一句:这是一个SQLFiddle示例sqlfiddle.com/#!4/9e59f/2
—
a_horse_with_no_name 2012年
感谢您分享信息,很酷的链接。不知道有这样的Oracle SQL测试网站:)
—
Centurion
a_horse_with_no_name:又如:小提琴-试验-2(SET工资=工资+ 10)
—
ypercubeᵀᴹ
select max(id)
分配唯一的编号。只是不要。这是完全不正确的,并且不会扩展。