Pular para o conteúdo
  • Este tópico contém 18 respostas, 5 vozes e foi atualizado pela última vez 17 anos, 3 meses atrás por Avatar photoLeonardo Litz.
Visualizando 15 posts - 1 até 15 (de 19 do total)
  • Autor
    Posts
  • #84308
    joaocsc
    Participante

      Pessoal,
      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.com

      #84309
      Avatar photoLeonardo Litz
      Participante

        Ola Joao, vc utiliza o pl/sql developer?

        Voce pode utilizar o utl_file do proprio oracle tb.

        #84310
        joaocsc
        Participante

          Litz,
          Você pode colocar um exeplo de utilização do utl_file?
          Obrigado.

          #84311
          abonacin
          Participante
            #84313
            Avatar photoLeonardo Litz
            Participante

              Segue 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;—QUERY

              BEGIN
              r_FileHandle := Utl_File.fOpen(v_diretorio, ‘NOMEDOARQUIVO.TXT’, ‘w’,32767);–ABRE O ARQUIVO

              FOR NS IN C_NOTAS_SAIDAS LOOP

                Utl_File.Put_Line(r_FileHandle,  NS.NUMERO_NOTA||NS.DATA_EMISSAO||NS.VALOR_NOTA);---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;

              #84317
              joaocsc
              Participante

                Nã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 declarado

                #84320
                Avatar photoLeonardo Litz
                Participante

                  Posta ai o script que vc esta tentando executar para mim ver…

                  #84322
                  joaocsc
                  Participante

                    O script é:

                    /************************************/
                    declare

                    v_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;—QUERY

                    BEGIN
                    r_FileHandle := Utl_File.fOpen(v_diretorio, ‘NOMEDOARQUIVO.TXT’, ‘w’, 32767);–ABRE O ARQUIVO

                    FOR 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:
                    /************************************/

                    #84324
                    Avatar photoLeonardo Litz
                    Participante

                      Execute 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.

                      #84327
                      joaocsc
                      Participante

                        Litz, 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.

                        #84329
                        Ishii
                        Participante

                          Olá

                          Se for no Windows pode ser apenas ‘C:TEMP’ mesmo, acho que não precisa informar o \IP..

                          []s Ishii

                          #84331
                          Avatar photoLeonardo Litz
                          Participante

                            Entã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

                            #84332
                            Rodrigo Mesquita
                            Participante

                              Na 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.

                              #84334
                              joaocsc
                              Participante

                                Litz 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.

                                #84342
                                Avatar photoLeonardo Litz
                                Participante

                                  crie 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

                                Visualizando 15 posts - 1 até 15 (de 19 do total)
                                • Você deve fazer login para responder a este tópico.