plsql - 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 万条记录。有没有办法编写程序在执行程序之前进行回滚?
解决方案
你的代码看起来很乱。要在 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;
推荐阅读
- c# - 在 dotnet webapi 5 中发布文件时出现 405 错误
- c++ - Clang 无法在非标准位置找到头文件
- python - 将开始和结束时间转换为密度/职业
- c - 为什么递归会搞砸,最终陷入无限循环?
- architecture - 使用 Tesseract 从 PDF 中解析带有特殊字符的文本的一般方法?
- c++ - IO 完成端口的接收缓冲区始终为空
- javascript - 过滤多个数组 ngrx
- ios - 离子电容器,缺少推荐图标
- iis-7.5 - 有没有人尝试在 Windows Server 2012 IIS 中安装 PHP 8?
- java - 自动装配的构造函数没有在 Springboot 中正确实例化依赖项