2017-04-14 57 views
-1

我有存储过程,执行2个操作,删除然后更新。我的目的是更新应该经常更新一行,若再行更新,我想取消这两种操作,这是我的交易,我试图把交易存入存储过程以取消所有操作

BEGIN 

    BEGIN transaction trans; 
    (here is delete query) 


     (here is update query) 
    IF SQL%ROWCOUNT > 1 THEN 
      ROLLBACK TO tran; 
    ELSE 
      COMMIT; 
    END IF; 
    END; 

END; 

但是这会产生错误Error(5,23): PLS-00103: Encountered the symbol "TRANS" when expecting one of the following: := . (@ % ; The symbol ":=" was substituted for "TRANS" to continue.

什么是不正确

回答

1

尝试:

BEGIN 
     (here is delete query) 

     (here is update query) 
     IF SQL%ROWCOUNT > 1 THEN 
      RAISE_APPLICATION_ERROR(-20001, 'rollbacked'); 
     END IF; 
END; 
在Oracle

存储过程由默认的事务,如果你有2个查询(删除和更新),你想放弃他们两个,不需要额外的BEGIN transaction ...或像这样

+0

是的,我想中止这两个查询,这是太简单了,谢谢! –

2

在Oracle中,你必须使用保存点,应该是这样的:

BEGIN 

SAVEPOINT tran; 
    (here is delete query) 


     (here is update query) 
    IF SQL%ROWCOUNT > 1 THEN 
      ROLLBACK TO tran; 
    ELSE 
      COMMIT; 
    END IF; 
END; 

但是,对于我,你喜欢回滚并不清楚,或许SAVEPOINT tran;应放在(here is delete query)之后 - 取决于您的要求。

+0

谢谢,我的要求是取消两个查询。我这样做,再次感谢你 –