Простой запрос 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.

Другие вопросы по тегам