Требуется ли точка сохранения внутри для l oop PL SQL oracle? - PullRequest
0 голосов
/ 02 марта 2020

просто интересно, действительно ли нам нужна точка отката / сохранения в операторе L OOP, если у нас есть исключительная ситуация внутри.

create table my_Tab
(id number,
name varchar2(10),
address varchar2(100));

insert into my_tab values (1,'ABC','XXX');
insert into my_tab values (2,'DEF','YYY');
insert into my_tab values (3,'GHI','ZZZ');
insert into my_tab values (4,'JKL',null);

DECLARE
CURSOR cur_my_tab is
select * from my_tab;
l_var varchar2(100);
l_count number := 0;
begin
for rec_my_tab in cur_my_tab
loop
    BEGIN
    dbms_output.put_line('id' || rec_my_tab.id);
    --savepoint sv_cur_my_tab;
        dbms_output.put_line('name' || rec_my_tab.name);
        select rec_my_tab.address into l_var from dual;
        update my_Tab set id = id +4 where id = rec_my_tab.id;
        dbms_output.put_line(l_var);
        if rec_my_tab.address ='xxx' then
            l_count:= rec_my_tab.id/l_count;
        END IF;
    Exception
        when others then 
            dbms_output.put_line('in inner exception');
            --rollback to sv_cur_my_tab;*/
    end;
end loop;
Exception
    when others then 
        dbms_output.put_line('in outer exception');
        --rollback to sv_cur_my_tab;
end;

У меня есть 2 запроса по сравнению с запросом.

  1. Когда происходит фиксация в вышеуказанной последовательности.
  2. в вышеприведенном коде учтите, что исключение выбрасывается в середине курсора (например, 3-я или 4-я итерация). внесет ли изменение в это откат и точку сохранения? в настоящее время весь l oop завершен, и все обновления также фиксируются.

1 Ответ

1 голос
/ 02 марта 2020

Когда происходит коммит в вышеуказанной последовательности?

Нет. По крайней мере, я не вижу commit заявления. Может я слепой. Но в PL / SQL нет "автоматической фиксации". Таким образом, commit не будет иметь место, пока вы не выпустите его (или не произойдет ваше клиентское программное обеспечение).

в приведенном выше коде учтите, что исключение выдается в середине курсора (например, 3-я или 4-я итерация). внесет ли изменение в это откат и точку сохранения? в настоящее время весь l oop завершен, и все обновления также фиксируются.

Откат к точке сохранения обычно полезен, когда у вас есть несколько операторов DML внутри курсор l oop и вы оба

  1. хотите убедиться, что для каждой записи курсора операторы DML либо ВСЕ завершатся успешно, либо ни один из них не выполнит
  2. не хотят фиксировать что угодно, пока не будут обработаны все строки

В вашем случае у вас есть только один update внутри l oop, и после этого вы меняете значение переменной 'l_count'. Если вы хотите, чтобы обновление откатывалось в случае каких-либо проблем с изменением «l_count», откат к точке сохранения - это то, что вам нужно.

Имейте в виду, что откат к точке сохранения НЕ вернет любые изменения к PL / SQL переменным, таким как 'l_count'. Вы несете ответственность за восстановление их значений по мере необходимости, прежде чем выполнить откат до точки сохранения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...