Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Есть ли в Оракле блок Finally как в java / 21 сообщений из 21, страница 1 из 1
11.08.2017, 10:11
    #39503851
QWASQ1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в Оракле блок Finally как в java
в java есть блок Finally который выполняется вне зависимости от того выдал ли опасный код ошибку или нет , есть ли что нибудь похожие в pl/sql так как приходится переписывать один и тот же код в саму функцию и еще и в exception
...
Рейтинг: 0 / 0
11.08.2017, 10:15
    #39503855
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в Оракле блок Finally как в java
В PL/SQL - нет.
...
Рейтинг: 0 / 0
11.08.2017, 10:23
    #39503861
QWASQ1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в Оракле блок Finally как в java
Elic,

то-есть надо один и тот же код прописывать дважды ? а какие нибудь лазейки , хитрости ?
...
Рейтинг: 0 / 0
11.08.2017, 10:40
    #39503873
AlexFF__|
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в Оракле блок Finally как в java
QWASQ1,

Добавить в конце алгоритма exception
...
Рейтинг: 0 / 0
11.08.2017, 10:48
    #39503876
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в Оракле блок Finally как в java
AlexFF__|Добавить в конце алгоритма exceptionВ котором продублировать код.
...
Рейтинг: 0 / 0
11.08.2017, 10:51
    #39503878
n0rd1c.c0ld
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в Оракле блок Finally как в java
AlexFF__|QWASQ1,

Добавить в конце алгоритма exception
Но надо помнить, что это не совсем честная альтернатива. Придется дублировать код столько раз, сколько видов исключений обрабатывается в блоке exception.
...
Рейтинг: 0 / 0
11.08.2017, 10:58
    #39503884
ma1tus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в Оракле блок Finally как в java
Emulation of Finally ...

n0rd1c.c0ldПридется дублировать кодпроцедуры, функции... не ?
...
Рейтинг: 0 / 0
11.08.2017, 11:02
    #39503889
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в Оракле блок Finally как в java
Код: 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.
Declare 
 Subtype T_ERROR_MESSAGE is Varchar2(2000);
 
 ci_All_Is_Lost constant Number := -20100; 
 
 i Number;
 bitsOver Boolean := False;
 vc_error T_ERROR_MESSAGE;
 
 Cursor bad_cursor is  Select 1/0 From dual; 
 
Begin
  Open bad_cursor;
  
  <<TRY>>
  Begin  
   Fetch bad_cursor Into i;      
  Exception 
    WHEN ZERO_DIVIDE
      THEN
   <<CATCH>>     
        vc_error := dbms_utility.format_error_stack();
        bitsOver := true;  
  End;
  
  <<Finally>>  
  Begin
    Close bad_cursor;  
    IF bitsover
      THEN
        RAISE_APPLICATION_ERROR(ci_All_Is_Lost, 'Шеф! Все пропало! ('||vc_error||')');
    END IF;
  End;  
End;  
/ 
...
Рейтинг: 0 / 0
11.08.2017, 11:05
    #39503891
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в Оракле блок Finally как в java
n0rd1c.c0ldПридется дублировать код столько раз, сколько видов исключений обрабатывается в блоке exception.А умные люди продублируют только раз, обернув в ещё один блок.
...
Рейтинг: 0 / 0
11.08.2017, 13:49
    #39504063
n0rd1c.c0ld
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в Оракле блок Finally как в java
ma1tus Emulation of Finally ...
n0rd1c.c0ldПридется дублировать кодпроцедуры, функции... не ?
Почему не? Вполне.
Я отметил, что это не будет честной альтернативой finally. Хотя бы потому что, невозможно забыть "вызвать" блок finally.

ElicА умные люди продублируют только раз, обернув в ещё один блок.
Рекомендации умных людей никто не оспаривает, но все равно придется делать re-raise в каждом обрабатываемом блоке exception. И помнить в дальнейшем, что re-raise обязателен.
...
Рейтинг: 0 / 0
11.08.2017, 14:04
    #39504086
Andrey.L
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в Оракле блок Finally как в java
QWASQ1,

Что-то (хрустальный шар) мне подсказывает, что тебе не нужен блок finally или его аналоги, а тебе просто нужно провести все необходимые проверки до начала обработки. И если какая-то проверка не прошла, то генерировать исключение.
...
Рейтинг: 0 / 0
11.08.2017, 14:17
    #39504099
