Pular para o conteúdo

Fóruns SQL e PL/SQL Exportação de dados em txt via sqlplus Exportação de dados em txt via sqlplus

#108592
Avatar photoJosé Laurindo Chiappa
Moderador

    Bem, se a sua necessidade é pontual (ie, vc precisa disso Eventualmente, apenas) sim, o Oracle SQL Developer é ** excelente ** pra isso, é é ridiculamente Fácil de usar e se fazer : é só colocar o HINT de DELIMITED (*** não é o de TXT apenas***) E se vc não quer o default vc Indica nas configs do SQL Developer o delimitador que vc quer, cfrme http://www.thatjeffsmith.com/archive/2013/04/sql-developer-preferences-for-delimited-text-exports/ explica / mostra…. Bico….
    PORÉM, o Oracle SQL Developer é uma GUI, portanto vc tem que manualmente clickar onde vc quer, sendo DIFÍCIL portanto vc fazer isso programaticamente, automaticamente, principalmente se isso é um trabalho rotineiro que vc precisa fazer Rotineiramente com queries diferentes : aí sim, vc vai ter que Programar um pouquinho pra isso….
    O sqlplus serve sim pra isso, muito embora a linguagem de programação via script dele seja um tanto limitada : vou demonstrar aqui como fazer no sqlplus MAS vou depois indicar outras opções (gratuitas, apenas) que não possuem as limitações do sqlplus…

    a) sqlplus :

    a principal vantagem do sqlplus é que ele é padrão numa instalação Oracle, mas a questão é que ele é uma tool de Report e Consulta de dados, portanto ele ** sempre ** vai gerar linhas com colunas de mesma largura, assim sendo se uma coluna não foi totalmente preenchida ele VAI ter espaços para esses casos… Se isso não te incomoda (o Excel, por exemplo, Absoluta e Completamente IGNORA por default espaços antes ou depois de cada coluna, no sqlplus a resposta é esta abaixo, com a IMPORTANTE adição que vc deve chamar o script de fora do sqlplus, assim :

    ==> olha o script :

    C:Usersjlchi_000>type gera_delimit.sql

    set colsep ‘;’
    set headsep off
    set pagesize 0
    set trimspool on
    set linesize 1000
    spool delimit.txt
    select deptno, dname, loc from dept;
    exit
    /
    C:Usersjlchi_000>

    ==> O caracter / no final do script é exigência do sqlplus… Vou chamar o script, a partir da linha de comando, num ambiente onde (*** Óbvio ***) já tenho as variáveis de ambiente PATH, ORACLE_SID e ORACLE_HOME setadas :

    C:Usersjlchi_000>sqlplus scott/tiger @gera_delimit.sql

    SQL*Plus: Release 11.2.0.2.0 Production on Qua Jan 25 12:18:25 2017

    Copyright (c) 1982, 2014, Oracle. All rights reserved.

    Conectado a:
    Oracle Database 11g Express Edition Release 11.2.0.2.0 – 64bit Production

        10;ACCOUNTING    ;NEW YORK
        20;RESEARCH      ;DALLAS
        30;SALES         ;CHICAGO
        40;OPERATIONS    ;BOSTON
    

    Desconectado de Oracle Database 11g Express Edition Release 11.2.0.2.0 – 64bit Production

    C:Usersjlchi_000>

    ==> Olha só o arquivo gerado :

    C:Usersjlchi_000>dir delimit.txt
    O volume na unidade C não tem nome.
    O Número de Série do Volume é 340C-E794

    Pasta de C:Usersjlchi_000

    25/01/2017 12:18 141 delimit.txt
    1 arquivo(s) 141 bytes
    0 pasta(s) 460.942.860.288 bytes disponíveis

    C:Usersjlchi_000>type delimit.txt
    10;ACCOUNTING ;NEW YORK
    20;RESEARCH ;DALLAS
    30;SALES ;CHICAGO
    40;OPERATIONS ;BOSTON

    C:Usersjlchi_000>

    ==> O Fórum talvez reformate isso e vc não veja, mas o TYPE tá mostrando EXATAMENTE o que eu falei acima : os ponto-e-vírgula tão CERTINHO na mesma coluna, cada coluna tem a mesma Exata largura sempre, e são introduzidos espaços ou antes ou depois para “forçar” cada coluna a ficar com a mesma largura… Só pra teste, importei esse arquivo numa Planilha Excel e foi de boas…

    b) outra opção gratuita que aceita programação via script é a ferramente Oracle SQL Command Line (SQLcl), disponível na mesma página de download do Oracle SQL Developer (ie, http://www.oracle.com/technetwork/developer-tools/sql-developer/downloads/index.html) : eu não usei ela ainda mas em http://www.thatjeffsmith.com/archive/2015/12/more-set-sqlformat-fun-in-sqlcl/ o Autor mostra as opções, tenta lá…

    c) ainda outra opção é vc usar a linguagem de programação interna default do RDBMS Oracle, a linguagem PL/SQL : ela possui uma package (biblioteca de rotinas) chamada UTL_FILE que serve para isso… O único senão é que, como essa linguagem é interna no database, ela só pode gravar o arquivo no Servidor do RDBMS Oracle, e não nalguma máquina-cliente : se isso não te afeta, https://asktom.oracle.com/pls/apex/f?p=100:11:0::::p11_question_id:68212348056 tem um bom exemplo…

    d) a opção final é vc programar nalguma linguagem de programação externa ao banco mas que permita conectar : https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:459020243348 tem um exemplo em PRO*C, se vc googlar vc encontra exemplos em Java, .NET e muitas outras…. A vantagem de se fazer algo personalizado é que você está no controle total, então vc formata como bem quiser, MAS a desvantagem óbvia é que vc Precisa entender de programação…

    []s

    Chiappa