powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Можно ли отследить статус выполнения процедуры?
20 сообщений из 20, страница 1 из 1
Можно ли отследить статус выполнения процедуры?
    #39399030
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня есть долгоиграющий скрипт PL/SQL, который в процессе работы выводит информацию через dbms_output.
Но эта информация выводится только после того, как скрипт завершит работу, а до этого момента не ясно, на какой он стадии.
При запуске скрипта на рабочей базе выполняется несколько часов и неясно, он завис, или все же выполняется.
Скрипт я выполняю в TOAD, но при выполнении в sqlplus ситуация такая же, пока блок PL/SQL не завершит работу, никакого промежуточного вывода нет.
set echo on мне не подходит, prompt внутри блока PL/SQL использовать нельзя.
Можно ли вывести текст, чтобы он сразу же отразился на клиенте?

Как вариант, можно сообщения выводить с таблицу, но тут я не знаю, как зафиксировать в этой таблице запись и при этом не закрывать транзакцию.
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
Можно ли отследить статус выполнения процедуры?
    #39399035
arlx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автономная транзакция
...
Рейтинг: 0 / 0
Можно ли отследить статус выполнения процедуры?
    #39399037
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.У меня есть долгоиграющий скрипт PL/SQL, который в процессе работы выводит информацию черезRTFM DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS
Alibek B.я не знаю, как зафиксировать в этой таблице запись и при этом не закрывать транзакцию.RTFM pragma autonomous_transaction
...
Рейтинг: 0 / 0
Можно ли отследить статус выполнения процедуры?
    #39399041
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicRTFM DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS
Может быть я неправильно понял, но это даст мне возможность просмотреть процент выполнения (процент от totalwork) и прочитать сообщение вида "Rowid Range Scan: TABLE: 12777 out of 12777 Blocks done".
Если так, то это не подойдет, мне нужно видеть все сообщения, которые выводит скрипт в процессе работы.

ElicRTFM pragma autonomous_transaction
Спасибо за подсказку, теперь понятно, как сделать вывод в таблицу.
А просто вывести текст на клиенте нельзя?
...
Рейтинг: 0 / 0
Можно ли отследить статус выполнения процедуры?
    #39399053
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.А просто вывести текст на клиенте нельзя?В готовый Гуй - нельзя. Тут нужно программировать межсессионное взаимодействие любым из множества способов.
...
Рейтинг: 0 / 0
Можно ли отследить статус выполнения процедуры?
    #39399117
alexk123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,
если вообще без создания таблиц, то уже ссылку дали , вот на DBMS_APPLICATION_INFO
там пример
CREATE or replace PROCEDURE add_employee(
name VARCHAR2,
salary NUMBER,
manager NUMBER,
title VARCHAR2,
commission NUMBER,
department NUMBER) AS
BEGIN
DBMS_APPLICATION_INFO.SET_MODULE(
module_name => 'add_employee',
action_name => 'insert into emp');
INSERT INTO emp
(ename, empno, sal, mgr, job, hiredate, comm, deptno)
VALUES (name, emp_seq.nextval, salary, manager, title, SYSDATE,
commission, department);
DBMS_APPLICATION_INFO.SET_MODULE(null,null);
END;

дальше с клиента надо через вторую сессию посмотреть что выполняет необходимая сессия
через select * from v$session
...
Рейтинг: 0 / 0
Можно ли отследить статус выполнения процедуры?
    #39400347
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Столкнулся со странностью в автономных транзакциях.
Есть такой скрипт (скелет):
Код: 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.
DECLARE
  vLogScope         varchar2(40)   := 'myscript-'||SYS_GUID();
  vLogCount         number         := 0;

PROCEDURE log (message in varchar2 := null) IS
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  vLogCount := vLogCount + 1;
  dbms_output.put_line ('['||to_char(vLogCount, 'FM0000')||'] '||message);
  insert into DYNRPT_LOGS (LOG_SCOPE, LOG_INDEX, LOG_MESSAGE)
  values (vLogScope, vLogCount, message);
  commit;
END;

BEGIN
  log ('Подготовка');
...
  <sql1>
  commit;
  log('Запрос 1 выполнен');
...
  vCounter := 0;
  LOOP
    vCounter := vCounter + 1;
    exit when (vCounter > 10);
...
    <sql2>
    commit;
    log('  - запрос 2, шаг '||vCounter);
...
  END LOOP;
END;



Запускаю скрипт в командной строке Windows (с помощью sqlplus), параллельно в TOAD наблюдаю за таблицей DYNRPT_LOGS, которая пополняется значениями.
Странность я обнаружил, когда случайно закрыл командную строку с выполняющимся скриптом, но потом проверил отдельно и странность повторилась.
Странность в следующем.

Запускаю скрипт в командной строке, параллельно смотрю за таблицей DYNRPT_LOGS, в ней понемногу добавляются строки вида " - запрос 2, шаг 5".
Закрываю командную строку вместе со скриптом, окно закрылось, процессов cmd.exe или sqlplus.exe в диспетчере задач не видно.
Однако в течении какого-то времени в DYNRPT_LOGS продолжают появляться новые записи, причем не одна запись (которую можно было бы объяснить тем, что процедура log уже запущена на сервере и просто завершила свою работу), а несколько записей (то есть цикл LOOP ... END LOOP продолжает работать).
Более того, если скрипт запустить снова, то иногда я наблюдал, что в таблице DYNRPT_LOGS появляются записи как с новым LOG_SCOPE, так и с LOG_SCOPE из ранее запущенного и завершенного скрипта. Правда в последнем случае я возможно что-то напутал.

