Criar procedure - Gerar TXT e enviar por FTP

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
rafaelchagas.sp
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Ter, 13 Out 2009 4:52 pm
Localização: Sorocaba - SP

Boa tarde,

preciso criar uma procedure que gere um txt com uma linha gerada por uma query e depois enviar o txt por ftp.

alguém me ajuda?
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Pois é, existem varias formas. O mais fácil é mesmo usar o bom e velho UTL_FILE pra gerar o arquivo texto. Depois pra enviar num ftp, eu gosto da opção de rodar um SHELL que faça o serviço...
rafaelchagas.sp
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Ter, 13 Out 2009 4:52 pm
Localização: Sorocaba - SP

pessoal, eu fiz o seguinte código, mas não está dando certo...
tem algo de errado?

Selecionar tudo

create or replace procedure enviar_arquivo(site varchar2, porta varchar2, arquivo varchar2) is
    v_conn  UTL_TCP.CONNECTION; 
    v_file_handle UTL_FILE.FILE_TYPE;
BEGIN
    BEGIN
		v_conn := UTL_TCP.OPEN_CONNECTION(site,porta); 
		v_file_handle := UTL_FILE.FOPEN(v_conn, arquivo,'W');
		for x in 
		(<meu select>
		)		
		loop
			UTL_FILE.PUT(v_file_handle,x.campo);		
		end loop;
    END;
		UTL_FILE.FCLOSE(v_file_handle);
		UTL_TCP.CLOSE_CONNECTION(v_conn);   
END; 
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

qual erro que está gerando?
rafaelchagas.sp
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Ter, 13 Out 2009 4:52 pm
Localização: Sorocaba - SP

Erro na linha 7: PL/SQL: Statement ignored
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

http://www.psoug.org/reference/utl_file.html

tenho quase certeza que você está passando algum parametro errado..
pode estar sem o plic ( ' ) talvez
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

Selecionar tudo

CREATE DIRECTORY oraload AS 'c:\oraload\';

GRANT READ,WRITE ON DIRECTORY oraload TO UWCLASS;

Selecionar tudo

CREATE OR REPLACE PROCEDURE rw_demo IS
 InFile   utl_file.file_type;
 OutFile  utl_file.file_type;
 vNewLine VARCHAR2(4000);
 i        PLS_INTEGER;
 j        PLS_INTEGER := 0;
 SeekFlag BOOLEAN := TRUE;
BEGIN
  -- open a file to read
  InFile := utl_file.fopen('ORALOAD', 'in.txt','r');
  -- open a file to write
  OutFile := utl_file.fopen('ORALOAD', 'out.txt', 'w');

  -- if the file to read was successfully opened
  IF utl_file.is_open(InFile) THEN
    -- loop through each line in the file
    LOOP
      BEGIN
        utl_file.get_line(InFile, vNewLine);

        i := utl_file.fgetpos(InFile);
        dbms_output.put_line(TO_CHAR(i));

        utl_file.put_line(OutFile, vNewLine, FALSE);
        utl_file.fflush(OutFile);

        IF SeekFlag = TRUE THEN
          utl_file.fseek(InFile, NULL, -30);
          SeekFlag := FALSE;
        END IF;
      EXCEPTION
        WHEN NO_DATA_FOUND THEN
          EXIT;
      END;
    END LOOP;
    COMMIT;
  END IF;
  utl_file.fclose(InFile);
  utl_file.fclose(OutFile);
EXCEPTION
  WHEN others THEN
    RAISE_APPLICATION_ERROR (-20099, 'Unknown UTL_FILE Error');
END rw_demo;
/
[/code]
rafaelchagas.sp
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Ter, 13 Out 2009 4:52 pm
Localização: Sorocaba - SP

Agora estou tentando salvar o txt em meu servidor mesmo, porém esse meu código abaixo me retorna o erro: ORA-29280: caminho de diretório inválido.

estou utilizando o SO red hat, a pasta existe e está com permissão 777.

Selecionar tudo

create or replace procedure enviar_arquivo_equifax(nomearquivo varchar2) is
     v_file_handle UTL_FILE.FILE_TYPE;
BEGIN
    BEGIN
		 
		v_file_handle := UTL_FILE.FOPEN('/oracle/pasta/',arquivo,'W');
		for x in 
		(<meu select>)		
		loop
			UTL_FILE.PUT(v_file_handle,x.campo);		
		end loop;
    END;
		UTL_FILE.FCLOSE(v_file_handle);  
END; 
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

navega ate o diretorio do arquivo e quando chegar da um pwd, dai você copia o path e cola na sua proc..

o erro e claro ne o diretoro ta errado
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

O parametro do banco UTL_FILE_DIR tem que ter sido setado.
http://glufke.net/oracle/viewtopic.php?t=1783

Sem isso, o oracle não permite você criar arquivos em qualquer lugar do servidor. (questão de segurança). Verifique isso!
rafaelchagas.sp
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Ter, 13 Out 2009 4:52 pm
Localização: Sorocaba - SP

Era isso mesmo..
setei o parametro e funcionou agora.. \o/

meu código ficou assim no fim:

Selecionar tudo

create or replace procedure enviar_arquivo_equifax(caminho varchar2,arquivo varchar2) is
     v_file_handle UTL_FILE.FILE_TYPE;
BEGIN
    BEGIN
		 
		v_file_handle := UTL_FILE.FOPEN(caminho,arquivo,'W');
		for x in 
		(<meu select>)		
		loop
			UTL_FILE.PUT_LINE(v_file_handle,x.campo,FALSE);	
			utl_file.fflush(v_file_handle);			
		end loop;
    END;
	UTL_FILE.FCLOSE(v_file_handle);  
END; 
Responder
  • Informação