Ir para o conteúdo

Uteis

Exportando dados com spool

Vamos criar um script sql e um bat para exportar dados de uma determinada consulta para CSV (Grandes Volumes)

Primeiro, vamos preparar a consulta:

Preparando a consulta

Vou usar o seguinte comando de exemplo:

SELECT A.CODEMP,
       A.CODFIL,
       A.NUMOCP,
       A.CODPRO,
       A.CODFAM,
       A.PREFOR,
       A.QTDFOR,
       A.QTDCAN,
       A.QTDABE,
       A.QTDREC,
       A.QTDPED,
       A.VLRFIN,
       A.PREUNI,
       A.CODMOE,
       A.SITIPO,
       TO_CHAR(A.DATENT,'DD/MM/YYYY') DATENT,
       TO_CHAR(A.DATGER,'DD/MM/YYYY') DATGER,
       A.PERDSC,
       A.VLRDSC,
       A.CODDEP,
       A.CODCCU,
       A.CODEMP,
       A.CODPRO,
       B.DESPRO,
       C.CODFOR
  FROM SAPIENS.E420IPO A,
       SAPIENS.E075PRO B,
       SAPIENS.E420OCP C
WHERE C.CODEMP = A.CODEMP
  AND C.CODFIL = A.CODFIL
  AND C.NUMOCP = A.NUMOCP
  AND B.CODEMP = A.CODEMP
  AND B.CODPRO = A.CODPRO
  AND A.DATGER BETWEEN '01/02/2017' AND '10/02/2017'
  AND A.SITIPO IN (1, 2, 3, 8, 9)

Primeiro, precisamos concatenar as colunas, transformandoas em uma única coluna

SELECT A.CODEMP||';'||
       A.CODFIL||';'||
       A.NUMOCP||';'||
       A.CODPRO||';'||
       A.CODFAM||';'||
       A.PREFOR||';'||
       A.QTDFOR||';'||
       A.QTDCAN||';'||
       A.QTDABE||';'||
       A.QTDREC||';'||
       A.QTDPED||';'||
       A.VLRFIN||';'||
       A.PREUNI||';'||
       A.CODMOE||';'||
       A.SITIPO||';'||
       TO_CHAR(A.DATENT,'DD/MM/YYYY')||';'||
       TO_CHAR(A.DATGER,'DD/MM/YYYY')||';'||
       A.PERDSC||';'||
       A.VLRDSC||';'||
       A.CODDEP||';'||
       A.CODCCU||';'||
       A.CODEMP||';'||
       A.CODPRO||';'||
       B.DESPRO||';'||
       C.CODFOR
  FROM ...

Agora vamos criar uma consulta ficticia para gerar os nomes das colunas

SELECT 'CODEMP;CODFIL;NUMOCP;CODPRO;CODFAM;PREFOR;QTDFOR;QTDCAN;QTDABE;QTDREC;QTDPED;VLRFIN;PREUNI;CODMOE;SITIPO;DATENT;DATGER;PERDSC;VLRDSC;CODDEP;CODCCU;CODEMP;CODPRO;DESPRO;CODFOR' FROM DUAL

Vamos juntar as duas consultas e definir alguns parametros para o SQL em um arquivo com o nome consulta.sql

set colsep ';'
set echo off
set feedback off
set linesize 1000
set pagesize 0
set sqlprompt ''
set trimspool on
set headsep off

spool EXPORT.CSV

SELECT 'CODEMP;CODFIL;NUMOCP;CODPRO;CODFAM;PREFOR;QTDFOR;QTDCAN;QTDABE;QTDREC;QTDPED;VLRFIN;PREUNI;CODMOE;SITIPO;DATENT;DATGER;PERDSC;VLRDSC;CODDEP;CODCCU;CODEMP;CODPRO;DESPRO;CODFOR' FROM DUAL
UNION ALL
SELECT A.CODEMP||';'||
       A.CODFIL||';'||
       A.NUMOCP||';'||
       A.CODPRO||';'||
       A.CODFAM||';'||
       A.PREFOR||';'||
       A.QTDFOR||';'||
       A.QTDCAN||';'||
       A.QTDABE||';'||
       A.QTDREC||';'||
       A.QTDPED||';'||
       A.VLRFIN||';'||
       A.PREUNI||';'||
       A.CODMOE||';'||
       A.SITIPO||';'||
       TO_CHAR(A.DATENT,'DD/MM/YYYY')||';'||
       TO_CHAR(A.DATGER,'DD/MM/YYYY')||';'||
       A.PERDSC||';'||
       A.VLRDSC||';'||
       A.CODDEP||';'||
       A.CODCCU||';'||
       A.CODEMP||';'||
       A.CODPRO||';'||
       B.DESPRO||';'||
       C.CODFOR
  FROM SAPIENS.E420IPO A,
       SAPIENS.E075PRO B,
       SAPIENS.E420OCP C
WHERE C.CODEMP = A.CODEMP
  AND C.CODFIL = A.CODFIL
  AND C.NUMOCP = A.NUMOCP
  AND B.CODEMP = A.CODEMP
  AND B.CODPRO = A.CODPRO
  AND A.DATGER BETWEEN '01/02/2017' AND '10/02/2017'
  AND A.SITIPO IN (1, 2, 3, 8, 9);

spool off
exit

Agora, basta chamar o arquivo para ser executado pelo sqlplus:

sqlplus usuario/senha@tns @consulta

Para facilitar, crie um arquivo .bat para executar a ação.