powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Показать лог из pl\sql блока
12 сообщений из 12, страница 1 из 1
Показать лог из pl\sql блока
    #39988127
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Есть скрипт
Код: 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
Показать лог из pl\sql блока
    #39988144
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов Юрий,

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


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


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


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

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

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

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

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

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

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


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

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

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

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

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

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

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


Stax

5) вместо prompt select


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


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