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

Я немного погуглил, и кажется, я не могу понять, как ввести дату в правильном формате. Может кто-нибудь помочь мне?


person Kasper Hansen    schedule 03.02.2011    source источник


Ответы (4)


Запросите NLS_PARAMETERS в Oracle — тогда вы сможете увидеть, в каком формате ваша БД принимает даты.

Однако обычно я использую функцию to_date():

to_date('01-01-2011','DD-MM-YYYY');

В Великобритании, чтобы ввести мои даты.

person diagonalbatman    schedule 03.02.2011

Альтернативой функции to_date() является использование стандартного формата ANSI для литералов DATE или TIMESTAMP:

DATE '2010-01-31'
TIMESTAMP '2010-01-31 21:22:23'

Дата и время всегда указываются с использованием правил ISO (ГГГГ-ММ-ДД и 24-часовой формат времени).

Это также работает во многих других (стандартных) СУБД.

person a_horse_with_no_name    schedule 03.02.2011

Лучше не полагаться на конкретное значение в настройках NLS_PARAMETERS, потому что это приведет к тому, что ваша функция разорвется в окружении с другим NLS_DATE_FORMAT.

Я бы явно указал форматирование даты в вашей функции, как это было предложено в ответе выше.

exec :rc := newcaselistforvalidation(to_date('2010-01-01','YYYY-MM-DD'),to_date('2011-01-01','YYYY-MM-DD'),100);
person dovka    schedule 25.05.2011

ВСТАВЬТЕ В значения tblDate (dateStart) ("20-JUN-2013"); Если вы измените целое число месяца в строку, 'DD-MON-YYYY' будет работать как допустимая строка данных без необходимости предварять ее идентификатором DATE.

person Jared    schedule 18.06.2013