ORA-01858,执行创建的过程时

时间:2019-05-21 17:27:08

标签: oracle plsql

我创建了一个过程来查找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包含“ dd-mm-yyyy”日期格式的2019年连续日期

1 个答案:

答案 0 :(得分:1)

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

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

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