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.