2

这似乎是一个愚蠢的问题,但无论如何我都会在这里碰碰运气。请参考下面的代码块,您会看到NEXT_DAY在SELECT语句中同时接受 1 和 'Sunday' 作为参数,但在DBMS_OUTPUT.PUT_LINE中仅接受 'Sunday',并为 1 - “ORA-01846: not a valid day of the星期”。

如果我输入“星期日”,它会起作用。我在这里缺少什么吗?

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 = 星期日

4

1 回答 1

2

当数字被解释为字符串时会发生此错误。您可以通过以下方式重现它:

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

感谢@Ben指出,这是因为数字被 PL/SQL 隐式转换并且不受支持。

一种解决方法是编写自己的number_to_day函数,以提高可读性和以后使其成为多语言的可能性。

于 2015-08-02T10:45:15.767 回答