Как в текстовом задании вычитать пайп в файл?
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Alkov Профи
Вступление в Клуб: 23.09.2010
|
Пн Авг 26, 2013 09:45  Как в текстовом задании вычитать пайп в файл? |
|
Полезность: Нет оценки
|
Здравствуйте все!
собственно сабж.
Пытался так , но видимо чего-то не понял..
p_file [FILE$LOAD];
p_err [FILE$LOAD];
log_text varchar2;
begin
set_debug_pipe('TEST' );
set_debug(0, DEBUG2FILE);
set_debug_file('IMPORT_'||to_char(sysdate,'yyyymmdd')||'.log');
P_FILE.[DST_PATH] := '.';
P_FILE.[DST_NAME] := 'OKATO.TXT';
P_ERR.[SRC_PATH] := P_FILE.[DST_PATH];
P_ERR.[SRC_NAME] := 'OKATO_err.txt';
::[TERRITORY].[IMPORT_NEW].V_UPDATE_UPPER:='1';
::[TERRITORY].[IMPORT_NEW](p_file, p_err);
end;
p.s. в операции вызывается debug_pipe('Начало импорта', 0); |
|
 |
prog Эксперт
Вступление в Клуб: 03.03.2008
|
Вт Авг 27, 2013 06:30   |
|
Полезность: Нет оценки
|
[FILE$LOAD] будет работать только на экранной форме. В текстовых заданиях использовать не получится. |
|
 |
Alkov Профи
Вступление в Клуб: 23.09.2010
|
Вт Авг 27, 2013 09:34   |
|
Полезность: Нет оценки
|
prog пишет: | [FILE$LOAD] будет работать только на экранной форме. В текстовых заданиях использовать не получится. |
Да не он нужен только чтоб пути передать,
а перемещать файл не требуется.
Операция отрабатывает нормально, вот только забивает пайп.
Хочется его вычитать и сохранить в файл.... |
|
 |
maestro Профи
Вступление в Клуб: 12.10.2010
|
Вт Авг 27, 2013 13:54   |
|
Полезность: 2
|
Код: |
-- Процедура для вычитки пайп и буферов
function Read_Debug_Text(p_pipe_name varchar2 default null) return clob is
sTmp varchar2(32000);
debug_clob clob;
begin
dbms_lob.CREATETEMPORARY(debug_clob, true);
if p_pipe_name is not null then
set_debug_pipe(p_pipe_name);
end if;
loop
sTmp := get_debug_text(rtl.DEBUG2PIPE);
if trim(sTmp) is null then
exit;
end if;
dbms_lob.writeappend(debug_clob, length(sTmp), sTmp);
end loop;
return debug_clob;
end;
|
Дальше юзай какой-нть clob2file или что-то подобное  |
|
 |
Alkov Профи
Вступление в Клуб: 23.09.2010
|
Ср Авг 28, 2013 04:09   |
|
Полезность: Нет оценки
|
Аха , спасибо,
правда выводит пайп только с уровнем 0
+ хотелось бы именно перенаправить пайп в файл ,
а не вычитывать его когда он забит. А то в мониторе идут пики
забивается pipe_put потом падает до 0.
p_file [FILE$LOAD];
p_err [FILE$LOAD];
log_text varchar2(32000);
v_file pls_integer;
begin
v_file := stdio.open('.','IMPORT_'||to_char(sysdate,'yyyymmdd')||'.log', 'a', false, 512, 3);
P_FILE.[DST_PATH] := '.';
P_FILE.[DST_NAME] := 'OKATO.TXT';
P_ERR.[SRC_PATH] := P_FILE.[DST_PATH]; --там же на сервере пусть лежит
P_ERR.[SRC_NAME] := 'OKATO_err.txt';
::[TERRITORY].[IMPORT_NEW].V_UPDATE_UPPER:='1';
::[TERRITORY].[IMPORT_NEW](p_file, p_err);
loop
log_text := RTL.get_debug_text(rtl.DEBUG2PIPE);
if trim(log_text) is null then
exit;
else
-- пишем вычитанный пайп в файл
stdio.put_line(v_file, log_text, null, stdio.UNXTEXT, stdio.WINTEXT);
end if;
end loop;
stdio.fclose(v_file);
end; |
|
 |
maestro Профи
Вступление в Клуб: 12.10.2010
|
Ср Авг 28, 2013 07:28   |
|
Полезность: Нет оценки
|
Alkov пишет: |
+ хотелось бы именно перенаправить пайп в файл ,
а не вычитывать его когда он забит. А то в мониторе идут пики
забивается pipe_put потом падает до 0.
|
PIPE - это механизм Oracle для обмена информацией между сессиями. Запись в файл этот механизм не поддерживает.
Но такую задачу можно решить:
1. если запустить ||-й джобик, который будет вычитывать именованный pipe-канал и записывать его в файл.
2. Либо в основной операции использовать не debug_pipe, а debug_file. (В начале надо проинициализировать имя выходного файла операцией set_debug_file).
P.S.: Посмотри код пакета RTL, там много всего интересного.  |
|
 |
Матвеев Евгений Профи
Вступление в Клуб: 31.01.2012
|
Ср Авг 12, 2015 09:09   |
|
Полезность: Нет оценки
|
maestro пишет: | Код: |
-- Процедура для вычитки пайп и буферов
function Read_Debug_Text(p_pipe_name varchar2 default null) return clob is
sTmp varchar2(32000);
debug_clob clob;
begin
dbms_lob.CREATETEMPORARY(debug_clob, true);
if p_pipe_name is not null then
set_debug_pipe(p_pipe_name);
end if;
loop
sTmp := get_debug_text(rtl.DEBUG2PIPE);
if trim(sTmp) is null then
exit;
end if;
dbms_lob.writeappend(debug_clob, length(sTmp), sTmp);
end loop;
return debug_clob;
end;
|
Дальше юзай какой-нть clob2file или что-то подобное  |
Перед тем как сделать
set_debug_pipe(p_pipe_name);
нужно запомнить старое название, дабы результаты сохранить, и потом обратно переподключить на прежнее имя канала...
Как получить старое наименование? |
|
 |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Ср Авг 12, 2015 09:37   |
|
Полезность: 1
|
Матвеев Евгений пишет: | Как получить старое наименование? |
Код: | declare
r rtl.debug_rec;
begin
rtl.get_debug_all(p_info => r);
dbms_output.put_line(r.debug_pipe_name);
end; |
|
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|