Geração para TXT sem espaço

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
tiagoof
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Qui, 11 Abr 2013 3:52 pm

Olá Pessoal,
Desculpe se enviar questionamentos "bobos", mas sou novo nesta parte de BD e SQL.
Estou precisando gerar um arquivo TXT com base no seguinte select, sendo que cada campo deve ser separado por ";" e sem espaço.

set echo off
set verify off
set feedback off
ttitle off
set heading off
spool c:\crm\estrutura.txt

select EST.EST_IN_CODIGO,
EST.FIL_IN_CODIGO,
EST.EST_ST_NOME,
EST.EST_ST_NOME_REAL,
EST.CUS_IN_REDUZIDO,
EST.CUSE_IN_REDUZIDO,
EST.PRO_IN_REDUZIDO,
EST.EST_DT_INICIOOBRA,
EST.EST_DT_FIMOBRA,
EST.EST_RE_AREATERRENO,
EST.ARQ_IN_CODIGO,
EST.CONST_IN_CODIGO
from MGDBM.DBM_ESTRUTURA EST
where EST.EST_CH_TIPOESTRUTURA = 'E' ;

spool off
exit;

Consegui gerar o arquivo, mas fica com varios espaços e sem o ;
Tem um outro detalhe, se o arquivo já tenha sido gerado no diretório, a próxima geração deve substituir o arquivo antigo, e isso não ocorre.

Desde já agradeço a ajuda.

Abs.
everthon
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 14
Registrado em: Qua, 18 Jan 2012 2:43 pm
att,

Everthon Souza
Em Deus, posso todas as coisas!

Fala Tiago, beleza?

Tem como colocar seu código aqui?

Assim fica mais fácil ajudar!!

Abraço!
tiagoof
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Qui, 11 Abr 2013 3:52 pm

Fala Everton, tudo bem e você?

O código que estou usando no PL/SQL é este:

set echo off
set verify off
set feedback off
ttitle off
set heading off
spool c:\crm\estrutura.txt

select EST.EST_IN_CODIGO,
EST.FIL_IN_CODIGO,
EST.EST_ST_NOME,
EST.EST_ST_NOME_REAL,
EST.CUS_IN_REDUZIDO,
EST.CUSE_IN_REDUZIDO,
EST.PRO_IN_REDUZIDO,
EST.EST_DT_INICIOOBRA,
EST.EST_DT_FIMOBRA,
EST.EST_RE_AREATERRENO,
EST.ARQ_IN_CODIGO,
EST.CONST_IN_CODIGO
from MGDBM.DBM_ESTRUTURA EST
where EST.EST_CH_TIPOESTRUTURA = 'E' ;

spool off
exit;

Ele gera o arquivo na minha maquina no diretório c:\crm\estrutura.txt, porém com espaço e sem o delimitador ;

Abs
everthon
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 14
Registrado em: Qua, 18 Jan 2012 2:43 pm
att,

Everthon Souza
Em Deus, posso todas as coisas!

Dê uma olhada nesse exemplo bem simples.. Já tentou a package UTL_FILE ? É bem interessante.

Selecionar tudo

-------------------------------------------------------------------------------------
-- criando um arquivo 
-------------------------------------------------------------------------------------
set serveroutput on;
DECLARE 
  ARQ_SAIDA UTL_FILE.FILE_TYPE;
  linha_arq number := 1;
  CURSOR C_LINHA IS
      select EST.EST_IN_CODIGO,
EST.FIL_IN_CODIGO,
EST.EST_ST_NOME,
EST.EST_ST_NOME_REAL,
EST.CUS_IN_REDUZIDO,
EST.CUSE_IN_REDUZIDO,
EST.PRO_IN_REDUZIDO,
EST.EST_DT_INICIOOBRA,
EST.EST_DT_FIMOBRA,
EST.EST_RE_AREATERRENO,
EST.ARQ_IN_CODIGO,
EST.CONST_IN_CODIGO
from MGDBM.DBM_ESTRUTURA EST
where EST.EST_CH_TIPOESTRUTURA = 'E' ;
      