AlexFF__|
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в Оракле блок Finally как в java
Где вы там умудряетесь получать дублирование кода?

Код: 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.
declare
  procedure test( v number ) is
    ok_error  exception;
    v1  number;
  begin
    begin
      dbms_output.put_line( 'test=' || v);
      v1 := 1 / mod(v,2);
      raise ok_error;
    exception
      when others then
        dbms_output.put_line( 'finally' || v1 );
        raise;
    end;
  exception
    when ok_error then
      null;
    when others then
      dbms_output.put_line( SQLERRM );
  end;
begin
  for i in 1..10
  loop
    test(i);
  end loop;
end;
/


Что, конечно, не отменяет странности реализации =)
...
Рейтинг: 0 / 0
11.08.2017, 14:35
    #39504116
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в Оракле блок Finally как в java
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
DECLARE
  finally exception;
BEGIN
  ... DO WORK ...;
  raise finally;
EXCEPTION when others then
  ... DO FINALLY ...;
  begin raise; exception when finally then null;
  WHEN OTHERS THEN -- или не others
     ... DO EXCEPTION ...
  end;
END;
/
...
Рейтинг: 0 / 0
11.08.2017, 14:39
    #39504117
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в Оракле блок Finally как в java
-2-,

стоило бы запретить писать на pl/sql,
если бы raise finally; был бы единственный способ использования языка.
...
Рейтинг: 0 / 0
12.08.2017, 09:47
    #39504334
пробегал
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в Оракле блок Finally как в java
booby-2-,

стоило бы запретить писать на pl/sql,
если бы raise finally; был бы единственный способ использования языка.

Это да.
Вообще, exception - механизм затратный.
Это уже много раз обсасывалось на habr.
И прогрессивное человечество, которому требуется high performance, пытается совсем не использовать их.
Но PL/SQL - все таки не язык для скоростных алгоритмов, а бизнес-язык, поэтому здесь уместны sql exception (no_data_found, too_many_rows), и некоторые остальныe из стандартныех.
Своих, высосанных из пальца, exception лучше не плодить, а обходиться другими способами.
...
Рейтинг: 0 / 0
14.08.2017, 09:01
    #39504758
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в Оракле блок Finally как в java
Elicn0rd1c.c0ldПридется дублировать код столько раз, сколько видов исключений обрабатывается в блоке exception.А умные люди продублируют только раз, обернув в ещё один блок.
Зачем код -то дублировать? case по sqlcode в большинстве случаев достаточно.
...
Рейтинг: 0 / 0
14.08.2017, 09:04
    #39504759
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в Оракле блок Finally как в java
Сергей Арсеньев,

Правда так делать не надо. :)
...
Рейтинг: 0 / 0
14.08.2017, 09:07
    #39504760
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в Оракле блок Finally как в java
Сергей АрсеньевElicпропущено...
А умные люди продублируют только раз, обернув в ещё один блок.Зачем код -то дублировать? case по sqlcode в большинстве случаев достаточно.Мсье точно знает, что такое finally?
...
Рейтинг: 0 / 0
14.08.2017, 09:18
    #39504764
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в Оракле блок Finally как в java
Elic,

сделать - что-то в конце блока, оттянув конец, каким бы ужасным он не был. )

Обсуждали вариант с бросанием левого исключения и его перехватом наравне с другими.
Дальше все просто. По кейс старая логика (один раз). Финал (один раз). Все что не вписывалось в старую логику еще раз на raise_new_exception (sqlcode, sqlerrm);

P.S. подход не без недостатков. И оборачивание в двойной блок, лучше. Но смысл тот же.

P.P.S. и да стектрейс будет не торт.
...
Рейтинг: 0 / 0
14.08.2017, 09:26
    #39504766
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в Оракле блок Finally как в java
Сергей Арсеньев,

Хотя блоков лучше не два, а три... :)


P.S. дайте мне таблеток от жадности и побольше. :)
...
Рейтинг: 0 / 0
14.08.2017, 09:29
    #39504770
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в Оракле блок Finally как в java
QWASQ1в java есть блок Finallyв Java-то есть, а в байткоде-то нет: https://stackoverflow.com/questions/29061627/why-does-the-java-compiler-copy-finally-blocks
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Есть ли в Оракле блок Finally как в java / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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