【问题标题】:why oracle user defined function shows error in Oracle Sql Developer 4.0.3.16为什么 oracle 用户定义函数在 Oracle Sql Developer 4.0.3.16 中显示错误
【发布时间】:2015-04-29 06:47:59
【问题描述】:

在 Oracle SQL Developer 版本 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;
/

【问题讨论】:

  • 好的,那么错误是什么?
  • 我无法在版本 3.2.20.10 中重现您的错误。而且我认为这与 SQL Developer 没有任何关系。有一件事需要注意,您正在将 string 分配给 DATE 数据类型。 Oracle 会进行隐式数据类型转换v_datevalue被声明为DATE'01-APR-2015'是一个字符串
  • @vesan Syntex 错误,预期:varchar
  • @Lalit 在 Oracle Sql Developer 4.0.3.16 上尝试,它已编译但为什么它在工作表中标记为错误
  • 如果两个 SQL Developer 版本存在差异,我会检查日期格式和 nls_language 首选项。从VARCHAR2DATE 的隐式类型转换很可能与这种偏好有关。 最佳选择当然是使用显式类型转换,即v_datevalue := TO_DATE ('01-APR-2015','DD-MON-YYYY');

标签: sql oracle type-conversion date-formatting


【解决方案1】:
v_datevalue date;
begin
v_datevalue := '01-APR-2015';

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

当且仅当 特定于语言环境的 NLS_DATE_FORMAT 与您在文字中使用的完全相同时,您可能很幸运地看到了没有错误的隐式转换。

它已编译但为什么它在工作表中标记为错误

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

根本原因

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>

【讨论】:

  • "但是执行时会报错。"我执行了,它也给出了结果。但它仍然将下划线标记为错误。我只是想知道原因。
  • 下划线 什么下划线?你能展示我展示的方式吗?请编辑您的问题并粘贴输出。
  • 我想先附上屏幕截图,但我是这个论坛的新成员,你知道 10 代表。点。
  • 不需要截图,作为脚本执行,复制粘贴输出为文本。
  • 查看屏幕截图
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-23
  • 1970-01-01
  • 1970-01-01
  • 2014-12-03
  • 2017-02-03
  • 1970-01-01
相关资源
最近更新 更多