powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / пользовательские exception
25 сообщений из 47, страница 1 из 2
пользовательские exception
    #39497832
RMagistr2015
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пишу следующий код:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select nvl(b.client_id,0)
      into id_client
      from bsc b
      where b.bsc_id = r_id;

select p.profile_id 
         into p_count
         from profile p 
         where p.client_id=id_client
           and rownum=1;


в обоих случаях может возникнуть исключение NO_DATA_FOUND
Но мне нужно понимать в каком именно случае это исключение возникает, в первом или во втором.
читал про исключения объявленные пользователем. но вы этом случае предлагается вызывать его самостоятельно, что-то вроде:
Код: plsql
1.
2.
if id_client=0 then
   raise my_exception;


И дальше уже в конце (как правило) кода обрабатывать его.
Но как вызвать конкретное объявленное пользовательское исключение, если может возникать ошибка NO_DATA_FOUND ? Как понять в каком именно месте возникла эта NO_DATA_FOUND...?
...
Рейтинг: 0 / 0
пользовательские exception
    #39497846
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
BEGIN
select nvl(b.client_id,0)
      into id_client
      from bsc b
      where b.bsc_id = r_id;
  EXCEPTION
    WHEN NO_DATA_FOUND
      THEN ... -- исключение в первом.
END;
BEGIN
select p.profile_id 
         into p_count
         from profile p 
         where p.client_id=id_client
           and rownum=1;
  EXCEPTION
    WHEN NO_DATA_FOUND
      THEN ... -- исключение в втором.
END;



SY.
...
Рейтинг: 0 / 0
пользовательские exception
    #39497849
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RMagistr2015,
шо
опять ???
...
Рейтинг: 0 / 0
пользовательские exception
    #39497856
saxarock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RMagistr2015,

NO_DATA_FOUND - не исключение!
В исключении (exception) ты обрабатываешь NO_DATA_FOUND если нужно)

имхо используй логирующую табличку чтобы писать NO_DATA_FOUND возникновение.
...
Рейтинг: 0 / 0
пользовательские exception
    #39497862
RMagistr2015
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123ййRMagistr2015,
шо
опять ???
Нет, в том посте другой смысл был
...
Рейтинг: 0 / 0
пользовательские exception
    #39497863
RMagistr2015
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saxarockRMagistr2015,

NO_DATA_FOUND - не исключение!
В исключении (exception) ты обрабатываешь NO_DATA_FOUND если нужно)

имхо используй логирующую табличку чтобы писать NO_DATA_FOUND возникновение.
Спасибо, уже использую )))
...
Рейтинг: 0 / 0
пользовательские exception
    #39497864
RMagistr2015
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
BEGIN
select nvl(b.client_id,0)
      into id_client
      from bsc b
      where b.bsc_id = r_id;
  EXCEPTION
    WHEN NO_DATA_FOUND
      THEN ... -- исключение в первом.
END;
BEGIN
select p.profile_id 
         into p_count
         from profile p 
         where p.client_id=id_client
           and rownum=1;
  EXCEPTION
    WHEN NO_DATA_FOUND
      THEN ... -- исключение в втором.
END;



SY.
Спасибо большое за совет, но тогда пропадает вся прелесть блока exception, когда все ошибки обрабатываются визуально в одном месте (в конце программы), повышая тем самы читаемость программы )))
Есть ли другие возможности как-то поименовать эти exception, ну в общем как-то по красивее это сделать? )))
...
Рейтинг: 0 / 0
пользовательские exception
    #39497868
RMagistr2015, эстет ты наш, тебе таки шашечки или ехать?
...
Рейтинг: 0 / 0
пользовательские exception
    #39497869
saxarock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RMagistr2015поименовать эти exception, ну в общем как-то по красивее это сделать? )))
да можешь сделать вот так)

Код: 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.
BEGIN
select nvl(b.client_id,0)
      into id_client
      from bsc b
      where b.bsc_id = r_id;
/*************************/
---- исключение в первом.--
/***********************/
  EXCEPTION
    WHEN NO_DATA_FOUND
      THEN ... 
END;
BEGIN
select p.profile_id 
         into p_count
         from profile p 
         where p.client_id=id_client
           and rownum=1;
/*************************/
---- исключение в втором.--
/***********************/
  EXCEPTION
    WHEN NO_DATA_FOUND
      THEN ... 
END;
...
Рейтинг: 0 / 0
пользовательские exception
    #39497878
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
declare
  l_num number;
begin
  select count(*)
  into l_num
  from dual
  where 1 = 0;
  
  if l_num = 0 then 
    raise_application_error(-20001, 'Магистр, одумайся');
  end if;
  
