Blz, Angelo ? Sim, já vi N vezes casos de erros de formato de datas : se eu 
ganhasse 1 real a cada vez que vejo isso, hoje estria mega-milionário....
 O ponto que pega normalmente é que os asn... digo, os duhvelopers, Não 
Entendem que no RDBMS Oracle, ao CONTRÁRIO de outros SGBDs, rigorosamente Não 
Existe o conceito de formato de data próprio e obrigatório do banco : aquilo 
que vc informa no parâmetro NLS_DATE_FORMAT do database é simplesmente um 
DEFAULT, que só será usado SE e APENAS SE o client NÂO INFORMAR COISA ALGUMA, 
okdoc ? basta o client informar (até por default dele, digamos) um formato 
diferente do indicado no banco e CABUM, todo tipo de erro de format pode 
acontecer...
 Como evito isso ?? EXTREMAMENTE SIMPLES, vc INFORMA O FORMATO em todos os seus 
SQLs, tipo :
 
 SELECT colunas FROM tabela WHERE colunadata=TO_DATE('01/12/2018', 'DD/MM/YYYY')
 
 e NUNCA, DE JEITO NENHUM, fazer a EXTREMA ABOBRINHA de programar no aplicativo 
:
 
 SELECT colunas FROM tabela WHERE colunadata='01/12/2018'
 
 Okdoc ?? Simples assim... E INCLUSIVE, usando TO_DATE vc evita qquer chance de 
conversões de datatypes implícitas fazendo o índice não funcionar : 
https://use-the-index-luke.com/sql/where-clause/obfuscation/dates é um caso mas 
eu IMAGINARIA que TODO MUNDO já sabe disso a esta altura...
 
 O que fazer então se a tua Aplicação NÃO USA programação DEFENSIVA, e tem essa 
FRAQUEZA ABSURDA de ser dependente de fatores externos ao database ??? A melhor 
coisa seria acionar o Desenvolvedor e exigir correção do BUG (sim, imho isso é 
um BUG LÓGICO, causado por total Inadequação aos conceitos do RDBMS Oracle), 
mas enquanto isso não vem há alguns WORK-AROUNDs que vc pode usar :

a. não importa se a app roda na forma de um serviço windows, de uma página web 
ou seja do que for : NECESSARIAMENTE ela VAi conectar no banco de dados, certo 
? Em tese então é possível vc escrever uma TRIGGER que dispare quando alguém 
loga no banco de dados e a trigger faz um ALTER SESSION SET 
NLS_DATE_FORMAT='formatodedatadesejado' : vide 
https://easyoradba.com/2013/02/14/change-nls_date_format-via-logon-triggers/

ou

b. sim, em condições normais o software client Oracle ** RESPEITA ** as 
variáveis de ambiente que definem formatos de data, números, e várias outras 
coisas, variáveis essas que podem ser definidas OU no prompt de comando OU no 
Registry do Windows : porém no caso, como a app roda na forma de um serviço 
Windows, logicamente o serviço roda no startup do Windows, ANTES do registry 
ser aberto via de regra...
 Assim, ao invés do service Windows rodar diretamente o .EXE da aplicação, 
TALVEZ vc possa o fazer rodar um SHELL SCRIPT/.BAT , que seta as variáveis 
antes de chamar o executável : 
https://stackoverflow.com/questions/415409/run-batch-file-as-a-windows-service 
tem um exmeplo de como rodar um .BAT via service Windows...
 Até pode haver a chance de o .EXE que roda como service ter sido programado 
pra 'esperar' o Registry ser aberto, aí seria simplesmente um caso de setar a 
NLS_DATA_FORMAT na porção adequada do Registry : mas APENAS O FORNECEDOR (se é 
que ele sabe o que é um registry :^) é que pode confirmar ou negar essa 
possibilidade...
 
==>> MAS REPITO : o Certo, o Apropriado, o Recomendado é você Exigir que o 
fornecedor escreva os SQLs da Aplicação ** direito **, não dependendo NEM de 
formato de datas NEM de format de número NEM de linguagem....

[]s

  Chiappa

Responder a