Compartilhando conhecimento com o mundo

Com tecnologia do Blogger.

Pesquisa

Download

Blogger Tricks

Blogger Themes

Visitas

Assuntos

11/26/2014

Que delimitador usar - Informix


Nesse artigo, o objetivo é apresentar uma sugestão envolvendo o problema de descobrir que delimitador usar em uma tabela do informix que parece que usa todos as letras/símbolos, vamos descobrir qual é a letra/simbolo que na tabela do informix menos usa, o backup é de uma tabela do Informix e restauração vai ser no SQL Server 2014.

Umas das soluções foi pesquisar no arquivo do backup da tabela do Informix e ver se tem alguma letra/simbolo disponivel, primeiro vamos preparar o script que vamos rodar o backup da tabela - o backup via external tables que é o backup mais rápido aqui pra mim;

Criar este script com o nome backup_script.sql
#!/bin/sh
###############################################################################
#   Script para backup de tabelas via EXTERNAL TABLES                         #
#   Criado Por Claudemar Martins de Sa                                        #
#   Uso: backup_script.sh [DATABASE] [TABELA]                                 #
#   Rodar: ./backup_script.sql nome_do_banco nome_da_tabela                   #
###############################################################################

DATABASE=${1}
TABLE=${2}

dbaccess ${DATABASE} >/dev/null << EOF
set pdqpriority 30;
CREATE EXTERNAL TABLE informix.bkp_${TABLE}
SAMEAS ${TABLE}
USING
   (DATAFILES ("DISK:/export/home/informix/backup/${TABLE}.unl"),
FORMAT 'DELIMITED',
DELIMITER '',
RECORDEND '',
Deluxe,
NUMROWS 50,
MAXERRORS 50,
REJECTFILE ''
);

insert into bkp_${TABLE}
select * from ${TABLE};

drop table bkp_${TABLE}
EOF
Rodando o backup da tabela sem o delimitador - rodamos assim - ./nome_do_script nome_do_banco nome_da_tabela
./backup_script.sql faz_sgf notes_rel_baixa

Database selected.

PDQ Priority set.

Table created.

9992 row(s) inserted.

Table dropped.

Database closed.
Script que vamos analisar o backup e ver se tem alguma letra que podemos usar como delimitador

Criar este script com o nome delimitador.sql
# :%s/antes/nova/g

TABLE=${1}

