PL / SQL中的异常处理和回滚

时间:2018-07-04 13:17:28

标签: plsql exception-handling rollback plsqldeveloper

目前我有一个带有PLAN_A的表FIRST_ENTRY_TABLE,其他11个表具有相对于PLAN_A的customer_ID。我有一个带有新键的临时表,它将替换PLAN_A并为相应的customer_is添加PLAN_B。 以下是12个PL / SQL过程,该过程正在将新的PLAN_B插入/更新到关于customer_id的所有必需表中。 由于大约有10万个PLANS,将由customer_ids的NEW PLAN KEY代替。

首先,我正在创建游标并读取要在12个表中更新的所有新键。

然后通过12个过程分别在12个表中插入/更新查询。

DECLARE
var1
CURSOR C1
select query fetching PLAN_B key from temp table
PROCEDURE procedure1(
P_key IN OFFTABLE%TYPE;
IS
BEGIN
INSERT into FIRST_ENTRY_TABLE( 
mandator_key,OFFER_TYPE_KEY,offer_key)VALUES('abc','FIXED',P_key)
RETURNING ID
INTO var1;
 END procedure1;
 )
PROCEDIRE procedure2(
 P_key IN OFFTABLE%TYPE;
 oldid IN FIRST_ENTRY_TABLE%TYPE;
 )
IS
 BEGIN
 INSERT into SECOND_ENTRY_TABLE(col1,col2...custid)
 select (col1,col2...var1) FROM sometable WHERE offer_key= P_key;
 UPDATE SECOND_ENTRY_TABLE set custid=var1 where custid=oldid;
 END procedure2;

 simplarly procedure3

 procedure4..  procedure5

 --------procedure12
 COMMIT;

我的问题是在这里如何进行异常处理,因为我拥有所有的插入和更新语句。    我知道要使用NO_DATA_FOUND,所有其他异常都会发生,我们如何在这里处理它。    如何处理异常,到底是在所有过程执行完并执行COMMIT之后还是在每个过程内部?

如何从所有12个表中回滚?在几个表中将有用于新插入键的删除脚本和针对PLAN的更新查询,但是将有超过10万条记录。有什么方法可以在执行过程之前编写要回滚的过程?

2 个答案:

答案 0 :(得分:1)

您的代码似乎很混乱。.要在PL / SQL中实践异常处理,请尝试在begin,exception和end块内编写sql查询。您也可以根据数据需求在循环中完成此操作。

DECLARE
   lv_qry varchar2(100):=NULL;
   lv_param1 varchar2(100):=NULL;
   lv_param2 varchar2(100):=NULL;
BEGIN
   lv_qry:=''; --your or update query 
   EXECUTE IMMEDIATE lv_qry into lv_param1 using lv_param2; --Bind the variable 'optional'
   COMMIT;
 EXCEPTION
    WHEN others THEN
      DBMS_OUTPUT.PUT_LINE(sqlerrm);
      ROLLBACK;
 END;

答案 1 :(得分:0)

只要所有更新等都在单个事务期间执行,则单个ROLLBACK将回滚事务中所做的所有更改。当没有事务有效时,当您执行DML操作(SELECT,INSERT,UPDATE,MERGE,DELETE)时,事务将自动启动。您也可以使用SET TRANSACTION语句开始。