首页 > 解决方案 > PL/SQL 中的异常处理和回滚

问题描述

目前,我有一个带有 PLAN_A 的表 FIRST_ENTRY_TABLE,其他 11 个表具有相对于 PLAN_A 的相应 customer_ID。我有一个带有新键的临时表,它将替换 PLAN_A 并为相应的 customer_is 添加 PLAN_B。下面是 12 个 PL/SQL 过程,它将新的 PLAN_B 插入/更新到与 customer_id 相关的所有必需表中。因为大约有 100 000 个计划将被 customer_ids 的新计划密钥取代。

首先,我正在创建游标并读取要在 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 个表中进行回滚?将有新插入的键的删除脚本和更新查询的计划在几个表中得到更新。但是会有超过 10 万条记录。有没有办法编写程序在执行程序之前进行回滚?

标签: plsqlexception-handlingrollbackplsqldeveloper

解决方案


你的代码看起来很乱。要在 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;

推荐阅读