Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Обработка EXCEPTION в цикле LOOP / 15 сообщений из 15, страница 1 из 1
29.05.2020, 09:12
    #39963868
Igor Karmanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка EXCEPTION в цикле LOOP
Добрый день.
Прошу не пинать меня сильно, так как я новичок в PL/SQL )
Вопрос следующий.
Есть скрипт:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
SET SERVEROUTPUT ON
declare cursor am
is
select mo.id as obj_id, m.id as msg_id, mo.MASTEROBJECT_ID,mo.status as obj_stats,m.status as msg_stats,m.REPLYSTATUS, m.isobjectsfinished,
m.CADEPENDENTMESSAGE_ID , m.DLDEPENDENTMESSAGE_ID, mo.depositorid, mo.sourceid, m.operation,m.MESSAGEDATE,m.body, mo.responsemessagebody
,mo.RESPONSEMESSAGEDATE--, m.MESSAGEID
from cms_am.cms_MSG_OBJECTS mo
right join cms_am.cms_messages m on mo.message_id=m.id
where 1=1
and mo.status in ('ERROR','WORKING', 'DEPENDENT', 'WAITING', 'TIMEOUT', 'FINISHED' ) 
and mo.DEPOSITORID not in ('916238','Z94594')
and length(mo.responsemessagebody) > 0
and mo.id > 77726372
and mo.sourceid not like 'createSession_%'
and mo.sourceid not like 'sendPosting_%'
and mo.sourceid not like 'getBalance_%'
order by m.MESSAGEDATE ;

--Объявление переменных
am_entry  am%ROWTYPE; 
v_col  VARCHAR(10) := '';
npe_col VARCHAR(10):='';
npe_counteraccount_id VARCHAR(10) := '';
npe_mainaccount_id VARCHAR(10) :='';
entry_id NUMBER ;

BEGIN 
DBMS_OUTPUT.PUT_LINE ('STARTING');
  OPEN am; 
  loop
    FETCH am INTO am_entry; 
    exit when am%NOTFOUND;
    v_col := am_entry.obj_id;

--Блок для обработки ошибки NullPointerException

    if am_entry.responsemessagebody like '%NullPointerException%'
    then
       npe_col := am_entry.sourceid;
       DBMS_OUTPUT.PUT_LINE( 'NullPointerException_COL = ' || npe_col );
       
        -- присваеваем значение CONTRAACCOUNT_ID
       select distinct ac.id into npe_counteraccount_id                         
        from cms_operations o  
        left join cms_accounts ac on ac.id=o.creditaccount_id
        left join cms_msg_objects ob on ob.id=o.object_id
        where
        o.ISDEBITACCOUNTMAIN =1 and
        ob.sourceid in (
        select SOURCEID from CMS_OBJECTS where
        ISACCOUNTED =1 and CONTRAACCOUNT_ID is null and SOURCEID = npe_col
        )
        order by 1;
          
        -- присваеваем значение MAINACCOUNT_ID
         select acc.id into npe_mainaccount_id
         from CMS_OBJECTS ob
         join cms_agreements agr on agr.ID = ob.ACTUALAGREEMENT_ID
         join cms_accounts acc on acc.NAMEENG = agr.SOURCEID
         where 1=1
         and ob.ISACCOUNTED =1
         and ob.MAINACCOUNT_ID is null
         and ob.SOURCEID = npe_col 
         order by 1;
         
         --обновление значений в таблице CMS_OBJECTS
         update CMS_OBJECTS
         set CONTRAACCOUNT_ID = npe_counteraccount_id, MAINACCOUNT_ID = npe_mainaccount_id
         where ISACCOUNTED =1
         and CONTRAACCOUNT_ID is null
         and MAINACCOUNT_ID is null
         and SOURCEID in (npe_col);
             
     end if;     
  end loop;
  EXCEPTION WHEN NO_DATA_FOUND   THEN DBMS_OUTPUT.PUT_LINE ('Не найдено данных для обработки.');
  CLOSE am; 
END;



Почему EXCEPTION отрабатывает только тогда, когда помещён за циклом LOOP?
Как мне сделать, чтобы EXCEPTION обрабатывался после каждого селекта с последующим продолжением цикла LOOP?
Версия Oracle: 12g

Всем спасибо!
...
Рейтинг: 0 / 0
29.05.2020, 09:53
    #39963878
exciter
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка EXCEPTION в цикле LOOP
Igor KarmanovКак мне сделать, чтобы EXCEPTION обрабатывался после каждого селекта с последующим продолжением цикла LOOP?
может быть, добавить внутрь цикла такую конструкцию?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
LOOP

BEGIN
...
EXCEPTION WHEN no_data_found THEN
...
END;

END LOOP;
...
Рейтинг: 0 / 0
29.05.2020, 10:20
    #39963896
Igor Karmanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка EXCEPTION в цикле LOOP
Пробовал так.
EXCEPTION подсвечивается как во вложении. И ошибка при выполнении:

Error report -
ORA-06550: Строка 105, столбец 9:
PL/SQL: ORA-00933: неверное завершение SQL-предложения
ORA-06550: Строка 103, столбец 8:
PL/SQL: SQL Statement ignored
ORA-06550: Строка 108, столбец 14:
PLS-00103: Встретился символ "JOIN" в то время как ожидалось одно из следующих:

:= . ( @ % ;
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:

Мне надо, чтобы обрабатывался EXCEPTION для каждого селекта)
...
Рейтинг: 0 / 0
29.05.2020, 10:44
    #39963915
Vadim5432
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка EXCEPTION в цикле LOOP
exciter
Igor KarmanovКак мне сделать, чтобы EXCEPTION обрабатывался после каждого селекта с последующим продолжением цикла LOOP?

