触发器编译正常但在更新时遇到 ORA-04091
Trigger Compiles Fine But Encounters ORA-04091 on UPDATE
1.) 我为名为 grades
的 table 编写了一个触发器,如下所示:
CREATE OR REPLACE TRIGGER grades_before_update
BEFORE UPDATE OF grade_percent
ON grades
FOR EACH ROW
DECLARE
grade_percent_var NUMBER;
BEGIN
SELECT grade_percent
INTO grade_percent_var
FROM grades
WHERE student_id = :new.student_id;
IF (grade_percent_var > 100 OR grade_percent_var < 0) THEN
RAISE_APPLICATION_ERROR(-20001, 'grade percent must be between 0 and 100');
END IF;
END;
/
而且它编译得很好。我的2列grades
table的例子如下:
student_id grade_percent
1 70
2 85
3 90
4 70
当我尝试按如下方式测试此触发器时出现问题:
UPDATE grades
SET grade_percent = 80
WHERE student_id = 1;
它给了我一个
Error ORA-04091: table GRADES is mutating, trigger/function may not
see it. Rewrite the trigger (or function) so it does not read that
table.
2.) 此外,我计划在我的触发器中包含另一个 IF 语句,以检查输入的新 grade_percent 是否在 0 和 1 之间。如果是,然后它应该将该小数值转换为整数百分比值,例如:
UPDATE grades
SET grade_percent = 0.9
WHERE student_id = 2;
这是我到目前为止的内容,但我不确定如何编写代码的第二行:
IF (grade_percent_var > 0 OR grade_percent_var < 1) THEN
INSERT(grade_percent_var * 100);
第二行应将从 0-1 插入的任何值转换为整数百分比,例如:0.7 转换为 70% 并将其插入该行的该列。但是,这是一个语法错误,我不确定如何从这里继续。
非常感谢任何帮助。谢谢。
首先,您不需要触发器:
alter table grades add constraint chk_grades_grade_percent
check (grade_percent between 0 and 100);
其次,您可以只使用触发器的新值——如果您必须使用触发器:
CREATE OR REPLACE TRIGGER grades_before_update
BEFORE UPDATE OF grade_percent
ON grades
FOR EACH ROW
BEGIN
IF (:new.grade_percent > 100 OR :new.grade_percent < 0) THEN
RAISE_APPLICATION_ERROR(-20001, 'grade percent must be between 0 and 100');
END IF;
END;
/
1.) 我为名为 grades
的 table 编写了一个触发器,如下所示:
CREATE OR REPLACE TRIGGER grades_before_update
BEFORE UPDATE OF grade_percent
ON grades
FOR EACH ROW
DECLARE
grade_percent_var NUMBER;
BEGIN
SELECT grade_percent
INTO grade_percent_var
FROM grades
WHERE student_id = :new.student_id;
IF (grade_percent_var > 100 OR grade_percent_var < 0) THEN
RAISE_APPLICATION_ERROR(-20001, 'grade percent must be between 0 and 100');
END IF;
END;
/
而且它编译得很好。我的2列grades
table的例子如下:
student_id grade_percent
1 70
2 85
3 90
4 70
当我尝试按如下方式测试此触发器时出现问题:
UPDATE grades
SET grade_percent = 80
WHERE student_id = 1;
它给了我一个
Error ORA-04091: table GRADES is mutating, trigger/function may not see it. Rewrite the trigger (or function) so it does not read that table.
2.) 此外,我计划在我的触发器中包含另一个 IF 语句,以检查输入的新 grade_percent 是否在 0 和 1 之间。如果是,然后它应该将该小数值转换为整数百分比值,例如:
UPDATE grades
SET grade_percent = 0.9
WHERE student_id = 2;
这是我到目前为止的内容,但我不确定如何编写代码的第二行:
IF (grade_percent_var > 0 OR grade_percent_var < 1) THEN
INSERT(grade_percent_var * 100);
第二行应将从 0-1 插入的任何值转换为整数百分比,例如:0.7 转换为 70% 并将其插入该行的该列。但是,这是一个语法错误,我不确定如何从这里继续。
非常感谢任何帮助。谢谢。
首先,您不需要触发器:
alter table grades add constraint chk_grades_grade_percent
check (grade_percent between 0 and 100);
其次,您可以只使用触发器的新值——如果您必须使用触发器:
CREATE OR REPLACE TRIGGER grades_before_update
BEFORE UPDATE OF grade_percent
ON grades
FOR EACH ROW
BEGIN
IF (:new.grade_percent > 100 OR :new.grade_percent < 0) THEN
RAISE_APPLICATION_ERROR(-20001, 'grade percent must be between 0 and 100');
END IF;
END;
/