Problema.

 

Tenho que exportar dados de um banco Oracle em um servidor Linux para um banco SQL Server em um servidor Windos.

 

 

 

Solução.

 

1.) Criamos um ponto de montagem no linux para um diretorio do servidor windows (SMB), procure aqui no site que explico como fazer isso.

 

2.) Criamos um arquivo .pl (PL/SLQ) com a consulta requerida, vamos gerar um arquivo texto (csv), com base nessa consulta.

 

3.) Criamos um arquivo .sh que ira executar o arquivo .pl, assim podemos agendar atravez do crontab quando executar o arquivo .sh

 

 

 

OBS.

 

Vamos utilizar em vez de ; como separador de campos #

 

Podiamos fazer isso via JOB NO ORACLE, a resposta é sim, mas aqui estamos estudando então em outro artigo descreverei como.

 

 

 

Lembrando os artigos aqui são base para exemplo de aula, assim vou tentar utilizar o maximo de exemplos possiveis.

 

Gostando pode mandar o pix O endereço de e-mail address está sendo protegido de spambots. Você precisa ativar o JavaScript enabled para vê-lo. :-)

 

Botando em pratica

  


 

 

 1.) mount -t cifs //<<IP DESTINO>>/<<DIRETORIO DESTINO>> /<<DIRETORIO LOCAL>> -o user=<<USUARIO WINDOWS>>,pass=<<SENHA>>,file_mode=0777,dir_mode=0777,iocharset=utf8

 

Obs. 

 

Se seu Windows estiver atualizado vai ter que declara a vers=2

 

mount.cifs '//<<IP DESTINO>>/diretorio destino veja que utilizo aspa simples ' /<<DIRETORIO LOCAL>>/ -o vers=2.0, user=<<USUARIO WINDOWS>>,pass=<<SENHA>>

 

Se o caso for gravar o arquivo diretamente em um servidor FTP 

 

curlftpfs usuario:senha@host_ftp/pasta_ftp /pasta_local/

 


 

 

2.) Criando arquivo pl

 

alter session set nls_timestamp_format='dd/mm/yyyy HH24:mi:ss';

 

alter session set nls_date_format='dd/mm/yyyy HH24:mi:ss';

 

# set colsep '#'

 

set pagesize 0

 

set linesize 9999

 

set trimspool on

 

set tab off

 

set echo off

 

set feedback off

 

set recsep off

 

set feedback off

 

set heading on

 

spool /ponto_de_montagem/windows/exp_arquivo.csv

 

SELECT DISTINCT

 

campo01||'#'

 

||DECODE(campo02, NULL, 'Aberto', 'A', 'Aberto','C', 'Cancelado', 'F', 'Faturado')||'#'

 

||BLALALALALALA TUA QUERY

 

FROM

 

    TABELA

 

WHERE

 

    CAMPO03 = 'TEU FILTRO'

 

    AND ( CAMPO04 = SEI LA O QUE )

 

    AND (

 

        CASE

 

            WHEN CAMPO05 IS NULL THEN

 

                'VALID'

 

            WHEN CAMPO05 IS NOT NULL                 

 

                'INVALID'

 

            ELSE

 

                'BLALALALALALA TUA ESCOLHA'

 

        END

 

    ) = 'VALID'   

 

AND ROWNUM  <= 40 /* VAMOS SEMPRE LIMITAR O NUMERO DE COLUNA IMAGINA PEGAR UMA BASE GORDIANHA QUE TRABALHO*/

 

;

 

spool off

 

set feedback on

 

set heading on

 

set pagesize 20

 

exit


 3. Arquivo sh

 

 

 

TMP=/tmp; export TMP

 

TMPDIR=$TMP; export TMPDIR

 

 

 

 

 

ORACLE_HOSTNAME=<<TEU SERVIDOR>>; export ORACLE_HOSTNAME

 

ORACLE_UNQNAME=<<TEU BANCO>>; export ORACLE_UNQNAME

 

ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE

 

ORACLE_HOME=$ORACLE_BASE/product/11.2.0.4/db_1; export ORACLE_HOME

 

ORACLE_SID=<<TEU BANCO>>; export ORACLE_SID

 

ORACLE_TERM=xterm; export ORACLE_TERM

 

PATH=/usr/sbin:$PATH; export PATH

 

PATH=$ORACLE_HOME/bin:$PATH; export PATH

 

 

 

 

 

LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; export LD_LIBRARY_PATH

 

CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib; export CLASSPATH

 export NLS_LANG=PORTUGUESE_BRAZIL.UTF8  << CUIDADO AQUI DEPENDENDO DA CONFIGURAÇÃO TU VAI TER DOR DE CABEÇA>>

 

rm -rf /DIRETORIO DESTINO WIN/*.csv 

sqlplus system/<password>@<connection_string> @/DIRETORIO DOS Scripts/SCRIPT.pl

 sed 's/$'"/'echo \\\r'/" /DIRETORIOMAPEADO/ARQUIVO_CSV_GERADO.csv>/DIRETORIOMAPEADO/ARQUIVO_CSV_RECODIFICADO.csv

Depois é só ir no crontab -e e configura, não esqueça de resetar o servico do crontab.