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