【问题标题】:ORA-01858 while executing created procedureORA-01858 在执行创建的过程时
【发布时间】:2019-10-08 03:47:47
【问题描述】:

我创建了一个程序来查找todayexpiry_date 之间的日期。 表格列格式已经是日期格式。

创建过程时创建成功且没有错误,但在执行过程中显示如下

ORA-01858:在需要数字的地方发现了一个非数字字符

ALTER SESSION SET NLS_DATE_FORMAT ='dd-mm-yyyy';
CREATE OR REPLACE PROCEDURE flow (
    today  IN                  DATE,
    expiry_date       IN       DATE
) AS

BEGIN
    FOR  rec in (
        SELECT *
        FROM flow4
        WHERE englishcalendar BETWEEN 'englishcalendar.today' 
                    AND 'englishcalendar.expiry_date')
    LOOP
        dbms_output.put_line(rec.englishcalendar);
    END LOOP;

EXCEPTION
    WHEN OTHERS THEN
        dbms_output.put_line(sqlerrm);
END;
/

EXEC FLOW('01-02-2017','03-04-2018');
/

我也尝试在过程和过程执行中添加 to_date 但我得到了同样的错误 我也尝试过这个参考 Getting Error - ORA-01858: a non-numeric character was found where a numeric was expected

注意 englishcalendar 包含 2019 年的连续日期,日期格式为 'dd-mm-yyyy'

【问题讨论】:

  • WHERE englishcalendar BETWEEN 'englishcalendar.today' AND 'englishcalendar.expiry_date') 似乎不正确。请分享表flow4的架构。
  • hr.flow4.englishcalendar.today(Schema ==> HR,flow4 ==> Table_name,englishcalendar ==> 列名和今天 ==> 过程 INPARAM)@AnkitBajpai
  • 我的意思是表flow4的结构。

标签: oracle plsql


【解决方案1】:

'englishcalendar.today' 是字符串而不是日期。同样'englishcalendar.expiry_date'。 Oracle 试图将这些字符串转换为日期并失败,因为它们不是日期。

简单的解决方案:将参数引用为标识符而不是字符串:

 ... 
  FOR  rec in (
    SELECT *
    FROM flow4
    WHERE englishcalendar BETWEEN today
                AND expiry_date)
...

【讨论】:

  • 非常感谢@APC,您已经完成了出色的工作,我为此苦苦挣扎了好几个小时!!
猜你喜欢
  • 2019-03-08
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
  • 2017-09-01
  • 1970-01-01
  • 2022-01-20
相关资源
最近更新 更多