为什么 Oracle 用户定义函数在 Oracle Sql Developer 4.0.3.16 中显示错误

why oracle user defined function shows error in Oracle Sql Developer 4.0.3.16

在 Oracle SQL Developer Version 1.5.4 中,相同的代码不会给出任何错误。 我目前连接到 oracle 11g 数据库服务器。

create or replace function getdate
RETURN VARCHAR2 IS
v_datevalue date;
begin
v_datevalue := '01-APR-2015';
return (cast(v_datevalue as varchar2));
end;
/

v_datevalue date;
begin
v_datevalue := '01-APR-2015';

这是您的代码中的错误。永远不要依赖 隐式数据类型 转换。您的问题不在于该工具,而是您将 STRING 分配给 DATE 数据类型这一事实。

当且仅当 locale-specific NLS_DATE_FORMAT 与您使用的完全相同时,您可能很幸运地看到隐式转换没有错误在字面上。

it compiled but why it mark as an error in worksheet

错误将出现在 运行 时间 而不是 编译时间 数据类型转换发生在运行时间而不是编译时间。所以,你的函数会编译成功,但是,当你执行它时会出错。

根本原因

SQL> ALTER SESSION SET NLS_DATE_FORMAT='MM/DD/YYYY';

Session altered.

SQL>
SQL> CREATE OR REPLACE
  2    FUNCTION GETDATE
  3      RETURN VARCHAR2
  4    IS
  5      v_datevalue DATE;
  6    BEGIN
  7      v_datevalue := '01-APR-2015';
  8      RETURN (CAST(v_datevalue AS VARCHAR2));
  9    END;
 10    /

Function created.

SQL>
SQL> SELECT GETDATE FROM DUAL;
SELECT GETDATE FROM DUAL
       *
ERROR at line 1:
ORA-01858: a non-numeric character was found where a numeric was expected
ORA-06512: at "LALIT.GETDATE", line 6


SQL>

所以,发生了什么事?更改 NLS_DATE_FORMAT 清楚地显示了代码中的错误。

隐式日期转换

SQL> ALTER SESSION SET NLS_DATE_FORMAT='DD-MON-YYYY';

Session altered.

SQL>
SQL> SELECT GETDATE FROM DUAL;

GETDATE
-----------------------------------------------------
01-APR-2015

SQL>

现在,由于 Oracle 已成功完成隐式数据类型转换,因此代码可以使用与文字相同的格式给出输出。

修复

始终使用 TO_DATE 将文字显式转换为 DATE。永远不要依赖 隐式转换 TO_DATE 个人 SQL 语句级别 ,将 覆盖客户端工具的 NLS 设置.

SQL> ALTER SESSION SET NLS_DATE_FORMAT='MM/DD/YYYY';

Session altered.

SQL>
SQL> CREATE OR REPLACE
  2    FUNCTION GETDATE
  3      RETURN VARCHAR2
  4    IS
  5      v_datevalue DATE;
  6    BEGIN
  7      v_datevalue := TO_DATE('01-APR-2015','DD-MON-YYYY');
  8      RETURN (CAST(v_datevalue AS VARCHAR2));
  9    END;
 10    /

Function created.

SQL>
SQL> SELECT GETDATE FROM DUAL;

GETDATE
-------------------------------------------------------------
04/01/2015

SQL>

发生错误 ORA-01858: 在需要数字的位置发现 non-numeric 字符 enter image description here