Oracle PL / SQL如何回滚新插入的行

时间:2018-04-13 20:08:17

标签: sql oracle

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的条件)时,它会返回一个错误,它无法在触发器中回滚。这是回滚新插入行的正确方法吗?或者有更好的方法来做到这一点。 (所有程序都正确构建)

1 个答案:

答案 0 :(得分:3)

COMMIT内的ROLLBACKTRIGGER,除非是自主交易。

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 希望有所帮助。