PL / SQL失败,错误代码为ORA-01858

时间:2014-09-25 16:36:29

标签: oracle plsql

我有一个在这个级别失败的程序:

select trunc(sysdate - TO_DATE(STARTING_DATE, 'DD/MM/YYYY')) into DAYS_NBR from dual;  

其中STARTING_DATE是输入日期,格式为DD / MM / YYYY。 这是错误代码

ORA-01858: a non-numeric character was found where a numeric was expected
你能检查一下吗?

3 个答案:

答案 0 :(得分:0)

STARTING_DATE无法转换正确的日期格式。检查代码返回此错误的STARTING_DATE值。

答案 1 :(得分:0)

正如Giorgi Orvelashvili所说,starting_date是一个varchar2,输入的格式掩码与 你期待的格式。以下是您的错误的再现:

    APPS@tst> --varchar
    APPS@erptst> DECLARE
      2    starting_date VARCHAR2(30) := to_char( SYSDATE -5,'MON/DD/YYYY') ;
      3    days_nbr      NUMBER;
      4  BEGIN
      5    SELECT trunc(SYSDATE - to_date(starting_date, 'DD/MM/YYYY'))
      6    INTO days_nbr
      7    FROM dual;
      8    dbms_output.put_line(to_char(days_nbr));
      9  END;

 10  /
DECLARE
*
ERROR at line 1:
ORA-01858: a non-numeric character was found where a numeric was expected
ORA-06512: at line 5

更正此问题的方法是将starting_date声明为日期,然后不需要使用to_date转换函数:

    APPS@tst>  --date
    APPS@tst> DECLARE
      2    starting_date DATE:= SYSDATE -5;
      3    days_nbr      NUMBER;
      4  BEGIN
      5    SELECT TRUNC(SYSDATE - starting_date) INTO days_nbr FROM dual;
      6    dbms_output.put_line(to_char(days_nbr));
      7  END;
      8  /

5

PL/SQL procedure successfully completed.

答案 2 :(得分:-1)

MedAli,尝试比较你的日期面具,可能是线索在这里?

DECLARE
 starting_date VARCHAR2(30) := to_char( SYSDATE -5,'MON/DD/YYYY') ;
BEGIN

...

SELECT trunc(SYSDATE - to_date(starting_date, 'DD/MM/YYYY'))...
END;
一般来说,BTW可以使用标准格式,例如:日期' 2015-12-31'