Обработка исключений и откат в PL / SQL - PullRequest
0 голосов
/ 04 июля 2018

В настоящее время у меня есть одна таблица FIRST_ENTRY_TABLE с PLAN_A, а другие 11 таблиц имеют соответствующие customer_ID относительно PLAN_A. У меня есть временная таблица с новым ключом, который заменит PLAN_A и добавит PLAN_B для соответствующих customer_is. Ниже описана процедура 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 таблиц? там будет сценарий удаления для новых вставленных ключей и запрос на обновление для PLAN, обновляемый в нескольких таблицах. но будет более 100 тыс. записей. Есть ли способ написать процедуру для выполнения отката перед выполнением процедур?

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Пока все обновления и т. Д. Выполняются в течение одной транзакции, один ROLLBACK откатит все изменения, сделанные в транзакции. Транзакция запускается автоматически, когда вы выполняете операцию DML (SELECT, INSERT, UPDATE, MERGE, DELETE), когда транзакция не действует; Вы также можете запустить его с помощью оператора SET TRANSACTION.

0 голосов
/ 05 июля 2018

ваш код кажется очень грязным. Чтобы попрактиковаться в обработке исключений в PL / SQL, попробуйте написать свой 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...