【发布时间】:2020-09-17 08:41:33
【问题描述】:
我知道这个问题之前已经回答过了,我已经尝试了其中给出的解决方案,但没有成功。
我有一个如下的存储过程(我已经删除了非必要部分):
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 数据库 11g 快捷版。我的代码中可能有一些小错误,但我不明白它是什么。
非常感谢任何帮助!
【问题讨论】:
-
在 TO_DATE('dt', 'DD-MON-YYYY');
'dt'是一个字符串。但是为什么要将 DATE 传递给 TO_DATE? -
dt 可以以任何格式传递。我只是将其转换为
DD-MM-YYYY格式并存储到given_date -
嗯,您将 dt 定义为
date,因此它没有格式。格式仅用于显示。顺便说一句,编写日期的最佳和最短的方法是标准 SQL 日期文字:date '2012-12-12' -
不,您已将形式参数声明为
dt date- 所以它的数据类型是日期。它没有任何内在的人类可读格式。调用者必须传递一个实际的日期(如果它传递一个字符串并依赖于在某些时候会出错的隐式转换)。即使你有to_date(dt, ...没有引号,而不是to_date('dt', ....,你也会做你自己的隐式转换,这也会中断。你不应该使用已经是日期的东西作为to_date()的第一个参数。
标签: sql stored-procedures oracle11g