在插入触发器之后修改一列并更新 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 中新插入的行值的主要内容,如果未能解决你的问题,请参考以下文章

创建触发器以重新排序列并修改语句级别

我创建了一个过程并在此之后键入,我只是修改了过程光标中的一列并键入

插入或更新销售项目后的 oracle 触发器

sql 插入列放第一列

oracle 表列值唯一 怎么实现

如何从一个表中获取一列并插入到另一个表中