Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Показать лог из pl\sql блока / 12 сообщений из 12, страница 1 из 1
10.08.2020, 12:37
    #39988127
Леонов Юрий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Показать лог из 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.
79.
80.
81.
82.
83.
84.
85.
86.
WHENEVER OSERROR  EXIT 1 ROLLBACK
WHENEVER SQLERROR EXIT 2 ROLLBACK

SPOOL &1

VARIABLE IS_ERROR NUMBER
VARIABLE LOG_TEXT VARCHAR2(4000)

PROMPT ==== Удаление причин блокировок ===

declare
  LTypeZmin boolean := false;
  LOznaka   boolean := false;
  LWhyBlock boolean := false;
begin
  -- проверяем наличие файлов с типами змин
  :LOG_TEXT := 'Перевіряємо наявність файлів з типами змін...' || chr(13) || chr(10);
  :LOG_TEXT := :LOG_TEXT ||'=================================================='  || chr(13) || chr(10);
  for r in (select t.why from "table_name" t) loop
    if not LTypeZmin then
      :LOG_TEXT := :LOG_TEXT || 'У базі даних є файли з типами змін:' || chr(13) || chr(10);
    end if;
    LTypeZmin := true;
    :LOG_TEXT := :LOG_TEXT || r.why || chr(13) || chr(10);
  end loop;
  if not LTypeZmin then
    :LOG_TEXT := :LOG_TEXT || 'Файлів не виявлено.' || chr(13) || chr(10);
  end if;

  :LOG_TEXT := :LOG_TEXT || 'Пошук серед пов''язаних осіб...' || chr(13) || chr(10);
  :LOG_TEXT := :LOG_TEXT || '==================================================' || chr(13) || chr(10);
  for r in (select t.why from "table_name" t where ...) loop
    if not LOznaka then
      :LOG_TEXT := :LOG_TEXT || 'У базі даних виявлено пов''язаних осіб за ознаками:' || chr(13) || chr(10);
    end if;
    LOznaka   := true;
    :LOG_TEXT := :LOG_TEXT || r.why || chr(13) || chr(10);
  end loop;
  if not LOznaka then
    :LOG_TEXT := :LOG_TEXT || 'Пов''язаних осіб не виявлено.' || chr(13) || chr(10);
  end if;

  :LOG_TEXT := :LOG_TEXT || '==================================================' || chr(13) || chr(10);
  -- проверяем наличие блокировок
  :LOG_TEXT := :LOG_TEXT || 'Перевіряємо наявність блокувань...' || chr(13) || chr(10);
  :LOG_TEXT := :LOG_TEXT || '==================================================' || chr(13) || chr(10);
  for с in (select w.why from "table_name" w where ...) loop
    if not LWhyBlock then
      :LOG_TEXT := :LOG_TEXT || 'У базі даних є блокування з наступними причинами:' || chr(13) || chr(10);
    end if;
    LWhyBlock := true;
    :LOG_TEXT := :LOG_TEXT || с.why || chr(13) || chr(10);
  end loop;
  if not LWhyBlock then
    :LOG_TEXT := :LOG_TEXT || 'Блокувань не виявлено.' || chr(13) || chr(10);
  end if;
  :LOG_TEXT := :LOG_TEXT || '==================================================' || chr(13) || chr(10);
  -- Если есть блокировки или файлы с типами змин то генерим ошибку
  if LTypeZmin or LWhyBlock or LOznaka then
    :IS_ERROR := 1;
    return;
  else
    :IS_ERROR := 0;
  end if;
  --тут исполняемый код
  commit;
end;
/

PROMPT :LOG_TEXT

begin
  if (:IS_ERROR = 1) then 
    raise_application_error(-20000,
                            'Акумулятор не може бути встановлений!');
  end if;
end;
/

COMMIT;

PROMPT ==== Ok ===

SPOOL OFF

EXIT



