日期:2014-05-17  浏览次数:21482 次

触发器中如何取消插入操作
create or replace
trigger trig_number 
before INSERT ON bill
for each row
declare 
pragma autonomous_transaction;
sbid NUMBER;
begin
select count(*) into sbid from bill where bid=:new.bid and food_id=:new.food_id;
if sbid<>0 then
update bill set quantity=quantity+:new.quantity
where food_id=:new.food_id and bid=:new.bid;
elsif sbid=0 then
null;
end if;
end;

存在问题:插入数据后,原有数据会更新,但会重复插入一条数据
我想请教的是:如何在条件sbid<>0成立时,完成更新并且能取消插入操作

触发器

------解决方案--------------------
抛出一个异常出来.
------解决方案--------------------
这种需求为啥要用插入? 用merge 不行吗? 
------解决方案--------------------
引用:
加个commit


....lz要的是取消操作

自行把插入数据删除
------解决方案--------------------
引用:
引用:加个commit

....lz要的是取消操作

自行把插入数据删除


如果代码正确,为什么会重复插入数据呢?想过这个问题吗?
从源头解决问题,而不是解决连带发生的问题。
------解决方案--------------------
楼主这个需求本身有矛盾,不合理啊。。
把原insert语句改成merge,,触发器都可以不用了。。。
------解决方案--------------------
引用:
引用:
引用:加个commit

....lz要的是取消操作

自行把插入数据删除

如果代码正确,为什么会重复插入数据呢?想过这个问题吗?
从源头解决问题,而不是解决连带发生的问题。


来这里提问的,多数都是要解决问题的。。。。
根源修改代价太大,
------解决方案--------------------
引用:
create or replace
trigger trig_number 
before INSERT ON bill
for each row
declare 
pragma autonomous_transaction;
sbid NUMBER;
begin
select count(*) into sbid from bill where bid=……



那就在触发器的
update bill set quantity=quantity+:new.quantity
where food_id=:new.food_id and bid=:new.bid;
代码段后面再写个delete语句删除掉重复记录吧。。。
------解决方案--------------------
楼主目前的做法是直接insert,然后用触发器判断是修改还是新增,难道不可以先判断是修改还是新增,然后再决定update还是insert么