может быть, добавить внутрь цикла такую конструкцию?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
LOOP

BEGIN
...
EXCEPTION WHEN no_data_found THEN
...
END;

END LOOP;




Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
declare
a number;
begin
  for i in 1..5 
    loop
      null;
      if(i=3) then
       select 1 into a from dual where 1=2;
      end if;
    end loop;
exception
  when no_data_found then 
    dbms_output.put_line('Ееесть! Вернее нет данных и исключение было из цикла');
end; 



Как по мне так все работает в этом плане. Надо смотреть в другом месте. Exception оправдан!
...
Рейтинг: 0 / 0
29.05.2020, 10:48
    #39963920
Igor Karmanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка EXCEPTION в цикле LOOP
Дело в том, что без EXCEPTION данный скрипт отрабатывает, так что склоняюсь к тому, что проблема именно в исключении. Может какой то код к нему надо дописать? Хотя ошибка стандартная.
...
Рейтинг: 0 / 0
29.05.2020, 10:54
    #39963923
Sah
Sah
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка EXCEPTION в цикле LOOP
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
DECLARE
   a              NUMBER;
BEGIN
   FOR i IN 1 .. 5
   LOOP
      BEGIN
         NULL;

         IF (i = 3) THEN
            SELECT 1
              INTO a
              FROM DUAL
             WHERE 1 = 2;
         END IF;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            DBMS_OUTPUT.put_line ('Ееесть! Вернее нет данных и исключение было из цикла');
      END;
   END LOOP;
END;
...
Рейтинг: 0 / 0
29.05.2020, 10:54
    #39963924
exciter
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка EXCEPTION в цикле LOOP
Vadim5432,

Мне кажется, автор хочет добиться примерно такого поведения:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
declare
  a number;
begin
  for i in 1 .. 5 loop
    begin
      null;
      if (i = 3) then
        select 1 into a from dual where 1 = 2;
      end if;
      dbms_output.put_line(i);
    exception
      when no_data_found then
        dbms_output.put_line('Ееесть! Вернее нет данных и исключение было из цикла');
    end;
  end loop;
end;

...
Рейтинг: 0 / 0
29.05.2020, 10:54
    #39963925
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка EXCEPTION в цикле LOOP
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
  ....
  loop
    FETCH am INTO am_entry; 
    exit when am%NOTFOUND;
    BEGIN
      v_col := am_entry.obj_id;
      ....
      select
      ....
      select
      ....
      update
      ....
    EXCEPTION WHEN NO_DATA_FOUND   THEN 
      DBMS_OUTPUT.PUT_LINE ('Не найдено данных для обработки.');
    END;
  end loop;
  CLOSE am; 
END;



ps
если надо
то каждый селект обрамить
Код: plsql
1.
2.
3.
4.
5.
BEGIN
 select
EXCEPTION WHEN NO_DATA_FOUND   THEN 
 DBMS_OUTPUT.PUT_LINE ('Не найдено данных для обработки. для ...');
END;



.....
stax
...
Рейтинг: 0 / 0
29.05.2020, 11:57
    #39963959
Igor Karmanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка EXCEPTION в цикле LOOP
Спасибо за ответы, но ни один способ не работает, все завершаются с ошибкой.

Sah и exciter, ваш способ не работает, по причине того, что подсвечивается ошибкой WHEN (во вложении)
...
Рейтинг: 0 / 0
29.05.2020, 11:59
    #39963963
Igor Karmanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка EXCEPTION в цикле LOOP
Stax, Дело в том, что когда я вношу код с EXCEPTION:

Код: plsql
1.
EXCEPTION WHEN NO_DATA_FOUND   THEN DBMS_OUTPUT.PUT_LINE ('Не найдено данных в одной из проводок по ошибке NullPoINterException');



в любое место тела цикла LOOP, то скрипт заканчивается с ошибкой (
...
Рейтинг: 0 / 0
29.05.2020, 12:11
    #39963973
exciter
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка EXCEPTION в цикле LOOP
Igor Karmanov
Спасибо за ответы, но ни один способ не работает, все завершаются с ошибкой.

Sah и exciter, ваш способ не работает, по причине того, что подсвечивается ошибкой WHEN (во вложении)


А операторы BEGIN и END вы добавили внутрь цикла? Пожалуйста, приведите весь код целиком с использованием тэга SRC, как в первом вашем сообщении.
...
Рейтинг: 0 / 0
29.05.2020, 12:14
    #39963977
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка EXCEPTION в цикле LOOP
Igor Karmanov,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
...
  loop
    FETCH am INTO am_entry; 
    exit when am%NOTFOUND;
    BEGIN
      v_col := am_entry.obj_id;
      ....
      select
      ....
      select
      ....
      update
      ....
    EXCEPTION WHEN NO_DATA_FOUND   THEN 
      DBMS_OUTPUT.PUT_LINE ('Не найдено данных для обработки.');
    END;
  end loop;
  CLOSE am; 
END;



....
stax
...
Рейтинг: 0 / 0
29.05.2020, 12:51
    #39964017
sanBez
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка EXCEPTION в цикле LOOP
Igor Karmanov,

Почему никого не смущает select into ... order by 1 ?
Автор, что будет если здесь выберется несколько записей?
...
Рейтинг: 0 / 0
29.05.2020, 13:01
    #39964026
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка EXCEPTION в цикле LOOP
Автору хотя бы begin / end научиться писать.

А потом учиться дальше .
...
Рейтинг: 0 / 0
29.05.2020, 13:22
    #39964047
Igor Karmanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка EXCEPTION в цикле LOOP
Дико извиняюсь!
Всем огромное спасибо! Действительно, BEGIN и END надо было научиться пользоваться! =)
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Обработка EXCEPTION в цикле LOOP / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]