Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Передать данные о ходе выполнения в цикле в консоль  [new]
Song
Member

Откуда: Кострома
Сообщений: 117
Приветствую, уважаемый all!

Есть проблема. Выполняется хранимая процедура, там длительный курсор, хотелось бы видеть прогресс её выполнения (например, столько-то % выполнено).
Вывод этой информации в dbms_output ничего не даёт. Данные выдаются в консоль процедуры только после её завершения, зато сразу все :-)

Поискал по форуму, почитал топики, люди говорят, что нужно использовать dbms_pipe. Но не понятно как с помощью dbms_pipe передать данные именно в консоль именно этой текуще выполняемой процедуры. Пусть оно будет идти с задержкой, но все же информация передаваться будет.

Т.е. я например делаю call proc(), и в соседеней вкладочке output в PL/SQL Dev вижу передачу данных через pipe. Прошу помочь советом, ссылками, кодом, если можно.

Спасибо.
23 май 06, 15:33    [2696827]     Ответить | Цитировать Сообщить модератору
 Re: Передать данные о ходе выполнения в цикле в консоль  [new]
Song
Member

Откуда: Кострома
Сообщений: 117
Или как вариант, если запустить job, то как из job'а передать данные в консоль процедуры.


-----
Прежде чем сказать "Невозможно", подумай, прав ли ты?!
23 май 06, 15:35    [2696843]     Ответить | Цитировать Сообщить модератору
 Re: Передать данные о ходе выполнения в цикле в консоль  [new]
Andrew IF
Member

Откуда: Москва
Сообщений: 741
Поищите по форуму по словам "прогресс выполнения" и DBMS_APPLICATION_INFO
23 май 06, 15:39    [2696871]     Ответить | Цитировать Сообщить модератору
 Re: Передать данные о ходе выполнения в цикле в консоль  [new]
Song
Member

Откуда: Кострома
Сообщений: 117
Спасибо посмотрел и попробовал.

Но через DBMS_APPLICATION_INFO я смог записать в представление v$session_longops. Да оно записалось и я могу считывать текущий результат.
Но как заставить этот текущий результат отображаться в консоли выполняемой процы?
23 май 06, 16:14    [2697154]     Ответить | Цитировать Сообщить модератору
 Re: Передать данные о ходе выполнения в цикле в консоль  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
Song
Но как заставить этот текущий результат отображаться в консоли выполняемой процы?


Периодически опрашивай значение APPLICATION_INFO и выводи на консоль.
23 май 06, 16:16    [2697164]     Ответить | Цитировать Сообщить модератору
 Re: Передать данные о ходе выполнения в цикле в консоль  [new]
Andrew IF
Member

Откуда: Москва
Сообщений: 741
Что вы понимаете под консолью выполняемой процедуры? Особенно применительно к job'у.
23 май 06, 16:20    [2697183]     Ответить | Цитировать Сообщить модератору
 Re: Передать данные о ходе выполнения в цикле в консоль  [new]
Song
Member

Откуда: Кострома
Сообщений: 117
Периодически опрашивай значение APPLICATION_INFO и выводи на консоль.

А как? Это ведь уже будет другая процедура!

Что вы понимаете под консолью выполняемой процедуры? Особенно применительно к job'у.

Применительно к job'у ничего.
Я просто предложил как вариант.

А применительно к процедуре - я же написал. Например в PL/SQL Dev - это вкладка Output окна SQL Window.

-----
Прежде чем сказать "Невозможно", подумай, прав ли ты?!
23 май 06, 16:40    [2697288]     Ответить | Цитировать Сообщить модератору
 Re: Передать данные о ходе выполнения в цикле в консоль  [new]
он же
Member

Откуда:
Сообщений: 715
dbms_application_info.set_module

select * from v$session where sid = ...
23 май 06, 16:45    [2697320]     Ответить | Цитировать Сообщить модератору
 Re: Передать данные о ходе выполнения в цикле в консоль  [new]
Andrew IF
Member

Откуда: Москва
Сообщений: 741
Изначальная постановка была:
Song
Выполняется хранимая процедура, там длительный курсор, хотелось бы видеть прогресс её выполнения

Вас сильно напрягает необходимость вручную в другом окне и/или тулзе выполнить секундный запрос из v$session_longops?
23 май 06, 16:52    [2697352]     Ответить | Цитировать Сообщить модератору
 Re: Передать данные о ходе выполнения в цикле в консоль  [new]
Song
Member

Откуда: Кострома
Сообщений: 117
Меня нет, но заказчика, который также захочет видеть, что программа работает и не зависла, думаю будет напрягать.
И ему вовсе не прикольно сидеть и жать F8 время от времени.

