Как в текстовом задании вычитать пайп в файл? 
	   
	     | 
   
 
	
		| Предыдущая тема :: Следующая тема   | 
	 
	
	
		| Автор | 
		Сообщение | 
	 
	
		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; | 	 
  | 
			 
		  | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
	 
	    
	   | 
	
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
  | 
   
 
		 |