end;
/
...
Рейтинг: 0 / 0
пользовательские exception
    #39497880
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RMagistr2015пропадает вся прелесть Не вся, а только половина, так твоя прелесть раздвоилась до этого на два запроса.
...
Рейтинг: 0 / 0
пользовательские exception
    #39497889
Код: 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.
set serveroutput on
declare
  l_num               number;
  l_magistr_not_found exception;
  l_magistr_pupsik    exception;
begin

  begin
    select 1
    into l_num
    from dual
    where 1 = 1;
  exception
    when no_data_found then
      raise l_magistr_not_found;
  end;  
  
  begin
    select 1
    into l_num
    from dual
    where 2 = 3;
  exception
    when no_data_found then
      raise l_magistr_pupsik;
  end;  
  
  exception
    when l_magistr_not_found then dbms_output.put_line('Привет!');
    when l_magistr_pupsik    then dbms_output.put_line('Пока!');
end;
/
...
Рейтинг: 0 / 0
пользовательские exception
    #39497893
Petya.А
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Именуй меня полностью
Код: plsql
1.
2.


Код: 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.
declare
  l_num               number;
  l_exception    exception;
  l_message    varchar2(4000);

begin

  begin
    select 1
    into l_num
    from dual
    where 1 = 1;
  exception
    when no_data_found then
      l_message := 'Hello';
      raise l_exception;
  end;  
  
  begin
    select 1
    into l_num
    from dual
    where 2 = 3;
  exception
    when no_data_found then
      l_message := 'Bye-bye';
      raise l_exception;
  end;  
  
  exception
    when l_exception then raise_application_error(-20666, l_message);
end;
/
...
Рейтинг: 0 / 0
пользовательские exception
    #39497906
Petya.А,
кто больше предложит вариантов для магистра, который и не магистр вовсе?
...
Рейтинг: 0 / 0
пользовательские exception
    #39497924
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saxarockRMagistr2015,

NO_DATA_FOUND - не исключение!
В исключении (exception) ты обрабатываешь NO_DATA_FOUND если нужно)

имхо используй логирующую табличку чтобы писать NO_DATA_FOUND возникновение.
https://docs.oracle.com/cd/E18283_01/appdev.112/e17126/errors.htm#BABIIEFC

Table 11-3 PL/SQL Predefined Exceptions
NO_DATA_FOUND +100

.....
stax
...
Рейтинг: 0 / 0
пользовательские exception
    #39497935
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RMagistr2015Но как вызвать конкретное объявленное пользовательское исключение, если может возникать ошибка NO_DATA_FOUND ? Как понять в каком именно месте возникла эта NO_DATA_FOUND...?
....
но тогда пропадает вся прелесть блока exception, когда все ошибки обрабатываются визуально в одном месте (в конце программы), повышая тем самы читаемость программы )))
Есть ли другие возможности как-то поименовать эти exception, ну в общем как-то по красивее это сделать? )))
красота кончено же спасёт мир (угробит его).
можно сделать всё, что пожелаешь, и даже зараз:
Код: 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.
declare
  message varchar2(50);
  cnt1    integer;
  cnt2    integer;
  id_client integer;
  p_count integer;
  no_data_found_u exception;
  pragma exception_init(no_data_found_u,-20000);
begin
  select count(1) into cnt1 from dual where 1 = 3;
  if cnt1 < 1 then
    message := 'no data found в первом запросе';
    goto except_block;
  else
    select 1
      into id_client
      from dual
     where 1 = 1;
  end if;
  select count(4) into cnt2 from dual where 2 = 6;
  if cnt2 < 1 then
    message := 'no data found во втором запросе';
    goto except_block;
  else
    select 1
      into p_count
      from dual
     where 1=1;
  end if;

/**************************************************/
/*ОДИН ПРЕЛЕСТНЫЙ ВИЗУАЛЬНО КРАСИВЫЙ ПОИМЕНОВАННЫЙ*/
/*БЛОК ИСКЛЮЧЕНИЯ  В КОНЦЕ ПРОГРАММЫ, ПОНИМАЮЩИЙ**/
/*В КАКОМ ИМЕННО МЕСТЕ ВОЗНИКЛА ЭТА NO_DATA_FOUND**/
/***********************************************/
  <<except_block>>
  if message is not null then
  raise_application_error(-20000, message);
  end if;

end;
...
Рейтинг: 0 / 0
пользовательские exception
    #39497952
Не Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Fogel no_data_found_u exception;
pragma exception_init(no_data_found_u,-20000);


Это зачем?
...
Рейтинг: 0 / 0
пользовательские exception
    #39497971
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fogel
Код: 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.
declare
  message varchar2(50);
  cnt1    integer;
  cnt2    integer;
  id_client integer;
  p_count integer;
  no_data_found_u exception;
  pragma exception_init(no_data_found_u,-20000);