Я думал, есть такой вариант, чтобы данные сами обновлялись как по таймеру.
Ну ок, а если я запущу из этой процедуры перед курсором job и буду в нём считывать данные из v$session_longops, то есть возможность показать где-то в текстовом виде полученные в job'е данные? "Где-то" я имею средствами SQL Plus или в PL SQL Dev.


-----
Прежде чем сказать "Невозможно", подумай, прав ли ты?!
23 май 06, 17:08    [2697446]     Ответить | Цитировать Сообщить модератору
 Re: Передать данные о ходе выполнения в цикле в консоль  [new]
iV@n
Member

Откуда:
Сообщений: 382
заказчик будет работать с sql*plus или plsql developer?
23 май 06, 17:14    [2697491]     Ответить | Цитировать Сообщить модератору
 Re: Передать данные о ходе выполнения в цикле в консоль  [new]
Song
Member

Откуда: Кострома
Сообщений: 117
Операция одноразовая, но долгая.

-----
Прежде чем сказать "Невозможно", подумай, прав ли ты?!
23 май 06, 17:19    [2697512]     Ответить | Цитировать Сообщить модератору
 Re: Передать данные о ходе выполнения в цикле в консоль  [new]
Andrew IF
Member

Откуда: Москва
Сообщений: 741
Как-то это странно звучит. Если я запускаю долгоиграющую процедуру, то дальше занимаюсь другими делами, изредка поглядывая что там происходит. Зачем нужен постоянный мониторинг?
ИМХО, тут требуется уточнение постановки задачи, а не поиск технического решения.
23 май 06, 17:23    [2697546]     Ответить | Цитировать Сообщить модератору
 Re: Передать данные о ходе выполнения в цикле в консоль  [new]
_kyky
Member

Откуда: Москва
Сообщений: 184
... можно сгенерить событие которое можно поймать в PLSQL.Dev/Tools/EventMonitor

procedure SendSignal(p_Name in varchar2, p_Sender in varchar2, p_Kind in number, p_Text in varchar2, p_Step in varchar2, p_Obj in number := null)
is
l_Signal varchar2(4000);
l_Header varchar2(100) := '<?xml version="1.0" encoding="WINDOWS-1251"?>';
i integer;
pragma autonomous_transaction;
begin
select xmlelement("EVENT", chr(10),
' ',xmlelement("SENDER", p_Sender), chr(10),
' ',xmlelement("MOMENT", to_char(systimestamp, 'YYYYMMDD HH24:MI:SSXFF2')), chr(10),
' ',xmlelement("KIND", to_char(nvl(p_Kind,1))), chr(10),
' ',xmlelement("TEXT", p_Text), chr(10),
' ',xmlelement("STEP", p_Step), chr(10),
' ',xmlelement("OBJ", to_char(p_Obj)), chr(10)
).getStringVal()
into l_Signal
from dual;
l_Signal := l_Header || chr(10) || l_Signal;

begin
dbms_alert.signal( p_Name, l_Signal);
exception
when others then
if SQLCODE = -20000 then
null;
end if;
end;

commit;
end;
23 май 06, 17:24    [2697552]     Ответить | Цитировать Сообщить модератору
 Re: Передать данные о ходе выполнения в цикле в консоль  [new]
_kyky
Member

Откуда: Москва
Сообщений: 184
Можно еще послать нотификацию так

create or replace and compile java source named send as
import java.io.*;
public class NetSend
{
public static void Send(String Name, String Text)
{
try
{
Runtime rt = Runtime.getRuntime();
String[] go = new String[]{"C:\\WINDOWS\\system32\\net.exe","send",Name,Text};
Process proc = rt.exec(go);
InputStream stderr = proc.getErrorStream();
InputStreamReader isr = new InputStreamReader(stderr);
BufferedReader br = new BufferedReader(isr);
String line = null;
int exitVal = proc.waitFor();
System.out.println("Net exec: " + exitVal);
} catch (Throwable t)
{
t.printStackTrace();
}
}
}

Enjoy!
24 май 06, 10:32    [2699247]     Ответить | Цитировать Сообщить модератору
 Re: Передать данные о ходе выполнения в цикле в консоль  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
_kyky
Можно еще послать нотификацию так

...


И что дальше?... На консоль то эти данные как попадут?

К сожалению в сцерариях SQL*Plus нет возможности создать бесконечный цикл, в котором можно было бы периодически опрашивать состояние job'а (просто другой сессии, запущенной в другой программе) в котором выполняется запрос.
Тем не менее никто не мешает создать просто длинный сценарий или SQL запрос из очень большой таблицы с мнокократным вызовом функции мониторинга и выводом результата на экран.

Я как правило в таких случаях в конце сценария пишу запрос, который сохраняется в рабочей области SQL*Plus, и руками время от времени нажимаю

/[Enter]

Но раз уж пользователю нужен комфорт, то следует создать GUI утилиту для запуска и мониторинга долгих заданий.
24 май 06, 11:12    [2699494]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить