目前我有一个带有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万条记录。有什么方法可以在执行过程之前编写要回滚的过程?
答案 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语句开始。