Это нормально или это какой-то сбой?
...
Рейтинг: 0 / 0
Можно ли отследить статус выполнения процедуры?
    #39400369
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.это какой-то сбой?В знаниях.
Alibek B.cmd.exe или sqlplus.execmd.exe или sqlplus.exe не являются процессами СУБД.
...
Рейтинг: 0 / 0
Можно ли отследить статус выполнения процедуры?
    #39400371
ln123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это нормально, клиент послал код, а сервер его выполняет, а о том что клиента уже нет сервер конечно узнает но не так сразу :)
...
Рейтинг: 0 / 0
Можно ли отследить статус выполнения процедуры?
    #39400400
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Другими словами, весь скрипт PL/SQL (или во всяком случае его часть до символа /) отправляется на сервер и далее наличие клиента в живых для работы скрипта не требуется, так?
Да, в Oracle некоторые подходы необычны, запомню этот момент. Тут, по идее, может быть спорный момент в том, что если в скрипте есть commit, то изменения будут применены даже если клиентское приложение завершилось аварийно и пользователь ждет, что изменения не применены.
...
Рейтинг: 0 / 0
Можно ли отследить статус выполнения процедуры?
    #39400405
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Другими словами, весь скрипт PL/SQL (или во всяком случае его часть до символа /) отправляется на сервер и далее наличие клиента в живых для работы скрипта не требуется, так?
Да, в Oracle некоторые подходы необычны, запомню этот момент. Тут, по идее, может быть спорный момент в том, что если в скрипте есть commit, то изменения будут применены даже если клиентское приложение завершилось аварийно и пользователь ждет, что изменения не применены.

Не надо придумывать, нужно прочитать про архитектуру клиент-сервер + работа сети
...
Рейтинг: 0 / 0
Можно ли отследить статус выполнения процедуры?
    #39400407
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Да, в Oracle некоторые подходы необычныдумаешь, где-то иначе?
...
Рейтинг: 0 / 0
Можно ли отследить статус выполнения процедуры?
    #39400586
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Столкнулся со странностью в автономных транзакциях.
Есть такой скрипт (скелет):
Код: 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.
DECLARE
  vLogScope         varchar2(40)   := 'myscript-'||SYS_GUID();
  vLogCount         number         := 0;

PROCEDURE log (message in varchar2 := null) IS
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  vLogCount := vLogCount + 1;
  dbms_output.put_line ('['||to_char(vLogCount, 'FM0000')||'] '||message);
  insert into DYNRPT_LOGS (LOG_SCOPE, LOG_INDEX, LOG_MESSAGE)
  values (vLogScope, vLogCount, message);
  commit;
END;

BEGIN
  log ('Подготовка');
...
  <sql1>
  commit;
  log('Запрос 1 выполнен');
...
  vCounter := 0;
  LOOP
    vCounter := vCounter + 1;
    exit when (vCounter > 10);
...
    <sql2>
    commit;
    log('  - запрос 2, шаг '||vCounter);
...
  END LOOP;
END;

коммитов не многовато будет?
...
Рейтинг: 0 / 0
Можно ли отследить статус выполнения процедуры?
    #39400611
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Транзакции фиксируются в тех местах, где скрипт завершил обработку логического блока данных.
Суммарный объем данных, которые изменяет скрипт, довольно большой (порядка 20 тысяч строк), поэтому я решил, что это слишком много, чтобы применять или отменять изменения в одной транзакции.
Я не прав?
...
Рейтинг: 0 / 0
Можно ли отследить статус выполнения процедуры?
    #39400761
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
20 тыс строк - обычно это немного
в вашем случае и автономка не нужна, и так коммитов натыкано

хотя я бы все коммиты повыбрасывал, кроме последнего (если это джоб)
а если не джоб, то все

это обычный метод, если нет разных фишек
...
Рейтинг: 0 / 0
Можно ли отследить статус выполнения процедуры?
    #39401379
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мой скрипт заканчивается следующими строками:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
...
      END LOOP;

      log('  - ИТОГО; время '||to_char((dbms_utility.get_time-vTimerTotal)/100, fmtTimer)||'с');

    END;

  END;

END;
/



Когда я запускаю скрипт, неважно откуда (через sqlplus или TOAD), он зависает — в sqlplus курсор мигает, в TOAD выводится диалоговое окно "Выполняется" и идет время выполнения, и такое сохраняется несколько часов.
Но если в это время глянуть в таблицу логов, то в ней последней записью указано " - ИТОГО", время выполнения скрипта обычно в пределах 1-2 часов. И все данные, которые обрабатывал скрипт, обработаны. То есть цикл успешно обработал, выполнился следующий оператор, скрипт вроде бы завершился, но клиент этого не показывает.

А можно ли посмотреть, чем занята сессия, если после выполнения последней команды выполнение скрипта считается незавершенным?
...
Рейтинг: 0 / 0
Можно ли отследить статус выполнения процедуры?
    #39401380
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

не знаю, правильно ли, но проще всего глянуть в v$session, v$open_cursor
...
Рейтинг: 0 / 0
Можно ли отследить статус выполнения процедуры?
    #39401381
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.время выполнения скрипта обычно в пределах 1-2 часовЗа это время сетевое оборудование между клиентом и сервером посчитало соединение "протухшим" и перестало его обслуживать.
...
Рейтинг: 0 / 0
Можно ли отследить статус выполнения процедуры?
    #39401392
efendi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alibek B.,

DBMS_PIPE или DBMS_ALERT
...
Рейтинг: 0 / 0
Можно ли отследить статус выполнения процедуры?
    #39401430
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicЗа это время сетевое оборудование между клиентом и сервером посчитало соединение "протухшим" и перестало его обслуживать.
Действительно, мог бы сам догадаться.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Можно ли отследить статус выполнения процедуры?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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