powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Обработка EXCEPTION в цикле LOOP
15 сообщений из 15, страница 1 из 1
Обработка EXCEPTION в цикле LOOP
    #39963868
Igor Karmanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Прошу не пинать меня сильно, так как я новичок в 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
Обработка EXCEPTION в цикле LOOP
    #39963878
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;
...
Рейтинг: 0 / 0
Обработка EXCEPTION в цикле LOOP
    #39963896
Igor Karmanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пробовал так.
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
Обработка EXCEPTION в цикле LOOP
    #39963915
Фотография Vadim5432
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Обработка EXCEPTION в цикле LOOP
    #39963920
Igor Karmanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дело в том, что без EXCEPTION данный скрипт отрабатывает, так что склоняюсь к тому, что проблема именно в исключении. Может какой то код к нему надо дописать? Хотя ошибка стандартная.
...
Рейтинг: 0 / 0
Обработка EXCEPTION в цикле LOOP
    #39963923
Sah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Обработка EXCEPTION в цикле LOOP
    #39963924
exciter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Обработка EXCEPTION в цикле LOOP
    #39963925
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Обработка EXCEPTION в цикле LOOP
    #39963959
Igor Karmanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответы, но ни один способ не работает, все завершаются с ошибкой.

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

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



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

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


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

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

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


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