Текст лога выполнения запроса (LOG_TEXT) показывается, если не было ошибок. Если я генерирую ошибку, то текст из LOG_TEXT не пишется в лог выполнения скрипта. Как быть?

Версия Oracle - 18c 18.0.0.0.0


Заранее благодарен.
...
Рейтинг: 0 / 0
10.08.2020, 12:55
    #39988144
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Показать лог из pl\sql блока
Леонов Юрий,

если SPOOL OFF после PROMPT :LOG_TEXT,
тоже пусто?


ps
+ c WHENEVER SQLERROR EXIT 2 ROLLBACK поексперементировать


pss
последний COMMIT; для перестраховки?
.....
stax
...
Рейтинг: 0 / 0
10.08.2020, 13:21
    #39988156
Леонов Юрий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Показать лог из pl\sql блока
Stax, мне нужно чтобы показало текст, но и при возникновении ошибки прервалось удаление.
Так что WHENEVER SQLERROR точно не в тему
Commit в конце да, для перестраховки
...
Рейтинг: 0 / 0
10.08.2020, 13:41
    #39988170
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Показать лог из pl\sql блока
Леонов Юрий
Stax, мне нужно чтобы показало текст, но и при возникновении ошибки прервалось удаление.
Так что WHENEVER SQLERROR точно не в тему
Commit в конце да, для перестраховки


я понимаю, о чем скрипт (в скрипте нет о удалении)
у меня нет 18-ки

предлагал для поиска причины
1) принудительно закрыть спул
2) закоментировать SQLERROR (мож бага/фича и не закрывает спул)
3) закрыть спул и открыть с append
4) задублировать вивод dbms_output
5) вместо prompt select
и тд

ps
я очень редко "логировал" c помощью bind

.....
stax
...
Рейтинг: 0 / 0
10.08.2020, 14:06
    #39988186
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Показать лог из pl\sql блока
Леонов Юрий,

Попробуйте добавить общий exception handler с rollback, и чтобы ошибку не рейзило, а возвращало в бинде.
...
Рейтинг: 0 / 0
10.08.2020, 14:08
    #39988192
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Показать лог из pl\sql блока
Леонов Юрий,

Аа, понял в чем вопрос: вам не prompt надо, а print чтобы вывести бинд переменную
...
Рейтинг: 0 / 0
10.08.2020, 14:15
    #39988197
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Показать лог из pl\sql блока
xtender
Леонов Юрий,

Аа, понял в чем вопрос: вам не prompt надо, а print чтобы вывести бинд переменную


авторТекст лога выполнения запроса (LOG_TEXT) показывается , если не было ошибок

я так понял без raise у Юрия prompt работает

.....
stax
...
Рейтинг: 0 / 0
10.08.2020, 14:20
    #39988201
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Показать лог из pl\sql блока
Stax,

Prompt не выводит бинды, только текст
...
Рейтинг: 0 / 0
10.08.2020, 15:35
    #39988251
Леонов Юрий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Показать лог из pl\sql блока
xtender,

Точно, лажанулся. Поменял на PRINT и сразу заработало.
Еще одно дополнение: при выводе PRINT-ом пишет и название переменной. Можно без нее выводить?
...
Рейтинг: 0 / 0
10.08.2020, 17:48
    #39988340
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Показать лог из pl\sql блока
Леонов Юрий,

Насколько помню set head off должно помочь
...
Рейтинг: 0 / 0
10.08.2020, 17:49
    #39988342
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Показать лог из pl\sql блока
В любом случае бинды можно и из дуала поселектить как надо
...
Рейтинг: 0 / 0
10.08.2020, 21:04
    #39988409
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Показать лог из pl\sql блока
Леонов Юрий

Можно без нее выводить?


Stax

5) вместо prompt select


я б :LOG_TEXT varchar2( 4000 ) заменил на dbms_output
.....
stax
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Показать лог из pl\sql блока / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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