BEGIN                           --caminho     --nome arquivo         -- W (write)
    ARQ_SAIDA := UTL_FILE.FOPEN('DIR_TESTE','estrutura.txt'', 'W');
    FOR C_LINHA_2 IN C_LINHA LOOP
        UTL_FILE.PUT_LINE(ARQ_SAIDA, C_LINHA_2.SEQUENCE_NAME
                                    ||' ' 
                                    || C_LINHA_2.LAST_NUMBER
                                    ||' '
                                    ||LINHA_ARQ); 
      linha_arq := linha_arq+1;
    END LOOP;
    UTL_FILE.FCLOSE(ARQ_SAIDA);
    DBMS_OUTPUT.PUT_LINE('Arquivo gerado com sucesso');
    
    EXCEPTION
      WHEN UTL_FILE.INVALID_OPERATION THEN
               Dbms_Output.Put_Line('Opera�‹o inv‡lida no arquivo.');
               UTL_File.Fclose(arq_saida);
      WHEN UTL_FILE.WRITE_ERROR THEN
               Dbms_Output.Put_Line('Erro de grava�‹o no arquivo.');
               UTL_File.Fclose(arq_saida);
      WHEN UTL_FILE.INVALID_PATH THEN
               Dbms_Output.Put_Line('Diret—rio inv‡lido.');
               UTL_File.Fclose(arq_saida);
      WHEN UTL_FILE.INVALID_MODE THEN
               Dbms_Output.Put_Line('Modo de acesso inv‡lido.');
               UTL_File.Fclose(arq_saida);
      WHEN OTHERS THEN
               DBMS_OUTPUT.PUT_LINE('Problemas na gera�‹o do arquivo. Entre em contato com o administrador do sistema.');
               UTL_File.Fclose(arq_saida);
end;


-------------------------------------------------------------------------------------
-- lendo o arquivo criado
-------------------------------------------------------------------------------------


SET SERVEROUTPUT ON;
DECLARE
    myfile  UTL_File.File_Type;
    conteudo varchar2(32000);
    conteudo_aux varchar2(32000);
BEGIN
    myfile := UTL_File.Fopen('DIR_TESTE','estrutura.txt', 'R', 32000);
    Loop
        begin
            UTL_FILE.GET_LINE(MYFILE, CONTEUDO_AUX, 32000);
            exception
            when no_data_found then
      exit;
        END;
        conteudo := conteudo||conteudo_aux||chr(10);
    End Loop;
    DBMS_OUTPUT.PUT_LINE(conteudo);
    UTL_FILE.FCLOSE(MYFILE);

EXCEPTION
    WHEN NO_DATA_FOUND THEN
               Dbms_Output.Put_Line('Arquivo n‹o encontrado.');
               UTL_File.Fclose(myfile);
    WHEN UTL_FILE.INVALID_PATH THEN
               Dbms_Output.Put_Line('Diret—rio inv‡lido.');
               UTL_FILE.FCLOSE(MYFILE);
   
  
END;
-------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------
Você deve criar um diretório lógico no banco que fará o "apontamento" ao seu diretório físico:

Selecionar tudo

-- DIRETORIOS LOGICOS ORACLE

SELECT * FROM DBA_DIRECTORIES;
select * from all_directories;

-------------------------------------------------------------------------
--  Criando o diretorio logico no oracle
-------------------------------------------------------------------------

CREATE or replace DIRECTORY DIR_TESTE AS 'c:\crm';

-------------------------------------------------------------------------
--  liberando as permiss›es
-------------------------------------------------------------------------

GRANT READ, WRITE ON DIRECTORY DIR_TESTE TO SYS;
GRANT READ, WRITE ON DIRECTORY DIR_TESTE TO APPS;

-------------------------------------------------------------------------
--  Verificando as permiss›es
-------------------------------------------------------------------------

SELECT GRANTOR
     , GRANTEE
     , TABLE_SCHEMA
     , TABLE_NAME, 
     privilege
FROM ALL_TAB_PRIVS
WHERE TABLE_NAME = 'DIR_TESTE';
tiagoof
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Qui, 11 Abr 2013 3:52 pm

Everton,
Parece bacana esta solução, mas tentei executar no PL/SQl e me retorna a mensagem ORA-00922: opção não encontrada ou invalida, sendo que a unica alteração que realizei no código que me passou foi no caminho e no nome do arquivo, segue o código. Você sabe o que pode ser? Realizei o teste salvando como um arquivo SQL e executando mas sem sucesso também.

Selecionar tudo

set serveroutput on;
DECLARE 
  ARQ_SAIDA UTL_FILE.FILE_TYPE;
  linha_arq number := 1;
  CURSOR C_LINHA IS
select EST.EST_IN_CODIGO,
EST.FIL_IN_CODIGO,
EST.EST_ST_NOME,
EST.EST_ST_NOME_REAL,
EST.CUS_IN_REDUZIDO,
EST.CUSE_IN_REDUZIDO,
EST.PRO_IN_REDUZIDO,
EST.EST_DT_INICIOOBRA,
EST.EST_DT_FIMOBRA,
EST.EST_RE_AREATERRENO,
EST.ARQ_IN_CODIGO,
EST.CONST_IN_CODIGO
from MGDBM.DBM_ESTRUTURA EST
where EST.EST_CH_TIPOESTRUTURA = 'E' ;
      
BEGIN                           --caminho     --nome arquivo         -- W (write)
    ARQ_SAIDA := UTL_FILE.FOPEN('c:\crm','estrutura2.txt'', 'W');
    FOR C_LINHA_2 IN C_LINHA LOOP
        UTL_FILE.PUT_LINE(ARQ_SAIDA, C_LINHA_2.SEQUENCE_NAME
                                    ||' ' 
                                    || C_LINHA_2.LAST_NUMBER
                                    ||' '
                                    ||LINHA_ARQ); 
      linha_arq := linha_arq+1;
    END LOOP;
    UTL_FILE.FCLOSE(ARQ_SAIDA);
    DBMS_OUTPUT.PUT_LINE('Arquivo gerado com sucesso');
    
    EXCEPTION
      WHEN UTL_FILE.INVALID_OPERATION THEN
               Dbms_Output.Put_Line('Operacao invalida no arquivo.');
               UTL_File.Fclose(arq_saida);
      WHEN UTL_FILE.WRITE_ERROR THEN
               Dbms_Output.Put_Line('Erro de gravacao no arquivo.');
               UTL_File.Fclose(arq_saida);
      WHEN UTL_FILE.INVALID_PATH THEN
               Dbms_Output.Put_Line('Diretorio inv‡lido.');
               UTL_File.Fclose(arq_saida);
      WHEN UTL_FILE.INVALID_MODE THEN
               Dbms_Output.Put_Line('Modo de acesso invalido.');
               UTL_File.Fclose(arq_saida);
      WHEN OTHERS THEN
               DBMS_OUTPUT.PUT_LINE('Problemas na gera?‹o do arquivo. Entre em contato com o administrador do sistema.');
               UTL_File.Fclose(arq_saida);
end;
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 20 visitantes