CftClub.ru
Клуб специалистов ЦФТ-Банк

Как в текстовом задании вычитать пайп в файл?

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
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 или что-то подобное Smile
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, там много всего интересного. Smile
Матвеев Евгений
Профи


Вступление в Клуб: 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 или что-то подобное Smile



Перед тем как сделать
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;
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru