Consulta Oracle simples: literal não corresponde à string de formato
-
28-10-2019 - |
Pergunta
Quero executar uma função simples no Oracle.A assinatura é definida da seguinte forma:
CREATE OR REPLACE FUNCTION NewCaseListForValidation
(
p_fromDate in DATE,
p_toDate in DATE,
p_rowCount in INT
)
RETURN
SYS_REFCURSOR
IS
return_value SYS_REFCURSOR;
...
Devo ser capaz de executá-lo com:
var rc refcursor
exec :rc := newcaselistforvalidation('2010-01-01','2011-01-01',100);
print :rc
Mas ao digitar "newcaselistforvalidation ('2010-01-01', '2011-01-01', 100)", obtenho:
ERROR at line 1:
ORA-01861: literal does not match format string
ORA-06512: at line 1
Pesquisei um pouco no Google e parece que não consigo descobrir como digitar a data no formato correto.Alguém pode me ajudar?
Solução
Consulte NLS_PARAMETERS no Oracle - você poderá ver em qual formato seu banco de dados está aceitando datas.
Normalmente, porém, eu uso a função to_date ():
to_date('01-01-2011','DD-MM-YYYY');
No Reino Unido para inserir minhas datas.
Outras dicas
Uma alternativa para a função to_date () é usar o formato padrão ANSI para literais DATE ou TIMESTAMP:
DATE '2010-01-31' TIMESTAMP '2010-01-31 21:22:23'
A data e a hora são sempre especificadas usando as regras ISO (AAAA-MM-DD e formato de 24 horas para a hora)
Isso também funciona em muitos outros DBMS (em conformidade com o padrão).
É melhor não confiar em um valor específico nas configurações de NLS_PARAMETERS , porque isso fará com que sua função interrompa no ambiente com outro NLS_DATE_FORMAT .
Eu especificaria explicitamente a formatação de data em sua função, conforme sugerido na resposta acima
exec :rc := newcaselistforvalidation(to_date('2010-01-01','YYYY-MM-DD'),to_date('2011-01-01','YYYY-MM-DD'),100);
INSERT INTO tblDate (dateStart) Valores ('20 -JUN-2013 '); Se você alterar o número inteiro do mês em uma string 'DD-MON-YYYY', funcionará como uma string de dados válida sem ter que precedê-la com o identificador DATE.