RES: [oracle_br] Re: ORA-01861: literal does not match format string

2015-02-04 Por tôpico 'Ednilson Silva' ednilson.si...@jbs.com.br [oracle_br]
Chiappa,

Muito obrigado, pela explicação.

 

Grato,

Ednilson

 

De: oracle_br@yahoogrupos.com.br [mailto:oracle_br@yahoogrupos.com.br] 
Enviada em: quarta-feira, 4 de fevereiro de 2015 10:35
Para: oracle_br@yahoogrupos.com.br
Assunto: [oracle_br] Re: ORA-01861: literal does not match format string

 

  

Bem, a msg de erro é Extrememante clara, indicando que vc está tendo mismatch 
de NLS : o que deve estar acontecendo aí é que : como creio que vc sabe, quando 
vc cria um job, ele assume os settings de NLS da sessão (veja exemplo abaixo, 
coluna NLS_ENV na query da DBA_JOBS) , e pelo jeito vc tem na rotina chamada 
pelo job algum tipo de conversão implícita (de string para data ou número, 
provavelmente)  ** OU ** tem algum setting NLS (de linguagem, calendário, 
formato de data, whatever)...
 
 Sendo isso, aí se explica o que vc relata : quando vc conecta via algum 
programa-cliente e roda manualmente a rotina, o NLS da sessão está setado como 
o job espera, aí funciona, MAS quando vc deixa o JOB rodar/criar sozinho a 
sessão logicamente ele não conecta via programa algum, e nem abre sessão/prompt 
de comando no ambiente então ele usa os defaults NLS do database, que são 
Diferentes do esperado...
 
 Primeiro, uma demonstração de que o JOB assume o NLS da sessão, e não o do 
database :
 
 SYSTEM@O11201:SQLselect * from nls_database_parameters;

PARAMETER  VALUE
-- 
NLS_LANGUAGE   AMERICAN
NLS_TERRITORY  AMERICA
NLS_CURRENCY   $
NLS_ISO_CURRENCY   AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET   WE8MSWIN1252
NLS_CALENDAR   GREGORIAN
NLS_DATE_FORMATDD-MON-RR
NLS_DATE_LANGUAGE  AMERICAN
NLS_SORT   BINARY
NLS_TIME_FORMATHH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT   DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMATDD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY  $
NLS_COMP   BINARY
NLS_LENGTH_SEMANTICS   BYTE
NLS_NCHAR_CONV_EXCPFALSE
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_RDBMS_VERSION  11.2.0.1.0

20 linhas selecionadas.

SYSTEM@O11201:SQLselect * from nls_session_parameters;

PARAMETER  VALUE
-- 
NLS_LANGUAGE   BRAZILIAN PORTUGUESE
NLS_TERRITORY  BRAZIL
NLS_CURRENCY   R$
NLS_ISO_CURRENCY   BRAZIL
NLS_NUMERIC_CHARACTERS ,.
NLS_CALENDAR   GREGORIAN
NLS_DATE_FORMATDD/MM/RR
NLS_DATE_LANGUAGE  BRAZILIAN PORTUGUESE
NLS_SORT   WEST_EUROPEAN
NLS_TIME_FORMATHH24:MI:SSXFF
NLS_TIMESTAMP_FORMAT   DD/MM/RR HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMATDD/MM/RR HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY  Cr$
NLS_COMP   BINARY
NLS_LENGTH_SEMANTICS   BYTE
NLS_NCHAR_CONV_EXCPFALSE

17 linhas selecionadas.

SYSTEM:@O11201:SQLed
Gravou file afiedt.buf

  1  BEGIN
  2  dbms_job.submit(
  3:jobno, 'BEGIN null; END;', sysdate, 'trunc(sysdate+5/1440,''MI'')', 
TRUE);
  4  commit;
  5* END;
SYSTEM:@O11201:SQL/

Procedimento PL/SQL concluído com sucesso.

select JOB, LOG_USER,BROKEN,INTERVAL,FAILURES,WHAT,NLS_ENV from dba_jobs where 
log_user='SYSTEM';

JOB LOG_USER BROKEN INTERVAL FAILURES WHAT   
NLS_ENV 

  
---  -- -- -- -- 
-
 
 65 SYSTEM   N  trunc(sysdate+5/1440,'MI')  0 BEGIN null; END;   
NLS_LANGUAGE='BRAZILIAN PORTUGUESE' NLS_TERRITORY='BRAZIL' NLS_CURRENCY='R$' 
NLS_ISO_CURRENCY='BRAZIL' NLS_NUMERIC_CHARACTERS=',.' 
NLS_DATE_FORMAT='dd/mm/ hh24:mi:ss' NLS_DATE_LANGUAGE='BRAZILIAN 
PORTUGUESE' NLS_SORT='WEST_EUROPEAN'   


== Até seria possível em tese se alterar o NLS do database para bater 
exatamente com o assumido pelo JOB, mas imho isso é uma porquice : a solução 
CORRETA é programação DEFENSIVA, que implica em NUNCA, JAMAIS, em TEMPO ALGUM, 
confiar nos defaults de NLS - LOCALIZE na tal rotina onde que vc faz conversão 
(INCLUSIVE implícita, via SQL!!) e/ou usa built-ins de data/hora/TZdatabase ou 
de sessão e EXPLICITAMENTE indique

