Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / пользовательские exception / 25 сообщений из 47, страница 1 из 2
31.07.2017, 15:37
    #39497832
RMagistr2015
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пользовательские exception
Пишу следующий код:
Код: 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
31.07.2017, 15:54
    #39497846
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пользовательские exception
Код: 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
31.07.2017, 15:56
    #39497849
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пользовательские exception
RMagistr2015,
шо
опять ???
...
Рейтинг: 0 / 0
31.07.2017, 16:00
    #39497856
saxarock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пользовательские exception
RMagistr2015,

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

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

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

имхо используй логирующую табличку чтобы писать NO_DATA_FOUND возникновение.
Спасибо, уже использую )))
...
Рейтинг: 0 / 0
31.07.2017, 16:07
    #39497864
RMagistr2015
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пользовательские exception
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
31.07.2017, 16:10
    #39497868
пользовательские exception
RMagistr2015, эстет ты наш, тебе таки шашечки или ехать?
...
Рейтинг: 0 / 0
31.07.2017, 16:13
    #39497869
saxarock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пользовательские exception
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
31.07.2017, 16:30
    #39497878
пользовательские exception
Код: 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
31.07.2017, 16:30
    #39497880
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пользовательские exception
RMagistr2015пропадает вся прелесть Не вся, а только половина, так твоя прелесть раздвоилась до этого на два запроса.
...
Рейтинг: 0 / 0
31.07.2017, 16:38
    #39497889
пользовательские 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.
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
31.07.2017, 16:42
    #39497893
Petya.А
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пользовательские exception
Именуй меня полностью
Код: 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
31.07.2017, 16:54
    #39497906
пользовательские exception
Petya.А,
кто больше предложит вариантов для магистра, который и не магистр вовсе?
...
Рейтинг: 0 / 0
31.07.2017, 17:33
    #39497924
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пользовательские exception
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
31.07.2017, 17:55
    #39497935
Fogel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пользовательские exception
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
31.07.2017, 18:22
    #39497952
Не Elic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пользовательские exception
Fogel no_data_found_u exception;
pragma exception_init(no_data_found_u,-20000);


Это зачем?
...
Рейтинг: 0 / 0
31.07.2017, 19:42
    #39497971
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пользовательские exception
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
31.07.2017, 22:05
    #39498012
xenix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пользовательские exception
автор--здесь запись еще была
--за время (вот сдесь) проверки удалили запись, шо будете делать?

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

Так как, все-таки, правильно проверять существование записи и гарантировать что параллельно выполняющееся нечто ее не грохнет?
Залочить её (запись). Или проверять и работать с ней в одном sql-предложении.
...
Рейтинг: 0 / 0
01.08.2017, 06:41
    #39498078
saxarock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пользовательские exception
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
01.08.2017, 07:33
    #39498087
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.
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
01.08.2017, 07:39
    #39498089
RMagistr2015
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пользовательские exception
Лишнее сканирование
Код: 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
01.08.2017, 08:22
    #39498107
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.
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
01.08.2017, 08:55
    #39498121
RMagistr2015
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пользовательские exception
Кто-нибудь знает почему там ошибка возникает при появлении второго exception ? (((((((
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / пользовательские exception / 25 сообщений из 47, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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