create or replace trigger trig_redeem_coffee
before insert
on buycoffee
for each row
declare
CID int;
customerPoint float;
pointNeeded float;
begin
select customer_id into CID
from purchase
where purchase_id = :new.purchase_id;
select total_points into customerPoint
from customer
where customer_id = CID;
pro_get_redeem_point (:new.coffee_ID, :new.redeem_quantity, pointNeeded);
if pointNeeded>customerPoint
then
rollback;
else
pointNeeded := -1*pointNeeded;
pro_update_point(CID, pointNeeded);
end if;
commit;
end;
/
触发器可以成功创建,但是当我插入buycoffee表(它将满足pointNeeded> customerPoint的条件)时,它会返回一个错误,它无法在触发器中回滚。这是回滚新插入行的正确方法吗?或者有更好的方法来做到这一点。 (所有程序都正确构建)
答案 0 :(得分:3)
COMMIT
内的ROLLBACK
或TRIGGER
,除非是自主交易。
在TRIGGER
内,您应该执行您希望应用的任何逻辑,但如果出现错误情况,则应引发应用程序错误,而不是ROLLBACK
。这应该导致INSERT
语句触发TRIGGER
错误,执行语句级回滚,并将事务返回到执行INSERT之前的状态。此时,您可以评估错误,决定是回滚整个事务,还是重新尝试INSERT
或其他内容。
有关自主交易的更多信息: https://docs.oracle.com/database/121/CNCPT/transact.htm#GUID-C0C61571-5175-400D-AEFC-FDBFE4F87188
有关语句级回滚的更多信息: https://docs.oracle.com/cd/B19306_01/server.102/b14220/transact.htm#i8072 希望有所帮助。