将日期传递给Oracle SQL中的存储过程错误:ORA-01858

问题描述 投票:0回答:1

我知道这个问题以前已经回答过,并且我已经尝试了他们给出的解决方案,但是没有成功。

我的存储过程如下(我已删除了不必要的部分):

CREATE OR REPLACE PROCEDURE get_days(dt date)
IS
  given_date DATE := TO_DATE('dt', 'DD-MON-YYYY');
BEGIN
  get_day := RTRIM(TO_CHAR(dt1, 'DAY'));
  DBMS_OUTPUT.PUT_LINE ('The day of the given date is '||get_day||);
  DBMS_OUTPUT.PUT_LINE ('Execution  done successfully.');
END get_days;

我在将日期传递到过程get_days时遇到麻烦。我已经尝试过以下方式:

BEGIN
  --Below I have listed all ways I have tried 
  get_days('12/12/12');
  get_days('12-12-12');
  get_days(date '2012-12-12');  
  get_days(TO_DATE( '01/01/2018', 'MM/DD/YYYY' ));
END;

我不知道出什么问题了,但是我收到了此错误-ORA-01858: a non-numeric character was found where a numeric was expected。我在网上搜索了类似的错误,但没有帮助。我正在使用Oracle Database 11g Express版。我的代码中可能存在一些小错误,但我没有得到它的意思。

非常感谢您的帮助!

sql stored-procedures oracle11g
1个回答
0
投票

错误的直接原因是您有

  given_date DATE := TO_DATE('dt', 'DD-MON-YYYY');

代替

  given_date DATE := TO_DATE(dt, 'DD-MON-YYYY');

在您的版本中,您尝试将字符串文字'dt'转换为状态;该文字与您的dt参数无关。

但是,这仍然是错误的,因为dt已经被声明为日期数据类型。如果这样做,那么您实际上就是在做:

  given_date DATE := TO_DATE(TO_CHAR(dt), 'DD-MON-YYYY');

它将使用您当前的会话NLS_DATE_FORMAT将日期转换为字符串;如果它也不是“ DD-MON-YYYY”(或者距离Oracle还不够的话),您仍然会收到错误消息,或者更糟糕的是,转换错误和结果无效,您可能不会注意到。

因此,请删除该多余且危险的转换:

CREATE OR REPLACE PROCEDURE get_days(dt date)
IS
BEGIN
  DBMS_OUTPUT.PUT_LINE ('The day of the given date is ' || TO_CHAR(dt, 'FMDAY') || '.');
  DBMS_OUTPUT.PUT_LINE ('Execution  done successfully.');
END get_days;
/

您应该始终传递日期,而不是字符串:

set serveroutput on;

BEGIN
  get_days(date '2012-12-12');  
  get_days(TO_DATE( '01/01/2018', 'MM/DD/YYYY' ));
END;
/

The day of the given date is WEDNESDAY.
Execution  done successfully.
The day of the given date is MONDAY.
Execution  done successfully.


PL/SQL procedure successfully completed.
© www.soinside.com 2019 - 2024. All rights reserved.