Как вычитать пайп другой сессии ?
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Alkov Профи
Вступление в Клуб: 23.09.2010
|
Пн Авг 18, 2014 09:48  Как вычитать пайп другой сессии ? |
|
Полезность: Нет оценки
|
Здравствуйте!
Собственно известен SID сессии как вычитать пайп к этой
сессии, сначала найти потом вычитать...
Вычитать наверное через dbms_pipe.receive_message( ) ? |
|
 |
Damir Участник - экстремал
Вступление в Клуб: 29.03.2013
|
Вт Авг 19, 2014 08:37  Re: Как вычитать пайп другой сессии ? |
|
Полезность: Нет оценки
|
Alkov пишет: | Здравствуйте!
Собственно известен SID сессии как вычитать пайп к этой
сессии, сначала найти потом вычитать... |
если речь об отладочной райпе - то она так и называется:
replace( 'debug$<<session_id>>', '<<session_id>>', session_id)
Alkov пишет: | Вычитать наверное через dbms_pipe.receive_message( ) ? |
Если речь про ЦФТ, то есть пакет stdio - там и смотри функции работы с пайпой. |
|
 |
Alkov Профи
Вступление в Клуб: 23.09.2010
|
Вт Авг 19, 2014 09:54  Re: Как вычитать пайп другой сессии ? |
|
Полезность: Нет оценки
|
Damir пишет: | Alkov пишет: | Здравствуйте!
Собственно известен SID сессии как вычитать пайп к этой
сессии, сначала найти потом вычитать... |
если речь об отладочной райпе - то она так и называется:
replace( 'debug$<<session_id>>', '<<session_id>>', session_id)
|
Хм. у меня совпадает не session_id. а с CLIENT_INFO
пока пробую так
v varchar2(32767);
for (SELECT s(S.[CLIENT_INFO] :cl)
in V$SESSION%rowtype
where S.[SID] in нужные сессии
)
loop
v:=stdio.get_pipe_text('DEBUG$'||s.[CL],1);
end loop; |
|
 |
Damir Участник - экстремал
Вступление в Клуб: 29.03.2013
|
Вт Авг 19, 2014 12:03  Re: Как вычитать пайп другой сессии ? |
|
Полезность: 1
|
Alkov пишет: |
Хм. у меня совпадает не session_id. а с CLIENT_INFO
|
В CLIENT_INFO цфт прописывает комбинцию из полей системной вьюшки gv$session - INST_ID, SID, SERIAL#
т.е. то, что возвращает
Код: | dbms_session.unique_session_id() |
|
|
 |
Damir Участник - экстремал
Вступление в Клуб: 29.03.2013
|
Вт Авг 19, 2014 12:16  Re: Как вычитать пайп другой сессии ? |
|
Полезность: Нет оценки
|
Alkov пишет: | v:=stdio.get_pipe_text('DEBUG$'||s.[CL],1); |
В мониторе ORAMON можно имя пайпы указать - тогда и код писать не надо.
Пайпу вычитать можно только 1 раз. Т.е. если ты её вычитал, то пользователь НЕ получит сообщения в мониторе (вдруг, сидит и ждет) |
|
 |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Ср Авг 20, 2014 09:09  Re: Как вычитать пайп другой сессии ? |
|
Полезность: Нет оценки
|
Alkov пишет: | Здравствуйте!
Собственно известен SID сессии как вычитать пайп к этой
сессии, сначала найти потом вычитать...
Вычитать наверное через dbms_pipe.receive_message( ) ? |
Код: |
declare
pragma macro(except, '[1] exception;
[1]_EXCEPTION constant number := [2];
pragma exception_init([1], [2])', substitute);
pragma macro(raise_, 'message.raise_([1]_EXCEPTION,[2])', substitute);
&except(UNKNOWN_MODE, -20123);
&except(TIMED_OUT, -20124);
&except(TOO_LARGE_VALUE, -01401);
function read_pipe(p_name varchar2, p_timeout integer := 2) return varchar2 is
v varchar2(32767);
n number;
begin
n := dbms_pipe.receive_message(p_name,p_timeout);
if n = 0 then
dbms_pipe.unpack_message(v);
return v;
elsif n = 1 then
&raise_(TIMED_OUT, 'Время ожидания вышло');
elsif n = 3 then
return null; -- Прервано пользователем
elsif n = 2 then
&raise_(TOO_LARGE_VALUE,'32 кб под буфер недостаточно при чтении данных из пайпы'); -- Record in pipe too big for buffer (should not happen). Надо бросить исключение
else
&raise_(UNKNOWN_MODE, 'При чтении из канала сообщений возник неизвестный код ошибки: '||n);
end if;
return null;
end;
procedure Pipe2File(p_info varchar2) is
v$pipe varchar2(32767);
v$file varchar2(32767);
v$str varchar2(32767);
v$count number;
begin
v$pipe := upper('debug$'||p_info);
v$count := 0;
loop
utils.sleep(1);
loop
begin
v$str := read_pipe(v$pipe,1);
AppendFile(v$file,v$str);
v$count := 0;
exception when TIMED_OUT then
v$count := v$count + 1;
exit;
end;
end loop;
-- Предусмотреть выход в случае если пользователь поднял монитор канала
-- Предусмотреть выход в случае если сессия закончила работу
end loop;
end;
begin
-- Получаем список всех сессий, для которых НЕ запущен монитор, и которые висят в ожидании вывода в пайпу
for ( select w(s.[client_info] :info
) in v$session_wait%rowtype, (v$session%rowtype :s)
where lower(w.[event]) like '%pipe%put%'
and s.[SID] = w.[sid]
and w.[SECONDS_IN_WAIT] > 5
and not exists( select v(1) in v$session%rowtype
where lower(v.[PROGRAM]) = 'oramon.exe'
and v.[ACTION] like '%'||s.[CLIENT_INFO] )
) loop
-- тут для примера запускается последовательно, на самом деле вычитка осуществляется в job. И это значит, что в запросе нужен ещё not exists из user_jobs
Pipe2File(w.[info]);
end loop;
end;
|
Текст процедуры AppendFile я опустил |
|
 |
Damir Участник - экстремал
Вступление в Клуб: 29.03.2013
|
Пт Сен 04, 2015 08:38  Re: Как вычитать пайп другой сессии ? |
|
Полезность: Нет оценки
|
Damir пишет: | Alkov пишет: |
Хм. у меня совпадает не session_id. а с CLIENT_INFO
|
В CLIENT_INFO цфт прописывает комбинцию из полей системной вьюшки gv$session - INST_ID, SID, SERIAL#
т.е. то, что возвращает
Код: | dbms_session.unique_session_id() |
|
Больше для себя оставлю тут (найдено на sql.ru):
Код: |
select
sid, to_number(substr(dbms_session.unique_session_id, 1, 4), 'xxxx') as sid_,
serial#, to_number(substr(dbms_session.unique_session_id, 5, 4), 'xxxx') as serial#_,
inst_id, to_number(substr(dbms_session.unique_session_id, 9, 4), 'xxxx') as inst_id_
, dbms_session.unique_session_id
, upper(
lpad(to_char(sid, 'FMxxxx'), 4, '0')
||lpad(to_char(serial#, 'FMxxxx'), 4, '0')
||lpad(to_char(inst_id, 'FMxxxx'), 4, '0')
) unique_session_id_
from gv$session
where sid = (select sid from v$mystat where rownum = 1)
; |
|
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|