Conversão para Number

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
luispedroka
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Qua, 16 Nov 2011 10:01 am

Bom dia Pessoal do Glufke,
Sei que este Tópico parece bem de iniciante, mais a verdade é que estou enfrentando problemas para converter para NUMBER uma informação obtida através de uma leitura de arquivo TXT utilizando a função UTL_FILE.

Utilizo a seguinte função pra ler o arquivo:

Selecionar tudo

v_EntMultCompVal:= Substr(v_Linha,(Instr(v_Linha,';',1,2)+1),100);
Não vou entrar em detalhes da leitura, mais debugando a procedure verifico que esta linha de comando me retorna o valor 0,6371 para a variável que é do tipo Varchar2.

O Problema é que este valor que foi lido terá que ser inserido em um campo na tabela do banco do tipo Number, e já tentei de várias maneiras fazer a conversão para Number, e o erro retornado é o ORA-06502.

O que eu já tentei fazer:
1 - Criei outra variável do tipo Number e fiz a mesma receber esse valor. Exemplo:

Selecionar tudo

To_Number(v_String)
2 - Já utilizei várias Máscaras para a função To_Number.
3 - Tentei usar o To_Number direto na inserção do campo na tabela
4 - Através de um Replace retirei o caractere vírgula(,) e substitui por ponto(.) e em seguida usei o To_Number.

Enfim já utilizei vários formas de tentar converter e ainda não consegui.

Alguém poderia me dar uma dica?
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Se você disse que já tentou inserir "0,6371" como "0.6371"(com ponto) e não deu certo...
Não seria outro o problema? Outra conversão que você esteja fazendo? Outro campo da mesma linha que dá problema?
Verifique também o tipo do campo.
Tenta inserir essa linha manualmente como teste.
luispedroka
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Qua, 16 Nov 2011 10:01 am

Acredito que não, o erro da sempre na mesma linha da conversão. Se comentar essa linha ele acaba passando porem no momento do Insert na tabela ele pede para passar um valor do tipo Number. O Tipo do campo na tabela é um Number também.

Fiz o seguinte teste e não deu erro:

Criei a variavel como sendo Number

Selecionar tudo

V_MultValComp        Number(10); 
Na linha onde fiz a conversão troquei, e atribui o valor manualmente.

Selecionar tudo

V_MultValComp:= '0,6371'; 
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Então você está pegando mais do que '0,6371', nos teus substrings.
Não???

Só mais uma dúvida, o erro dá no TO_NUMBER ou na hora de inserir?
luispedroka
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Qua, 16 Nov 2011 10:01 am

Pois é, a princípio eu acreditava que estava pegando algum caractere a mais do que somente o número. Mais depois eu debuguei a procedure e verifiquei os valores que são atribuidos para a váriável durante a leitura e ele somente recebe o número mesmo.

O Erro da na conversão para To_Number. Antes o erro dava no Insert pois eu não estava fazendo essa conversão na minha procedure. Como obrigatoriamente eu tenho que fazer, então o erro da exatamente na hora da conversão.

Existe alguma função no ORACLE que eu consiga varrer uma string a procura de caracteres que não sejam números e eliminá-los?

Abraço!
luispedroka
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Qua, 16 Nov 2011 10:01 am

Consegui resolver o problema!!!!!!! :D

Fiquei pensando no que você havia me falado sobre um estar lendo algo a mais alem dos números. O que me deixou mais encucado foi que mesmo Degudando a Procedure e olhando o valor da variável quando era lido aquela linha do arquivo, ele não apresentava quaisquer valor diferente do número.

Pois bem resolvi fazer um teste e apliquei um Length na variável. Quando apliquei a função ele me retornou o valor 7 quando na verdade deveria ter me retornado 6.

Onde estava o erro?

O Erro estava exatamente na leitura da linha.

Selecionar tudo

v_EntMultCompVal:= To_Char(Substr(v_Linha,(Instr(v_Linha,';',1,2)+1),100));
Basicamente a linha de comando acima le a linha do arquivo partindo da posição 1, ou seja, no começo da linha, porem ele vai ler a partir do segundo caracter ponto e vírgula(;) que ele encontrar + 1 até a posição 100.

Veja abaixo como esta o arquivo:

Selecionar tudo

B3;0,7318;0,5671
A posição 100 como pode ver não existe deixei assim para que fosse lido até o final da string para testar mesmo e não me atentei que poderia acabar lendo algum caractere indevido. Como eu já disse: Debugando a procedure e olhando o valor da variável quando é feito a leitura dessa linha, ele me traz somente números.

Solução:

Diminui a quantidade de caracteres que vai ser lido na linha, portanto a linha de codigo que le aquela posição do arquivo ficou assim:

Selecionar tudo

v_EntMultCompVal:= To_Char(Substr(v_Linha,(Instr(v_Linha,';',1,2)+1),6));
Ele le a partir do segundo ponto e vírgula(;) + 1 até 6. Exatamente o tamanho da String.

De qualquer forma muito obrigado pela ajuda, ajudou muito a me dar uma luz e resolver o problema.

Abraço à todos!!!
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Tem algo mais em sua linha????
E se não tiver 6 caracteres??

Se não tiver mais nada deixa o substring ir até o final.
luispedroka
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Qua, 16 Nov 2011 10:01 am

Não tem mais nada na linha, e eu verifiquei que o campo vai ter no maximo 6 caractere mesmo. Se eu deixar essa linha até o fim ele ta pegando alguma coisa que não me mostra.

Se eu deixar o Substring até 15 por exemplo e der um length na variavel ele me retorna um caractere a mais porem se não me mostra ele. É algo bem estranho, mais já que resolvi dessa maneira vou deixar assim.

Abraço!!!
Renato Menezes Viana
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 128
Registrado em: Sáb, 18 Nov 2006 11:51 am
Localização: Rio de Janeiro - RJ

Prezado. este caracter à mais não seria o CR,CHR(13) e/ou LF,CHR(10)?

Este comando mostra a composição de cada caracter de uma coluna:

Selecionar tudo

select dump(your_field), your_field from your_table ;

DUMP(YOUR_FIELD)                                     YOUR_FIELD
---------------------------------------------------  ---------------
Typ=96 Len=9: 48,48,48,48,48,55,49,54,49  000007161
Quem sabe um replace ajude:

Selecionar tudo

select replace(replace(<field>,chr(10),' '),chr(13),' ') 
FROM table;
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 11 visitantes