oracle:触发不插入记录到表中



我有一个触发器,但它没有将记录插入目标表。创建或替换触发器ins_det_trig1在Table_a上插入后声明编译指示autonomous_transaction;---开始插入到inf_det中选择a.loc_id,a.genre_id,to_char (a.emp_date yyyy-mm-dd),a.san_seq从Table_b a,Table_a b在哪里b.emp_date = a.emp_date和b.genre_id = a.genre_id和b.san_seq = a.san_seq;

commit;
exception
when others
Rollback;
end;
pls help me on this

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

那么,你就吞下了所有的异常。如果出现问题,则用错误代码填充该变量,然后静默地结束触发器。因此,当触发器失败时,您永远不会得到通知。

但是主要的问题是你没有像在Oracle中使用触发器那样使用触发器。触发器是行触发器之后的(AFTER INSERT ... FOR EACH ROW),因此在插入table_a行时每行触发一次。插入到新行中的值可以用:new访问,例如:new.business_date

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

说了这么多:似乎你想要一个后语句触发器. 在行插入完成后触发的触发器。要做到这一点,请删除FOR EACH ROW子句和相关的REFERENCING子句。

create or replace trigger ins_det_trig1
after insert on Table_a
declare
...
begin
...
end;

最新更新