代码之家  ›  专栏  ›  技术社区  ›  pyuntae

尝试将日期值插入新表时出错(ORA-01858:在需要数字的位置发现非数字字符)

  •  1
  • pyuntae  · 技术社区  · 7 年前

    我试图在表中插入值,但不断出错

    ORA-01858: a non-numeric character was found where a numeric was expected
    

    这是我的代码:

    INSERT INTO PRODUCT_DIM_HIS
    (PRODUCTKEY, PRODUCTID, PRODUCTDESCRIPTION, PRODUCTLINEID, PRODUCTLINENAME, EFF_START_DATE, EFF_END_DATE)
    SELECT PRODUCT_KEY_SEQ.NEXTVAL, nvl(to_char(p.PRODUCTID), 'Undefined'), nvl(to_char(p.PRODUCTDESCRIPTION), 'Undefined'),
    nvl(to_char(p.PRODUCTLINEID), 'Undefined'), nvl(to_char(pl.PRODUCTLINENAME), 'Undefined'), 
    nvl(to_date(o.ORDERDATE), 'Undefined'), nvl(to_date(o.FULFILLMENTDATE), 'Undefined')
    FROM PRODUCTLINE_T pl, PRODUCT_T p, ORDER_T o, ORDERLINE_T ol
    WHERE p.PRODUCTLINEID = pl.PRODUCTLINEID
    AND o.ORDERID = ol.ORDERID 
    AND ol.PRODUCTID = p.PRODUCTID;
    

    PRODUCT\u DIM\u HIS代码 请求 :

    CREATE TABLE PRODUCT_DIM_HIS
    (
        PRODUCTKEY integer NOT NULL,
        PRODUCTID integer,
        PRODUCTDESCRIPTION VARCHAR2(50 BYTE),
        PRODUCTLINEID integer,
        PRODUCTLINENAME VARCHAR2(50 BYTE),
        EFF_START_DATE DATE,
        EFF_END_DATE DATE,
        CONSTRAINT PRODUCT_DIM_HIS_PK PRIMARY KEY (PRODUCTKEY)
    );
    

    ORDER\u中的ORDERDATE和FULLFILlMENTDATE没有日期数据类型,所以我不明白问题出在哪里?

    @鲍勃·贾维斯

    CREATE TABLE PRODUCT_DIM
    (
        PRODUCTKEY integer NOT NULL,
        PRODUCTID integer,
        PRODUCTDESCRIPTION VARCHAR2(50 BYTE),
        PRODUCTLINEID integer,
        PRODUCTLINENAME VARCHAR2(50 BYTE),
        CONSTRAINT PRODUCT_DIM_PK PRIMARY KEY (PRODUCTKEY)
    );
    
    INSERT INTO PRODUCT_DIM
    (PRODUCTKEY, PRODUCTID, PRODUCTDESCRIPTION, PRODUCTLINEID, PRODUCTLINENAME)
    SELECT PRODUCT_KEY_SEQ.NEXTVAL, nvl(to_char(p.PRODUCTID), 'Undefined'), nvl(to_char(p.PRODUCTDESCRIPTION), 'Undefined'),
    nvl(to_char(p.PRODUCTLINEID), 'Undefined'), nvl(to_char(pl.PRODUCTLINENAME), 'Undefined')
    FROM PRODUCTLINE_T pl, PRODUCT_T p
    WHERE p.PRODUCTLINEID = pl.PRODUCTLINEID;
    
    INSERT INTO PRODUCT_DIM
    (PRODUCTKEY, PRODUCTID, PRODUCTDESCRIPTION, PRODUCTLINEID, PRODUCTLINENAME)
    VALUES (PRODUCT_KEY_SEQ.NEXTVAL, -99, 'Undefined', -99, 'Undefined');
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   pyuntae    7 年前

    删除NVL()并只保留to_date():

    因此

    INSERT INTO PRODUCT_DIM_HIS
    (PRODUCTKEY, PRODUCTID, PRODUCTDESCRIPTION, PRODUCTLINEID, PRODUCTLINENAME, EFF_START_DATE, EFF_END_DATE)
    SELECT PRODUCT_KEY_SEQ.NEXTVAL, nvl(to_char(p.PRODUCTID), 'Undefined'), nvl(to_char(p.PRODUCTDESCRIPTION), 'Undefined'),
    nvl(to_char(p.PRODUCTLINEID), 'Undefined'), nvl(to_char(pl.PRODUCTLINENAME), 'Undefined'), 
    to_date(o.ORDERDATE), to_date(o.FULFILLMENTDATE)
    FROM PRODUCTLINE_T pl, PRODUCT_T p, ORDER_T o, ORDERLINE_T ol
    WHERE p.PRODUCTLINEID = pl.PRODUCTLINEID
    AND o.ORDERID = ol.ORDERID 
    AND ol.PRODUCTID = p.PRODUCTID;