为什么 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
在 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