我知道这个问题以前已经回答过,并且我已经尝试了他们给出的解决方案,但是没有成功。
我的存储过程如下(我已删除了不必要的部分):
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版。我的代码中可能存在一些小错误,但我没有得到它的意思。
非常感谢您的帮助!
错误的直接原因是您有
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.