- Este tópico contém 18 respostas, 5 vozes e foi atualizado pela última vez 17 anos, 3 meses atrás por
Leonardo Litz.
-
AutorPosts
-
17 de dezembro de 2008 às 3:52 pm #84308
joaocsc
ParticipantePessoal,
Preciso de uma forma de exportar dados a partir de uma query no Oracle para um arquivo texto.
A minha query terá um retorno um campo (exemplo: |45|abcd|54s|…|) e pode conter mais de 500.000 registros.
1. Não conheço muito o comando SPOOL, porém acredito que ele não seja o recomendável nesse caso. Caso exista uma boa maneira de usar o SPOOL nesse caso, favor me explicarem.
2. Pelo que conheço o comando EXP faz apenas o dump e não tem como usar.
3. O Loader pelo que sei apenas carrega dados e não faz extração de dados.Alguma opção?
Obrigado.
João Carlos.
joaocsc@gmail.com17 de dezembro de 2008 às 4:00 pm #84309Leonardo Litz
ParticipanteOla Joao, vc utiliza o pl/sql developer?
Voce pode utilizar o utl_file do proprio oracle tb.
17 de dezembro de 2008 às 4:08 pm #84310joaocsc
ParticipanteLitz,
Você pode colocar um exeplo de utilização do utl_file?
Obrigado.17 de dezembro de 2008 às 4:15 pm #84311abonacin
Participante17 de dezembro de 2008 às 4:21 pm #84313Leonardo Litz
ParticipanteSegue exemplo abaixo,
declare
v_diretorio varchar2(200) := ‘\IP_SERVIDORDIRETORIO’;—DIRETORIO ONDE O ARQUIVO SERÁ GRAVADO
r_FileHandle Utl_File.File_Type;
CURSOR c_Notas_Saidas IS
SELECT *
FROM NOTAS_FISCAIS NF;—QUERYBEGIN
r_FileHandle := Utl_File.fOpen(v_diretorio, ‘NOMEDOARQUIVO.TXT’, ‘w’,32767);–ABRE O ARQUIVOFOR NS IN C_NOTAS_SAIDAS LOOP
Utl_File.Put_Line(r_FileHandle, NS.NUMERO_NOTA||NS.DATA_EMISSAO||NS.VALOR_NOTA);---GRAVA A LINHAEND LOOP;
Utl_File.fFlush(r_FileHandle);–FORCA A GRAVAÇÃO DO BUFFER
Utl_File.fClose(r_FileHandle);—FECHA O ARQUIVO
END;17 de dezembro de 2008 às 5:43 pm #84317joaocsc
ParticipanteNão rolou… tá dizendo que o Utl_File deve ser declarado…
ORA-06550: linha 5, coluna 14:
PLS-00201: o identificador ‘UTL_FILE’ deve ser declarado17 de dezembro de 2008 às 7:19 pm #84320Leonardo Litz
ParticipantePosta ai o script que vc esta tentando executar para mim ver…
17 de dezembro de 2008 às 8:02 pm #84322joaocsc
ParticipanteO script é:
/************************************/
declarev_diretorio varchar2(200) := ‘\10.32.1.57C:TEMP’;—DIRETORIO ONDE O ARQUIVO SERÁ GRAVADO
r_FileHandle Utl_File.File_Type;
CURSOR c_Notas_Saidas IS
SELECT *
FROM TAB_A NF;—QUERYBEGIN
r_FileHandle := Utl_File.fOpen(v_diretorio, ‘NOMEDOARQUIVO.TXT’, ‘w’, 32767);–ABRE O ARQUIVOFOR NS IN C_NOTAS_SAIDAS LOOP
Utl_File.Put_Line(r_FileHandle, NS.E_NNF||NS.E_SERIE||NS.E_NATOP);—GRAVA A LINHA
END LOOP;
Utl_File.fFlush(r_FileHandle);–FORCA A GRAVAÇÃO DO BUFFER
Utl_File.fClose(r_FileHandle);—FECHA O ARQUIVO
END;
/************************************/E o retorno é:
/************************************/
Error report:
ORA-06550: linha 5, coluna 14:
PLS-00201: o identificador ‘UTL_FILE’ deve ser declarado
ORA-06550: linha 5, coluna 14:
PL/SQL: Item ignored
ORA-06550: linha 14, coluna 1:
PLS-00320: a declaração do tipo desta expressão está incompleta ou incorreta
ORA-06550: linha 14, coluna 1:
PL/SQL: Statement ignored
ORA-06550: linha 18, coluna 19:
PLS-00320: a declaração do tipo desta expressão está incompleta ou incorreta
ORA-06550: linha 18, coluna 1:
PL/SQL: Statement ignored
ORA-06550: linha 23, coluna 17:
PLS-00320: a declaração do tipo desta expressão está incompleta ou incorreta
ORA-06550: linha 23, coluna 1:
PL/SQL: Statement ignored
ORA-06550: linha 24, coluna 17:
PLS-00320: a declaração do tipo desta expressão está incompleta ou incorreta
ORA-06550: linha 24, coluna 1:
PL/SQL: Statement ignored
06550. 00000 – “line %s, column %s:n%s”
*Cause: Usually a PL/SQL compilation error.
*Action:
/************************************/17 de dezembro de 2008 às 8:22 pm #84324Leonardo Litz
ParticipanteExecute o seguinte comando com o usuario system ou peca para o seu dba executa-lo
grant execute on utl_file to USUARIO
Me parece que vc não tem permissão de executar esta package que é uma package do owner SYS.
17 de dezembro de 2008 às 8:40 pm #84327joaocsc
ParticipanteLitz, era acesso mesmo. Depois do grat resolveu.
Agora ele reclamou do caminho.
Error report:
ORA-29280: caminho de diretório inválido
ORA-06512: em “SYS.UTL_FILE”, line 33
ORA-06512: em “SYS.UTL_FILE”, line 436
ORA-06512: em line 14
29280. 00000 – “invalid directory path”
*Cause: A corresponding directory object does not exist.
*Action: Correct the directory object parameter, or create a corresponding
directory object with the CREATE DIRECTORY command.17 de dezembro de 2008 às 8:47 pm #84329Ishii
ParticipanteOlá
Se for no Windows pode ser apenas ‘C:TEMP’ mesmo, acho que não precisa informar o \IP..
[]s Ishii
17 de dezembro de 2008 às 8:59 pm #84331Leonardo Litz
ParticipanteEntão cara se for windows vc pode gerar no C: mesmo, só verifique se na pasta em que vc for gerar vc tem acesso de escrita.
Outra opcao é vc criar um directory e ao inves de vc passar o caminho você pode passar o nome do directory.
Havia escrito um exemplo de vc gravar na rede o arquivo.
Vlw Leonardo Litz
17 de dezembro de 2008 às 9:10 pm #84332Rodrigo Mesquita
ParticipanteNa versão 7.1.5 do pl/sql developer é só fazer uma consulta, depois clicar no resultado com o botão direito e pedir pra ele exportar para script.
17 de dezembro de 2008 às 9:14 pm #84334joaocsc
ParticipanteLitz e Ishii,
É servidor windows, mas ainda não consegui… coloquei com ip… sem… só a pasta… vou fazer mais uns testes.Rodrigo,
Esse processo ficará rodando em uma procedure, sem intervenção do usuário.17 de dezembro de 2008 às 10:12 pm #84342Leonardo Litz
Participantecrie um directory com o caminho que vc quer gerar o arquivo
create or replace directory MEU_DIRETORIO
as ‘C:TEMP’;na linha da variavel do diretorio coloque o nome do directory
v_diretorio varchar2(200) := ‘MEU_DIRETORIO’;
Vlw Leonardo Litz
-
AutorPosts
- Você deve fazer login para responder a este tópico.