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. :-)