在插入触发器之后修改一列并更新 Oracle 中新插入的行值
Posted
技术标签:
【中文标题】在插入触发器之后修改一列并更新 Oracle 中新插入的行值【英文标题】:After Insert Trigger to modify one column and update newly inserted row values in Oracle 【发布时间】:2015-12-21 17:31:20 【问题描述】:/* Formatted on 24/09/2015 09:36:39 (QP5 v5.215.12089.38647) */
CREATE OR REPLACE TRIGGER TR_student_PREF_sub_UPDATE
AFTER INSERT OR UPDATE
ON student
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
v_preferred_sub_value NUMBER (1);
no_project_record EXCEPTION;
BEGIN
IF UPDATING OR INSERTING
THEN
IF (:NEW.is_sub = 0 AND :NEW.standard_id IS NOT NULL)
THEN
SELECT preferred_sub
INTO v_preferred_sub_value
FROM STANDARD
WHERE standard_id = :NEW.standard_id;
ELSIF (:NEW.is_sub = 1 AND :NEW.subject_id IS NOT NULL)
THEN
SELECT preferred_sub
INTO v_preferred_sub_value
FROM admin_subject.source
WHERE source_id = :NEW.subject_id;
END IF; /* v_preferred_sub_value IS NOT NULL THEN UPDATE preferred_sub VALUE IN student TABLE */
IF (v_preferred_sub_value IS NOT NULL)
THEN
UPDATE student
SET preferred_sub = v_preferred_sub_value
WHERE student_id = :NEW.student_id;
COMMIT;
END IF;
END IF;
EXCEPTION
WHEN NO_PROJECT_RECORD
THEN
NULL;
END TR_student_PREF_sub_UPDATE;
Process :当用户从 UI 中单击保存操作时,这会调用 java 代码中的 insert 方法。在将值插入主题表时,调用触发器并检查 is_sub 值是否为 0,然后从标准表中获取 Preferred_sub 值。如果 is_sub = 1 则从 admin_subject.source 模式表中获取 preferred_sub。
基于 v_preferred_sub_value 它正在尝试更新新插入行的主题表。 我从 UI 运行插入操作,在调用触发器后,我检查了带有 preferred_sub 列的主题表,它显示空值。
请帮帮我,我在那边犯了什么错误。
学生表有 student_id、subject_id、standard_id 和 is_sub 值等等。 标准表和学生表在相同的模式中。 source 是授予所有特权的不同模式。【问题讨论】:
我只对代码进行了格式化,并在代码最后一行的 END 后面更正了触发器的名称。 【参考方案1】:将您的触发器更改为前触发器并将确定的值分配给适当的 :new 伪列。数据库将负责其余的工作。
IF (v_preferred_sub_value IS NOT NULL)
THEN
:NEW.preferred_sub = v_preferred_sub_value;
END IF;
:NEW.preferred_sub 的值现在将被放置在表记录中。
【讨论】:
通过插入命令插入值时插入学生表然后值。触发器没有触发...你能告诉我我在哪里做错了吗? 非常感谢并修改了价值,现在它正在工作。以上是关于在插入触发器之后修改一列并更新 Oracle 中新插入的行值的主要内容,如果未能解决你的问题,请参考以下文章