我有一个触发器,但它没有将记录插入到目标表中。
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;
请帮我解决这个问题
首先触发器是无效的,所以它不会做任何事情。您正在使用未声明的名为
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;