Vamos ao cenário : 

 

Tenho um servidor linux com Oracle e presciso exporta uma(s) tabela(s), para outro servidor Windows com SQL Server.

Este processo ocorrera todos os dias a cada 2 horas no periodo comercial.

 

Preparando o ambiente :

 

1.) Mapear no Linux o servidor Windows

yum install cifs-utils

vi /etc/rc.local

mount -t cifs //<<IP SERVIDOR WIN>>/<<DIRETORIO COMPRATILHADO>> /<<DIRETORIO LOCAL DO MAPEAMENTO>> -o user=<<USUARIO COMPARTILHAMENTO WIN>>,pass=s<<SENHA COMPARTILHAMENTO WIN>>,file_mode=0777,dir_mode=0777,iocharset=utf8

 

2.) Agendar no Crontab o Script de exportação

crontab -e

 

# For details see man 4 crontabs

# Example of job definition:

# .---------------- minute (0 - 59)

# |  .------------- hour (0 - 23)

# |  |  .---------- day of month (1 - 31)

# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...

# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat

# |  |  |  |  |

# *  *  *  *  * user-name command to be executed

02 08,10,12,14,16,18  *  *  * /home/oracle/Scripts/<<DIRETORIO DE SUA ESCOLHA>>/script_exportacao.sh

 

 

 

 

 

1.) Vamos cria um arquivo .sh que será agendado no crontab

 

OBS:

 

       Este arquivo deve declara as variáveis de ambiente.

       Este arquivo deve deletar o arquivo antigo.

   Neste exemplo o arquivo destino sera criado com padroes linux ai criamos outro arquivo com padrao WIN (CR LF) UTF-8

   

 

vi Script.sh

 

TMP=/tmp; export TMP

TMPDIR=$TMP; export TMPDIR

 

ORACLE_HOSTNAME= << HOSTNAME >>.com.br; export ORACLE_HOSTNAME

ORACLE_UNQNAME= << 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= << 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

 

rm -rf //<<IP SERVIDOR WIN>>/<<DIRETORIO COMPRATILHADO>>/<<ARQUIVO EXP ORACLE>>.csv

export NLS_LANG=PORTUGUESE_BRAZIL.WE8ISO8859P1

sqlplus <<USUARIO>>/<<SENHA>>@<< BANCO >> @/home/oracle/Scripts/<<Script PL boa pratica mesmo nome tabela >>.pl

sed 's/$'"/`echo \\\r`/" //<<IP SERVIDOR WIN>>/<<DIRETORIO COMPRATILHADO>>/<<ARQUIVO EXP ORACLE>>.csv > //<<IP SERVIDOR WIN>>/<<DIRETORIO COMPRATILHADO>>/<<ARQUIVO EXP ORACLE VERSAO TEXTO WIN>>.csv

 

 

 

 

2.) Criação arquivo PL.

 

 

OBS:

 

       Podemos utilizar o select * << CUIDADO NESTE CASO OS CAMPOS SERÃO PREENCHIDOS COM ESPAÇOS REFERENTE AO TAMANHO DO CAMPO >>.

   Isto aumentara o tamanho do arquivo csv ocasionando problemas em caso de tabelas grandiosas. < estouro de spool oracle >

       Para evitar este tipo de ocorrencia utilize o | (pipe) conforme o exemplo abaixo.

   Voce pode especificar um where ou ate mesmo um order by no select so que isso ira ocossionar lentidão no export.

 

vi Script.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 off

spool //<<IP SERVIDOR WIN>>/<<DIRETORIO COMPRATILHADO>>/<<ARQUIVO EXP ORACLE>>.csv

 

select CAMPO1||'|#|'||CAMPO2||'|#|'||CAMPO3||'|#|'||CAMPO4||'|#|'||CAMPO5 

from << TABELA A SER EXPORTADA >>  order by TCR_DTINC;

 

spool off

set feedback on

set heading on

set pagesize 20

exit

 

 

A Parte do import no SQL Server estarei postando assim que possivel. :-)