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

Как вариант, можно сообщения выводить с таблицу, но тут я не знаю, как зафиксировать в этой таблице запись и при этом не закрывать транзакцию.
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
06.02.2017, 09:30
    #39399035
arlx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли отследить статус выполнения процедуры?
автономная транзакция
...
Рейтинг: 0 / 0
06.02.2017, 09:33
    #39399037
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли отследить статус выполнения процедуры?
Alibek B.У меня есть долгоиграющий скрипт PL/SQL, который в процессе работы выводит информацию черезRTFM DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS
Alibek B.я не знаю, как зафиксировать в этой таблице запись и при этом не закрывать транзакцию.RTFM pragma autonomous_transaction
...
Рейтинг: 0 / 0
06.02.2017, 09:44
    #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
06.02.2017, 10:07
    #39399053
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли отследить статус выполнения процедуры?
Alibek B.А просто вывести текст на клиенте нельзя?В готовый Гуй - нельзя. Тут нужно программировать межсессионное взаимодействие любым из множества способов.
...
Рейтинг: 0 / 0
06.02.2017, 11:13
    #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
07.02.2017, 18:05
    #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
07.02.2017, 18:20
    #39400369
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли отследить статус выполнения процедуры?
Alibek B.это какой-то сбой?В знаниях.
Alibek B.cmd.exe или sqlplus.execmd.exe или sqlplus.exe не являются процессами СУБД.
...
Рейтинг: 0 / 0
07.02.2017, 18:23
    #39400371
ln123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли отследить статус выполнения процедуры?
Это нормально, клиент послал код, а сервер его выполняет, а о том что клиента уже нет сервер конечно узнает но не так сразу :)
...
Рейтинг: 0 / 0
07.02.2017, 19:11
    #39400400
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли отследить статус выполнения процедуры?
Другими словами, весь скрипт PL/SQL (или во всяком случае его часть до символа /) отправляется на сервер и далее наличие клиента в живых для работы скрипта не требуется, так?
Да, в Oracle некоторые подходы необычны, запомню этот момент. Тут, по идее, может быть спорный момент в том, что если в скрипте есть commit, то изменения будут применены даже если клиентское приложение завершилось аварийно и пользователь ждет, что изменения не применены.
...
Рейтинг: 0 / 0
07.02.2017, 19:22
    #39400405
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли отследить статус выполнения процедуры?
Alibek B.Другими словами, весь скрипт PL/SQL (или во всяком случае его часть до символа /) отправляется на сервер и далее наличие клиента в живых для работы скрипта не требуется, так?
Да, в Oracle некоторые подходы необычны, запомню этот момент. Тут, по идее, может быть спорный момент в том, что если в скрипте есть commit, то изменения будут применены даже если клиентское приложение завершилось аварийно и пользователь ждет, что изменения не применены.

Не надо придумывать, нужно прочитать про архитектуру клиент-сервер + работа сети
...
Рейтинг: 0 / 0
07.02.2017, 19:27
    #39400407
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли отследить статус выполнения процедуры?
Alibek B.Да, в Oracle некоторые подходы необычныдумаешь, где-то иначе?
...
Рейтинг: 0 / 0
08.02.2017, 08:55
    #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
08.02.2017, 09:27
    #39400611
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли отследить статус выполнения процедуры?
Транзакции фиксируются в тех местах, где скрипт завершил обработку логического блока данных.
Суммарный объем данных, которые изменяет скрипт, довольно большой (порядка 20 тысяч строк), поэтому я решил, что это слишком много, чтобы применять или отменять изменения в одной транзакции.
Я не прав?
...
Рейтинг: 0 / 0
08.02.2017, 12:28
    #39400761
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли отследить статус выполнения процедуры?
20 тыс строк - обычно это немного
в вашем случае и автономка не нужна, и так коммитов натыкано

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

это обычный метод, если нет разных фишек
...
Рейтинг: 0 / 0
09.02.2017, 09:01
    #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
09.02.2017, 09:05
    #39401380
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли отследить статус выполнения процедуры?
Alibek B.,

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

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


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