begin
 здесь запись еще была
  select count(1) into cnt1 from dual where 1 = 3;
  if cnt1 < 1 then
    message := 'no data found в первом запросе';
    goto except_block;
  else
 за время (вот сдесь) проверки удалили запись, шо будете делать?
    select 1
      into id_client
      from dual
     where 1 = 1;
  end if;
  select count(4) into cnt2 from dual where 2 = 6;
  if cnt2 < 1 then
    message := 'no data found во втором запросе';
    goto except_block;
  else
    select 1
      into p_count
      from dual
     where 1=1;
  end if;

/**************************************************/
/*ОДИН ПРЕЛЕСТНЫЙ ВИЗУАЛЬНО КРАСИВЫЙ ПОИМЕНОВАННЫЙ*/
/*БЛОК ИСКЛЮЧЕНИЯ  В КОНЦЕ ПРОГРАММЫ, ПОНИМАЮЩИЙ**/
/*В КАКОМ ИМЕННО МЕСТЕ ВОЗНИКЛА ЭТА NO_DATA_FOUND**/
/***********************************************/
  <<except_block>>
  if message is not null then
  raise_application_error(-20000, message);
  end if;

end;



....
stax
...
Рейтинг: 0 / 0
пользовательские exception
    #39498012
xenix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор--здесь запись еще была
--за время (вот сдесь) проверки удалили запись, шо будете делать?

Так как, все-таки, правильно проверять существование записи и гарантировать что параллельно выполняющееся нечто ее не грохнет?
...
Рейтинг: 0 / 0
пользовательские exception
    #39498067
проходил мимо...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xenixавтор--здесь запись еще была
--за время (вот сдесь) проверки удалили запись, шо будете делать?

Так как, все-таки, правильно проверять существование записи и гарантировать что параллельно выполняющееся нечто ее не грохнет?
Залочить её (запись). Или проверять и работать с ней в одном sql-предложении.
...
Рейтинг: 0 / 0
пользовательские exception
    #39498078
saxarock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StaxTable 11-3 PL/SQL Predefined Exceptions
NO_DATA_FOUND +100 - ога, ога Table 11-3 lists the names and error codes of the predefined exceptions.
...
Рейтинг: 0 / 0
пользовательские exception
    #39498087
RMagistr2015
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Именуй меня полностью
Код: 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.
set serveroutput on
declare
  l_num               number;
  l_magistr_not_found exception;
  l_magistr_pupsik    exception;
begin

  begin
    select 1
    into l_num
    from dual
    where 1 = 1;
  exception
    when no_data_found then
      raise l_magistr_not_found;
  end;  
  
  begin
    select 1
    into l_num
    from dual
    where 2 = 3;
  exception
    when no_data_found then
      raise l_magistr_pupsik;
  end;  
  
  exception
    when l_magistr_not_found then dbms_output.put_line('Привет!');
    when l_magistr_pupsik    then dbms_output.put_line('Пока!');
end;
/



Прикольно )))
Петин вариант можно то же рассматривать, хоть его и залочили за что-то.
Спасибо ))))
...
Рейтинг: 0 / 0
пользовательские exception
    #39498089
RMagistr2015
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лишнее сканирование
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
declare
  l_num number;
begin
  select count(*)
  into l_num
  from dual
  where 1 = 0;
  
  if l_num = 0 then 
    raise_application_error(-20001, 'Магистр, одумайся');
  end if;
  
end;
/



Ок, конкретно в вашем примере работает, а если с реальными и нужно действительн что-то посчитать? ))
...
Рейтинг: 0 / 0
пользовательские exception
    #39498107
RMagistr2015
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Именуй меня полностью
Код: 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.
set serveroutput on
declare
  l_num               number;
  l_magistr_not_found exception;
  l_magistr_pupsik    exception;
begin

  begin
    select 1
    into l_num
    from dual
    where 1 = 1;
  exception
    when no_data_found then
      raise l_magistr_not_found;
  end;  
  
  begin
    select 1
    into l_num
    from dual
    where 2 = 3;
  exception
    when no_data_found then
      raise l_magistr_pupsik;
  end;  
  
  exception
    when l_magistr_not_found then dbms_output.put_line('Привет!');
    when l_magistr_pupsik    then dbms_output.put_line('Пока!');
end;
/


Выдает ошибку на втором exception (Во вложении)
...
Рейтинг: 0 / 0
пользовательские exception
    #39498121
RMagistr2015
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто-нибудь знает почему там ошибка возникает при появлении второго exception ? (((((((
...
Рейтинг: 0 / 0
25 сообщений из 47, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / пользовательские exception
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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