触发器不向表中插入记录

问题描述 投票:0回答:1

我有一个触发器,但它没有将记录插入到目标表中。

create or replace trigger ins_det_trig1
after insert on Table_a
declare
pragma    autonomous_transaction;
---
begin
insert into inf_det
select 
a.loc_id,
a.genre_id,
to_char(a.emp_date,'yyyy-mm-dd'),
a.san_seq
from Table_b a ,
Table_a b
where 
b.emp_date=a.emp_date
and   b.genre_id=a.genre_id
and   b.san_seq=a.san_seq;

commit;
exception
when others
Rollback;
end;

请帮我解决这个问题

oracle plsql triggers
1个回答
1
投票

首先触发器是无效的,所以它不会做任何事情。您正在使用未声明的名为

v_err
的变量。

然后,你就吞下了所有例外。如果出现问题,您可以用错误代码填充该变量,然后默默地结束触发器。因此,当触发器失败时,您永远不会收到通知。

但主要问题是您没有使用触发器,因为您应该在 Oracle 中使用触发器。该触发器是一个 after row 触发器 (

AFTER INSERT ... FOR EACH ROW
),因此在插入 table_a 行时每行触发一次。可以使用
:new
访问插入新行的值,例如
:new.business_date

但是,您可以忽略这些值并从表中进行选择。但在您选择的那一刻,表正在发生变化。假设我们编写了一条插入两行的插入语句。扳机扣动两次。首先插入哪一行由机会决定。 Oracle 看到了这一点,当您在触发器内并尝试选择时,它告诉我们表的内容不确定,因为另一行可能已经在表中或不在表中。我们得到一个变异表异常。

话虽如此:看来你想要一个 after 语句触发器。行插入完成后触发的触发器。为此,还要删除

FOR EACH ROW
子句和相关的
REFERENCING
子句。

create or replace trigger ins_det_trig1
after insert on Table_a
declare
  ...
begin
  ...
end;
© www.soinside.com 2019 - 2024. All rights reserved.