在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中时出错的主要内容,如果未能解决你的问题,请参考以下文章