触发插入并更新oracle错误

时间:2013-01-01 10:04:55

标签: oracle plsql triggers

朋友,我对级联触发有疑问。 我有2个表,表数据有3个属性(id_data,sum和id_tool),表工具有3个属性(id_tool,name,sum_total)。表数据和工具使用id_tool连接。

我想为更新信息sum_total创建触发器。因此,如果我在表数据上插入sum_total,那么tool.id_tool = data.id_tool也会更新表工具。

我创建了这个触发器,但错误是ora-04090。

create or replace trigger aft_ins_tool
after insert on data
for each row
declare
v_stok number;
v_jum number;
begin
    select sum into v_jum
    from data
    where id_data= :new.id_data;

    select sum_total into v_stok
    from tool
    where id_tool= 
    (select id_tool
        from data
        where id_data= :new.id_data);

    if inserting then
    v_stok := v_stok + v_jum;
    update tool
    set sum_total=v_stok
    where id_tool=
    (select id_tool
        from data
        where id_data= :new.id_data);
    end if;
end;

/

请给我意见。 感谢。

1 个答案:

答案 0 :(得分:1)

ora-04090表示您已经在该表上有一个AFTER INSERT ... FOR EACH ROW触发器。 Oracle不喜欢这样,因为teh触发fire的顺序是不可预测的,这可能导致不可预测的结果,而Oracle 真的不喜欢那些。

因此,您的第一步是将两组代码合并为一个触发器。然后开始真正的乐趣。

据推测,data中只有一行与id_data的当前值相匹配(如果不是你的数据模型已经集结,那么你的情况就没有希望了)。无论如何,这意味着当前行已经允许您访问:new.sum:new.id_tool的值。因此,您不需要data表上的那些查询:删除这些选择将消除“改变表”错误的可能性。

作为一般观察,维护这样的聚合或汇总表通常是一个坏主意。通常最好只在需要时查询信息。如果您确实拥有大量数据,那么您应该使用物化视图来维护摘要,而不是手动滚动。