echo "q - $(cat $TABLE | grep '\q' | wc -l)" ; 
echo "w - $(cat $TABLE | grep '\w' | wc -l)" ; 
echo "e - $(cat $TABLE | grep '\e' | wc -l)" ; 
echo "r - $(cat $TABLE | grep '\r' | wc -l)" ; 
echo "t - $(cat $TABLE | grep '\t' | wc -l)" ; 
echo "y - $(cat $TABLE | grep '\y' | wc -l)" ; 
echo "u - $(cat $TABLE | grep '\u' | wc -l)" ; 
echo "i - $(cat $TABLE | grep '\i' | wc -l)" ; 
echo "o - $(cat $TABLE | grep '\o' | wc -l)" ; 
echo "p - $(cat $TABLE | grep '\p' | wc -l)" ; 
echo "a - $(cat $TABLE | grep '\a' | wc -l)" ; 
echo "s - $(cat $TABLE | grep '\s' | wc -l)" ; 
echo "d - $(cat $TABLE | grep '\d' | wc -l)" ; 
echo "f - $(cat $TABLE | grep '\f' | wc -l)" ; 
echo "g - $(cat $TABLE | grep '\g' | wc -l)" ; 
echo "h - $(cat $TABLE | grep '\h' | wc -l)" ; 
echo "k - $(cat $TABLE | grep '\k' | wc -l)" ; 
echo "l - $(cat $TABLE | grep '\l' | wc -l)" ; 
echo "z - $(cat $TABLE | grep '\z' | wc -l)" ; 
echo "x - $(cat $TABLE | grep '\x' | wc -l)" ; 
echo "c - $(cat $TABLE | grep '\c' | wc -l)" ; 
echo "v - $(cat $TABLE | grep '\v' | wc -l)" ; 
echo "b - $(cat $TABLE | grep '\b' | wc -l)" ; 
echo "n - $(cat $TABLE | grep '\n' | wc -l)" ; 
echo "m - $(cat $TABLE | grep '\m' | wc -l)" ; 
echo ", - $(cat $TABLE | grep '\,' | wc -l)" ; 
echo ". - $(cat $TABLE | grep '\.' | wc -l)" ; 
echo "; - $(cat $TABLE | grep '\;' | wc -l)" ; 
echo "! - $(cat $TABLE | grep '\!' | wc -l)" ; 
echo "@ - $(cat $TABLE | grep '\@' | wc -l)" ; 
echo "# - $(cat $TABLE | grep '\#' | wc -l)" ; 
echo "$ - $(cat $TABLE | grep '\$' | wc -l)" ; 
echo "% - $(cat $TABLE | grep '\%' | wc -l)" ; 
echo "& - $(cat $TABLE | grep '\&' | wc -l)" ; 
echo "* - $(cat $TABLE | grep '\*' | wc -l)" ; 
echo "( - $(cat $TABLE | grep '(' | wc -l)" ; 
echo ") - $(cat $TABLE | grep ')' | wc -l)" ; 
echo "_ - $(cat $TABLE | grep '\_' | wc -l)" ; 
echo "- - $(cat $TABLE | grep '\-' | wc -l)" ; 
echo "+ - $(cat $TABLE | grep '\+' | wc -l)" ; 
echo "| - $(cat $TABLE | grep '\|' | wc -l)" ; 
echo "~ - $(cat $TABLE | grep '\~' | wc -l)" ; 
echo "? - $(cat $TABLE | grep '\?' | wc -l)" ;
echo "[ - $(cat $TABLE | grep '\[' | wc -l)" ;
echo "] - $(cat $TABLE | grep '\]' | wc -l)" ;
echo "< - $(cat $TABLE | grep '\<' | wc -l)" ;
echo "> - $(cat $TABLE | grep '\>' | wc -l)" ;
echo "{ - $(cat $TABLE | grep '\{' | wc -l)" ;
echo "} - $(cat $TABLE | grep '\}' | wc -l)" ;
echo -n '" - '  
cat $TABLE | grep '"' | wc -l
Rodando o programa para descobrir que letra não existe no arquivo de backup da tabela, reparem o { não tem - vou usar ele como delimitador
./delimitador.sh notes_rel_baixa.unl 

q - 8079
w - 24779
e - 19215
r - 19246
t - 17554
y - 11
u - 17609
i - 17987
o - 19566
p - 14714
a - 18981
s - 18458
d - 18332
f - 13783
g - 10093
h - 6551
k - 136
l - 18383
z - 4793
x - 8326
c - 16933
v - 13901
b - 24779
n - 19679
m - 16356
, - 13836
. - 20762
; - 1238
! - 7
@ - 1
# - 0
$ - 1364
% - 228
& - 21
* - 19
( - 1832
) - 2457
_ - 6
- - 18013
+ - 30
| - 47306
~ - 5
? - 7
[ - 1
] - 4
< - 24779
> - 24779
{ - 0
} - 1
" - 233
Alterando o arquivo de backup e colocando a letra { como delimitador
#!/bin/sh
###############################################################################
#   Script para backup de tabelas via EXTERNAL TABLES                         #
#   Criado Por Claudemar Martins de Sa                                        #
#   Uso: backup_script.sh [DATABASE] [TABELA]                                 #
#   Rodar: ./backup_script.sql nome_do_banco nome_da_tabela                   #
###############################################################################

DATABASE=${1}
TABLE=${2}

dbaccess ${DATABASE} >/dev/null << EOF
set pdqpriority 30;
CREATE EXTERNAL TABLE informix.bkp_${TABLE}
SAMEAS ${TABLE}
USING
   (DATAFILES ("DISK:/export/home/informix/backup/${TABLE}.unl"),
FORMAT 'DELIMITED',
DELIMITER '{',
RECORDEND '',
Deluxe,
NUMROWS 50,
MAXERRORS 50,
REJECTFILE ''
);

insert into bkp_${TABLE}
select * from ${TABLE};

drop table bkp_${TABLE}
EOF
Rodando o backup da tabela no Informix
./backup_script.sql faz_sgf notes_rel_baixa

Database selected.

PDQ Priority set.

Table created.

9992 row(s) inserted.

Table dropped.

Database closed.
Criando a tabela no SQL Server 2014 igual como esta no Informix
use faz_sgf;

create table "dbo".notes_rel_baixa 
  (
    osn_codigo integer not null ,
    rel_versao integer not null ,
    inscricaoestadual decimal(14,0) not null ,
    baixa_dt_ini_fisc datetime2,
    baixa_dt_fin_fisc datetime2,
    baixa_folha varchar(10),
    baixa_rudfto varchar(8),
    baixa_dt_conclusao datetime2,
    baixa_descritivo text,
    baixa_altcadastral text,
    baixa_versaosf varchar(1,1),
    baixa_sit_aprovacao integer not null ,
    usr_codigo_criacao integer not null ,
    usr_dt_hr_criacao datetime2 ,
    usr_codigo_alter integer,
    usr_dt_hr_alter datetime2,
    primary key (osn_codigo,rel_versao,inscricaoestadual)
  );
O utilitário bcp é uma ferramenta de linha de comandos que usa a API do BCP (Programa de cópia em massa).
bcp bdfaz_faz_sgf.dbo.notes_rel_baixa format nul -c -f D:\Usuários\faz_sgf\notes_rel_baixa.fmt -T -S s905\itc005 -t "{"
Ficou assim;
11.0
16
1       SQLCHAR             0       12      "{"      1     osn_codigo                                 ""
2       SQLCHAR             0       12      "{"      2     rel_versao                                 ""
3       SQLCHAR             0       41      "{"      3     inscricaoestadual                          ""
4       SQLCHAR             0       30      "{"      4     baixa_dt_ini_fisc                          ""
5       SQLCHAR             0       30      "{"      5     baixa_dt_fin_fisc                          ""
6       SQLCHAR             0       10      "{"      6     baixa_folha                                SQL_Latin1_General_CP1_CI_AS
7       SQLCHAR             0       8       "{"      7     baixa_rudfto                               SQL_Latin1_General_CP1_CI_AS
8       SQLCHAR             0       30      "{"      8     baixa_dt_conclusao                         ""
9       SQLCHAR             0       0       "{"      9     baixa_descritivo                           SQL_Latin1_General_CP1_CI_AS
10      SQLCHAR             0       0       "{"      10    baixa_altcadastral                         SQL_Latin1_General_CP1_CI_AS
11      SQLCHAR             0       1       "{"      11    baixa_versaosf                             SQL_Latin1_General_CP1_CI_AS
12      SQLCHAR             0       12      "{"      12    baixa_sit_aprovacao                        ""
13      SQLCHAR             0       12      "{"      13    usr_codigo_criacao                         ""
14      SQLCHAR             0       30      "{"      14    usr_dt_hr_criacao                          ""
15      SQLCHAR             0       12      "{"      15    usr_codigo_alter                           ""
16      SQLCHAR             0       30      "{\n"    16    usr_dt_hr_alter                            ""
Coloco no servidor SQL Server os arquivos de bcp e o arquivo de backup da tabela no Informix - rodando este comando;
use faz_sgf;

BULK INSERT notes_rel_baixa --- delimitador ({)
FROM 'I:\data\bdfaz\carga_claudemar\faz_sgf\notes_rel_baixa.unl' -- unload
WITH (FORMATFILE = 'I:\data\bdfaz\carga_claudemar\faz_sgf\notes_rel_baixa.fmt'); -- bcp
Terminou ok a importação no SQL Server
(9992 row(s) affected)

11/25/2014