SQL*Loader - Números decimais
by Gilberto C. Andrade on 31 maio 2010
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.