Vivendo e Aprendendo

Experiência prática na administração de Banco de Dados

SQL*Loader - Números decimais

by Gilberto C. Andrade on 31 Maio 2010

Tagged as: Database, Linux, oracle,

Verificando posts de meu antigo blog notei que alguns não foram importados ou foram importados com defeitos em seu conteúdo. Então resolvi realizar um trabalho de revisão e o segundo começa hoje:

Se burrice matasse, já estária morto! Calma vou explicar. Estou fazendo carga de um sistema legado (migração). E algumas tabelas contém colunas com o tipo de dado NUMBER(15,6), mas os dados podem vir nulos, inteiros ou decimais.
Inicialmente pensei que ele (sqlldr) faria a conversão, mas ..

Record 1: Rejected - Error ON TABLE VANTAGENS_TMP, COLUMN VALOR. ORA-01722: invalid NUMBER Record 2: Rejected - Error ON TABLE VANTAGENS_TMP, COLUMN VALOR. ORA-01722: invalid NUMBER

Depois tentei colocar tipos específicos no control file para estas colunas, como por exemplo INTEGER, INTEGER EXTERNAL, DECIMAL(15,6). Mas todas as tentativas acabavam com:

Record 29: Rejected - Error ON TABLE VANTAGENS_TMP, COLUMN VALOR. ORA-01460: unimplemented OR unreasonable conversion requested

A solução, foi tão simples que estou até com vergonha de dizer. Bom, praticamente todas as atividades que você faz através de uma sessão sql, são regidas pela variável de ambiente NLS_LANG. Pois é, você ajusta esta variável e todas que dependem dela, quer dizer, NLS_* vão assumir valores pre-definidos. Aí você fala: Qual é a novidade? A novidade é que se você fizer uma customização em qualquer uma das outras variáveis (que foi o caso do bonitão aqui), você terá que assumir as consequências. Enquanto estava fazendo um teste com procedimento ajustei uma destas variáveis:

export NLS_NUMERIC_CHARACTERS=,.

Bom, foi só trocar os sinais que conversão implícita funcionou. Mas uma coisa, uma dica é colocar o tipo do character set no control file através do parametro CHARACTERSET, assim você não depende da configuração do ambiente para fazer carga.

comments powered by Disqus