Простой запрос Oracle: литерал не соответствует строке формата
Я хочу выполнить простую функцию в Oracle. Подпись определяется следующим образом:
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;
...
Я должен быть в состоянии выполнить это с:
var rc refcursor
exec :rc := newcaselistforvalidation('2010-01-01','2011-01-01',100);
print :rc
Но при вводе "newcaselistforvalidation(" 2010-01-01 "," 2011-01-01 ", 100)" я получаю:
ERROR at line 1:
ORA-01861: literal does not match format string
ORA-06512: at line 1
Я немного погуглил и, кажется, не могу понять, чтобы набрать дату в правильном формате. Может кто-нибудь мне помочь?
4 ответа
Запросите NLS_PARAMETERS в Oracle- тогда вы сможете увидеть, в каком формате ваша БД принимает даты.
Обычно, однако, я использую функцию to_date():
to_date('01-01-2011','DD-MM-YYYY');
В Великобритании для ввода моих дат.
Альтернативой функции to_date() является использование стандартного формата ANSI для литералов DATE или TIMESTAMP:
ДАТА '2010-01-31' TIMESTAMP '2010-01-31 21:22:23'
Дата и время всегда указываются с использованием правил ISO (ГГГГ-ММ-ДД и 24-часовой формат для времени)
Это также работает на многих других (стандартных) СУБД.
Лучше не полагаться на конкретное значение в настройках NLS_PARAMETERS, потому что это приведет к разрыву вашей функции в env с другим NLS_DATE_FORMAT.
Я бы явно указал форматирование даты в вашей функции, как предложено в ответе выше
exec :rc := newcaselistforvalidation(to_date('2010-01-01','YYYY-MM-DD'),to_date('2011-01-01','YYYY-MM-DD'),100);
INSERT INTO tblDate (dateStart) Значения ('20-июнь-2013'); Если вы замените целое число месяца на строку, "DD-MON-YYYY" будет действительной строкой данных, не вводя перед ней идентификатор DATE.