2015-08-01 3 views
2

Это, кажется, глупый вопрос, однако я все равно попробую удачу здесь. См ниже блока кода, вы увидите NEXT_DAY принимает как 1 и «воскресенье» в качестве аргумента в ВЫБРАТЬ заявление, но в DBMS_OUTPUT.PUT_LINE только «воскресенье», и бросает ошибку 1 - «ORA-01846: недействительный день недели ».NEXT_DAY в DBMS_OUTPUT.PUT_LINE

Если я поставил «воскресенье», он работает. Что-нибудь мне здесь не хватает?

declare 

    wday varchar(10); 

begin 

    select to_char(next_day(sysdate,1),'Day') into wday from dual; -- <== working with 1 
    dbms_output.put_line (wday); 

    select to_char(next_day(sysdate,'Sunday'),'Day') into wday from dual; -- <== working with 'Sunday' 
    dbms_output.put_line (wday); 

    --dbms_output.put_line (to_char(next_day(sysdate,1),'Day')); -- <== not working with 1 

    dbms_output.put_line (to_char(next_day(sysdate,'Sunday'),'Day')); -- <== working with 'Sunday' 

end; 

/

PS: Моя конфигурация NLS: 1 = воскресенье

+0

Что такое «NLS_DATE_LANGUAGE»? –

+0

Все по умолчанию: Америка/Америка. – Vishal

+0

Попробуйте простое изменение 'declare wday varchar2 (20)'. Это сработало для меня. Без этого я получил «ORA-06502: PL/SQL: числовая или значащая ошибка: слишком строчный буфер символьной строки». Мой «NLS_DATE_LANGUAGE» установлен в «POLISH», поэтому, например, «MONDAY» - «PONIEDZIAŁEK». Может быть, это проблема или какая-то подсказка? –

ответ

2

Эта ошибка возникает, когда количество интерпретируется как строка. Вы можете воспроизвести его:

SELECT to_char(next_day(sysdate, '3'), 'Day') FROM DUAL; 

Спасибо @Ben за указание, что это происходит потому, что число получает неявно преобразуется в PL/SQL и что оно не поддерживается.

Одним из способов решения проблемы было бы написать собственную функцию number_to_day с целью повышения удобочитаемости и возможности сделать ее многоязычной позже.

Смежные вопросы