[oracle_br] Re: ORA-01861: literal does not match format string

2015-02-04 Por tôpico jlchia...@yahoo.com.br [oracle_br]
Bem, a msg de erro é Extrememante clara, indicando que vc está tendo mismatch 
de NLS : o que deve estar acontecendo aí é que : como creio que vc sabe, quando 
vc cria um job, ele assume os settings de NLS da sessão (veja exemplo abaixo, 
coluna NLS_ENV na query da DBA_JOBS) , e pelo jeito vc tem na rotina chamada 
pelo job algum tipo de conversão implícita (de string para data ou número, 
provavelmente)  ** OU ** tem algum setting NLS (de linguagem, calendário, 
formato de data, whatever)...
 
 Sendo isso, aí se explica o que vc relata : quando vc conecta via algum 
programa-cliente e roda manualmente a rotina, o NLS da sessão está setado como 
o job espera, aí funciona, MAS quando vc deixa o JOB rodar/criar sozinho a 
sessão logicamente ele não conecta via programa algum, e nem abre sessão/prompt 
de comando no ambiente então ele usa os defaults NLS do database, que são 
Diferentes do esperado...
 
 Primeiro, uma demonstração de que o JOB assume o NLS da sessão, e não o do 
database :
 
 SYSTEM@O11201:SQLselect * from nls_database_parameters;

PARAMETER  VALUE
-- 
NLS_LANGUAGE   AMERICAN
NLS_TERRITORY  AMERICA
NLS_CURRENCY   $
NLS_ISO_CURRENCY   AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET   WE8MSWIN1252
NLS_CALENDAR   GREGORIAN
NLS_DATE_FORMATDD-MON-RR
NLS_DATE_LANGUAGE  AMERICAN
NLS_SORT   BINARY
NLS_TIME_FORMATHH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT   DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMATDD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY  $
NLS_COMP   BINARY
NLS_LENGTH_SEMANTICS   BYTE
NLS_NCHAR_CONV_EXCPFALSE
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_RDBMS_VERSION  11.2.0.1.0

20 linhas selecionadas.

SYSTEM@O11201:SQLselect * from nls_session_parameters;

PARAMETER  VALUE
-- 
NLS_LANGUAGE   BRAZILIAN PORTUGUESE
NLS_TERRITORY  BRAZIL
NLS_CURRENCY   R$
NLS_ISO_CURRENCY   BRAZIL
NLS_NUMERIC_CHARACTERS ,.
NLS_CALENDAR   GREGORIAN
NLS_DATE_FORMATDD/MM/RR
NLS_DATE_LANGUAGE  BRAZILIAN PORTUGUESE
NLS_SORT   WEST_EUROPEAN
NLS_TIME_FORMATHH24:MI:SSXFF
NLS_TIMESTAMP_FORMAT   DD/MM/RR HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMATDD/MM/RR HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY  Cr$
NLS_COMP   BINARY
NLS_LENGTH_SEMANTICS   BYTE
NLS_NCHAR_CONV_EXCPFALSE

17 linhas selecionadas.

SYSTEM:@O11201:SQLed
Gravou file afiedt.buf

  1  BEGIN
  2  dbms_job.submit(
  3:jobno, 'BEGIN null; END;', sysdate, 'trunc(sysdate+5/1440,''MI'')', 
TRUE);
  4  commit;
  5* END;
SYSTEM:@O11201:SQL/

Procedimento PL/SQL concluído com sucesso.

select JOB, LOG_USER,BROKEN,INTERVAL,FAILURES,WHAT,NLS_ENV from dba_jobs where 
log_user='SYSTEM';

JOB LOG_USER BROKEN INTERVAL FAILURES WHAT   
NLS_ENV 

  
---  -- -- -- -- 
-
 
 65 SYSTEM   N  trunc(sysdate+5/1440,'MI')  0 BEGIN null; END;   
NLS_LANGUAGE='BRAZILIAN PORTUGUESE' NLS_TERRITORY='BRAZIL' NLS_CURRENCY='R$' 
NLS_ISO_CURRENCY='BRAZIL' NLS_NUMERIC_CHARACTERS=',.' 
NLS_DATE_FORMAT='dd/mm/ hh24:mi:ss' NLS_DATE_LANGUAGE='BRAZILIAN 
PORTUGUESE' NLS_SORT='WEST_EUROPEAN'   


== Até seria possível em tese se alterar o NLS do database para bater 
exatamente com o assumido pelo JOB, mas imho isso é uma porquice : a solução 
CORRETA é programação DEFENSIVA, que implica em NUNCA, JAMAIS, em TEMPO ALGUM, 
confiar nos defaults de NLS - LOCALIZE na tal rotina onde que vc faz conversão 
(INCLUSIVE implícita, via SQL!!) e/ou usa built-ins de data/hora/TZdatabase ou 
de sessão e EXPLICITAMENTE indique os formatos/datatype/linguagem/setting NLS 
que vc deseja...

  []s
  
Chiappa