Pessoal,
tivemos uns problemas com conversão de valores numéricos para texto, segue uma solução.
Problema:
Na conversão implicita ou explicita utilizando o Cast e o To_Char ao realizar a conversão de tipos Float ou Number que iniciem com 0,01 ou -0,01 acaba removendo o 0 ficando dessa forma: ,01 e -,01. Esses valores podemos encontrar em dados de latitude e longitude.
Solução:
[et_pb_dmb_code_snippet _builder_version=”4.0.6″ code=”Q3JlYXRlIFRhYmxlIFRlc3RlIChWYWxvciBGbG9hdCk7CgpJbnNlcnQgSW50byBUZXN0ZSBWYWx1ZXMgKCcwLDA5MTg4ODg4ODg4ODg4ODknKTsKSW5zZXJ0IEludG8gVGVzdGUgVmFsdWVzICgnMCwwMzInKTsKSW5zZXJ0IEludG8gVGVzdGUgVmFsdWVzICgnLTAsMDA2MTY2NjY2NjY2NjY2NjcnKTsKSW5zZXJ0IEludG8gVGVzdGUgVmFsdWVzICgnMCwwNzczMDU1NTU1NTU1NTU2Jyk7Ckluc2VydCBJbnRvIFRlc3RlIFZhbHVlcyAoJzAsMDc3NjM4ODg4ODg4ODg4OScpOwpJbnNlcnQgSW50byBUZXN0ZSBWYWx1ZXMgKCcwLDA4NjU4MzMzMzMzMzMzMzMnKTsKSW5zZXJ0IEludG8gVGVzdGUgVmFsdWVzICgnMCwwMzU2MTExMTExMTExMTExJyk7Ckluc2VydCBJbnRvIFRlc3RlIFZhbHVlcyAoJy0wLDEzMzgzMzMzMzMzMzMzMycpOwpJbnNlcnQgSW50byBUZXN0ZSBWYWx1ZXMgKCcwLDA5NTY2NjY2NjY2NjY2NjcnKTsKSW5zZXJ0IEludG8gVGVzdGUgVmFsdWVzICgnMCwwMzcyNScpOwpJbnNlcnQgSW50byBUZXN0ZSBWYWx1ZXMgKCcxLDI1Jyk7Ckluc2VydCBJbnRvIFRlc3RlIFZhbHVlcyAoJy0xLDI1Jyk7Ckluc2VydCBJbnRvIFRlc3RlIFZhbHVlcyAoJzEwLDI1Jyk7Ckluc2VydCBJbnRvIFRlc3RlIFZhbHVlcyAoJy0xMCwyNScpOwpJbnNlcnQgSW50byBUZXN0ZSBWYWx1ZXMgKCc5OSwyNScpOwpJbnNlcnQgSW50byBUZXN0ZSBWYWx1ZXMgKCctOTksMjUnKTsKClNlbGVjdCBWYWxvciwgQ2FzdChWYWxvciBBcyBWYXJjaGFyMigyMCkpIEFzIFZhbG9yX0NoYXIxLCBUb19DaGFyKFZhbG9yKSBBcyBWYWxvcl9DaGFyMgpGcm9tIFRlc3RlOw==” hover_enabled=”0″]Q3JlYXRlIFRhYmxlIFRlc3RlIChWYWxvciBGbG9hdCk7CgpJbnNlcnQgSW50byBUZXN0ZSBWYWx1ZXMgKCcwLDA5MTg4ODg4ODg4ODg4ODknKTsKSW5zZXJ0IEludG8gVGVzdGUgVmFsdWVzICgnMCwwMzInKTsKSW5zZXJ0IEludG8gVGVzdGUgVmFsdWVzICgnLTAsMDA2MTY2NjY2NjY2NjY2NjcnKTsKSW5zZXJ0IEludG8gVGVzdGUgVmFsdWVzICgnMCwwNzczMDU1NTU1NTU1NTU2Jyk7Ckluc2VydCBJbnRvIFRlc3RlIFZhbHVlcyAoJzAsMDc3NjM4ODg4ODg4ODg4OScpOwpJbnNlcnQgSW50byBUZXN0ZSBWYWx1ZXMgKCcwLDA4NjU4MzMzMzMzMzMzMzMnKTsKSW5zZXJ0IEludG8gVGVzdGUgVmFsdWVzICgnMCwwMzU2MTExMTExMTExMTExJyk7Ckluc2VydCBJbnRvIFRlc3RlIFZhbHVlcyAoJy0wLDEzMzgzMzMzMzMzMzMzMycpOwpJbnNlcnQgSW50byBUZXN0ZSBWYWx1ZXMgKCcwLDA5NTY2NjY2NjY2NjY2NjcnKTsKSW5zZXJ0IEludG8gVGVzdGUgVmFsdWVzICgnMCwwMzcyNScpOwpJbnNlcnQgSW50byBUZXN0ZSBWYWx1ZXMgKCcxLDI1Jyk7Ckluc2VydCBJbnRvIFRlc3RlIFZhbHVlcyAoJy0xLDI1Jyk7Ckluc2VydCBJbnRvIFRlc3RlIFZhbHVlcyAoJzEwLDI1Jyk7Ckluc2VydCBJbnRvIFRlc3RlIFZhbHVlcyAoJy0xMCwyNScpOwpJbnNlcnQgSW50byBUZXN0ZSBWYWx1ZXMgKCc5OSwyNScpOwpJbnNlcnQgSW50byBUZXN0ZSBWYWx1ZXMgKCctOTksMjUnKTsKClNlbGVjdCBWYWxvciwgQ2FzdChWYWxvciBBcyBWYXJjaGFyMigyMCkpIEFzIFZhbG9yX0NoYXIxLCBUb19DaGFyKFZhbG9yKSBBcyBWYWxvcl9DaGFyMgpGcm9tIFRlc3RlOw==[/et_pb_dmb_code_snippet]
O select abaixo corrige o problema:
[et_pb_dmb_code_snippet _builder_version=”4.0.6″ code=”U2VsZWN0IFZhbG9yLApDYXNlCldoZW4gU3Vic3RyKENhc3QoVmFsb3IgQXMgVmFyY2hhcjIoMjApKSwgMSwgMSkgPSAnLCcgVGhlbgonMCcgfHwgQ2FzdChWYWxvciBBcyBWYXJjaGFyMigyMCkpCldoZW4gU3Vic3RyKENhc3QoVmFsb3IgQXMgVmFyY2hhcjIoMjApKSwgMSwgMikgPSAnLSwnIFRoZW4KJy0wJyB8fCBTdWJzdHIoQ2FzdChWYWxvciBBcyBWYXJjaGFyMigyMCkpLCAyLCAyMCkKRWxzZQpDYXN0KFZhbG9yIEFzIFZhcmNoYXIyKDIwKSkKRW5kIEFzIFZhbG9yX0NoYXIKRnJvbSBUZXN0ZTs=” hover_enabled=”0″]U2VsZWN0IFZhbG9yLApDYXNlCldoZW4gU3Vic3RyKENhc3QoVmFsb3IgQXMgVmFyY2hhcjIoMjApKSwgMSwgMSkgPSAnLCcgVGhlbgonMCcgfHwgQ2FzdChWYWxvciBBcyBWYXJjaGFyMigyMCkpCldoZW4gU3Vic3RyKENhc3QoVmFsb3IgQXMgVmFyY2hhcjIoMjApKSwgMSwgMikgPSAnLSwnIFRoZW4KJy0wJyB8fCBTdWJzdHIoQ2FzdChWYWxvciBBcyBWYXJjaGFyMigyMCkpLCAyLCAyMCkKRWxzZQpDYXN0KFZhbG9yIEFzIFZhcmNoYXIyKDIwKSkKRW5kIEFzIFZhbG9yX0NoYXIKRnJvbSBUZXN0ZTs=[/et_pb_dmb_code_snippet]
[et_pb_dmb_code_snippet _builder_version=”4.0.6″ code=”4oCUIENyaWFkYSB1bWEgZnVuw6fDo28gcGFyYSBmYWNpbGl0YXIuCkNyZWF0ZSBPciBSZXBsYWNlIEZ1bmN0aW9uIEZuX0NvbnZlcnRfQ2hhcl9XaXRoX1plcm8oUG51bWJlciBJbiBOdW1iZXIpIFJldHVybiBWYXJjaGFyMiBJcwotLSBDcmVhdGU6IGZlcm5hbmRvIGZyYW5xdWluaSAnY2FwaW4nCi0tIFByb2JsZW06IGJ1ZyBjb252ZXJ0IGRhdGF0eXBlIG51bWJlciBvciBmbG9hdCB0byBjaGFyIChmdW5jdGlvbiBjYXN0IG9yIHRvX2NoYXIpCi0tIFNhbXBsZTogMCwwLi4gb3IgLTAsMC4uCi0tIERhdGU6IDI5LzA5LzIwMTEKV3Jlc3VsdCBWYXJjaGFyMigyMCk7CkJlZ2luClNlbGVjdCBDYXNlCldoZW4gU3Vic3RyKENhc3QoUG51bWJlciBBcyBWYXJjaGFyMigyMCkpLCAxLCAxKSA9ICcsJyBUaGVuCicwJyB8fCBDYXN0KFBudW1iZXIgQXMgVmFyY2hhcjIoMjApKQpXaGVuIFN1YnN0cihDYXN0KFBudW1iZXIgQXMgVmFyY2hhcjIoMjApKSwgMSwgMikgPSAnLSwnIFRoZW4KJy0wJyB8fCBTdWJzdHIoQ2FzdChQbnVtYmVyIEFzIFZhcmNoYXIyKDIwKSksIDIsIDIwKQpFbHNlCkNhc3QoUG51bWJlciBBcyBWYXJjaGFyMigyMCkpCkVuZApJbnRvIFdyZXN1bHQKRnJvbSBEdWFsOwpSZXR1cm4oV3Jlc3VsdCk7CkV4Y2VwdGlvbgpXaGVuIE90aGVycyBUaGVuClJldHVybiBOdWxsOwpFbmQgRm5fQ29udmVydF9DaGFyX1dpdGhfWmVybzsKClNlbGVjdCBWYWxvciwgRm5fQ29udmVydF9DaGFyX1dpdGhfWmVybyhWYWxvcikgQXMgVmFsb3JfQ2hhcgpGcm9tIFRlc3RlOw==” hover_enabled=”0″]4oCUIENyaWFkYSB1bWEgZnVuw6fDo28gcGFyYSBmYWNpbGl0YXIuCkNyZWF0ZSBPciBSZXBsYWNlIEZ1bmN0aW9uIEZuX0NvbnZlcnRfQ2hhcl9XaXRoX1plcm8oUG51bWJlciBJbiBOdW1iZXIpIFJldHVybiBWYXJjaGFyMiBJcwotLSBDcmVhdGU6IGZlcm5hbmRvIGZyYW5xdWluaSAnY2FwaW4nCi0tIFByb2JsZW06IGJ1ZyBjb252ZXJ0IGRhdGF0eXBlIG51bWJlciBvciBmbG9hdCB0byBjaGFyIChmdW5jdGlvbiBjYXN0IG9yIHRvX2NoYXIpCi0tIFNhbXBsZTogMCwwLi4gb3IgLTAsMC4uCi0tIERhdGU6IDI5LzA5LzIwMTEKV3Jlc3VsdCBWYXJjaGFyMigyMCk7CkJlZ2luClNlbGVjdCBDYXNlCldoZW4gU3Vic3RyKENhc3QoUG51bWJlciBBcyBWYXJjaGFyMigyMCkpLCAxLCAxKSA9ICcsJyBUaGVuCicwJyB8fCBDYXN0KFBudW1iZXIgQXMgVmFyY2hhcjIoMjApKQpXaGVuIFN1YnN0cihDYXN0KFBudW1iZXIgQXMgVmFyY2hhcjIoMjApKSwgMSwgMikgPSAnLSwnIFRoZW4KJy0wJyB8fCBTdWJzdHIoQ2FzdChQbnVtYmVyIEFzIFZhcmNoYXIyKDIwKSksIDIsIDIwKQpFbHNlCkNhc3QoUG51bWJlciBBcyBWYXJjaGFyMigyMCkpCkVuZApJbnRvIFdyZXN1bHQKRnJvbSBEdWFsOwpSZXR1cm4oV3Jlc3VsdCk7CkV4Y2VwdGlvbgpXaGVuIE90aGVycyBUaGVuClJldHVybiBOdWxsOwpFbmQgRm5fQ29udmVydF9DaGFyX1dpdGhfWmVybzsKClNlbGVjdCBWYWxvciwgRm5fQ29udmVydF9DaGFyX1dpdGhfWmVybyhWYWxvcikgQXMgVmFsb3JfQ2hhcgpGcm9tIFRlc3RlOw==[/et_pb_dmb_code_snippet]
Att,
capin
Um comentário, a figura 3 está errada, foi do exemplo anterior.
Pode testar que funciona.
Att,
capin
Muito bom, capin!
Trabalho numa empresa de Rastreamento de veículos, e óbviamente usamos MUITO latitude e longitude. Será muito útil!
Abraço
Valeu Milton!
abraços
capin
Caro Capin
Aqui fica a solução mais simplificada.
select valor
, trim(trailing ‘0’ from to_char(valor,’990d9999999999999999′)) Valor_Char
from Teste;
Abraço.
Carlos,
valeu ai, como eu coloquei no LikendIn é com isso que crescemos!
Obrigado pela ajuda, abraços.
capin
Mas isso não acontece pelo fato de você estar usando vírgula como separador de decimais (padrão brasileiro) ao invés de ponto (padrão americano)? Ou você consegue configurar esse tipo de internacionalização no seu banco de dados?
Não seria melhor a sua aplicação tratar esses dados e passar para a camada de persistência (banco de dados no caso) os dados já normalizados? (não quero começar uma guerra com essa pergunta, apenas levantando a questão =)
E se a questão for o separador decimal mesmo, acho que você consegue simplificar a sua função apenas trocando vírgula por ponto e deixando o resto por conta do banco, não!?
Releve se os questionamentos forem muito básicos ou completamente fora do contexto, afinal estou longe de ser especialista em banco de dados e muito menos em Oracle.
Forte abraço capin e parabéns pelo blog! -vinicius
Ae don, tudo bem e obrigado.
Acontece porque até aonde vi é um BUG, mesmo com ponto ou virgula como separador, sim, isso é configurável na instalação do banco.
Até poderia, mas isso é um processo hoje que roda em JOB no banco de dados, logo não tem interação, a aplicação nesse caso é a própria rotina em PL/SQL.
Os questionamentos fazem que se reflita, independente do ‘nível’, achei todos bem bons, somente reitero que o problema me parece um bug mesmo, pois tem funções do Oracle que convertem diretamente, mas falham exatamente quando tem -0,XXXX(ou ponto) e/ou 0,XXXXX(ou ponto).
Valeu pela visita e pelos comentários meu amigo.
Abraços ai don! 😉
Estou sem oracle para testar, mas lendo a documentação oficial acredito que algo assim resolva o problema:
SELECT
TO_CHAR( -0,05 , ‘MI999G999G990D00’ , ‘NLS_NUMERIC_CHARACTERS = ”,.” ‘)
FROM DUAL;
http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions181.htm
Eu testei e o SELECT ai nem roda, faltam argumentos, tenta ver se consegue rodar e postar o resultado.
Att,
capin
ps: ou então um desses jeitos (tb não pude testar, mas acho que resolvem)…
— executar isso antes dos outros statements
alter session set nls_language=’portuguese’;
— ou então durante a chamada ao to_char:
select to_char( 0.05 , ‘nls_language=portuguese’) from dual
Também não execute nem a instrução SELECT.
Valida ai e envia novamente, se quiser.
Att,
capin