在oracle中插入表B后创建触发器以将新行添加到表A中时出错

Posted

技术标签:

【中文标题】在oracle中插入表B后创建触发器以将新行添加到表A中时出错【英文标题】:Error while creating trigger for add new row into table A after insert in table B in oracle 【发布时间】:2020-12-18 15:05:36 【问题描述】:

在阅读问题之前,请检查此问题

我想创建触发器,在插入表 B 后将新行插入表 A。 A 上的属性 z (FK) 的值是表 B 上的 z (PK)(所以我将 new.z 作为 A 上的 z 的值传递),对于 A 上的 y,值是 C 上的 y。 所以,我认为触发器看起来像这样:

CREATE TRIGGER add_to_A
AFTER INSERT on B
FOR EACH ROW BEGIN
    select *
        from new, B, C
        where new.z = B.z and B.t = C.t
    INSERT INTO A (x, y, z) VALUES ('1', C.y, B.z);
END

但我发现这是错误的和错误的。以下是错误:

错误(1):PL/SQL:SQL 语句被忽略

错误(4,6):PL/SQL:ORA-00933:SQL 命令未正确结束

错误(5,3):PLS-00103:在预期以下情况之一时遇到符号“文件结尾”:;符号“;”被替换为“文件结尾”以继续。

你怎么看?以及如何解决?

【问题讨论】:

错误是什么?如果您需要重新创建/修改它,也建议写CREATE OR REPLACE TRIGGER 而不是CREATE TRIGGER @TaaviTiitsu 这里是:错误(1):PL/SQL:SQL 语句被忽略,错误(4,6):PL/SQL:ORA-00933:SQL 命令未正确结束,错误( 5,3):PLS-00103:在预期以下情况之一时遇到符号“文件结尾”: 符号“;”被替换为“文件结尾”以继续。 数据库的版本是多少?如果12c+,则可能首选内部序列结构,而不是像我在触发器中所说的那样使用单独的序列。 11.问题已解决(请参阅下面的答案)。 【参考方案1】:

我认为您需要这样的INSERT 语句以及触发器中的SELECT

CREATE OR REPLACE TRIGGER add_to_A
AFTER INSERT ON B
FOR EACH ROW 
BEGIN
    INSERT INTO A 
    SELECT myseq.nextval, y, :NEW.z 
      FROM C
     WHERE t = :NEW.t;
END;
/

在哪里

t,x 被假定为表 C 的主键列 和A分别 commit 没有在 DML 语句之后添加,以便 数据通过其进入的应用程序的事务完整性 表B已插入

【讨论】:

以上是关于在oracle中插入表B后创建触发器以将新行添加到表A中时出错的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个 Postgres 11 触发器函数,该函数在插入或更新到表“a”时在表“b”中插入一个新行?

oracle触发器在表中插入新行时更新新的视图行

Mysql - 创建触发器以根据插入另一个表中的行插入新行

在插入新行之前删除行[重复]

更新触发器以将两个不同表中的数据添加到审计表中

如何使用触发器在同一张表中插入新行(Oracle PL/SQL 10G)?