【问题标题】:Error while creating trigger for add new row into table A after insert in table B in oracle在oracle中插入表B后创建触发器以将新行添加到表A中时出错
【发布时间】: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.问题已解决(请参阅下面的答案)。

标签: sql oracle plsql triggers


【解决方案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已插入

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-10
    • 2017-10-26
    • 2020-04-22
    • 2019-01-04
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多