ORA-01722- 无效号码

ORA-01722- Invalid Number

我在包中有一个查询抛出错误

ORA-01722 : invalid number.

我试了很多方法都没有成功。

select h.column  
  from table1 h,table2 c 
 where c.created_date='17-MAY-17' 
   and nvl(c.acct_nmbr,0)=nvl(to_number(h.v_acct_num),0) 

请给我建议解决方案

确定哪些数据是非数字的:

select * from table1 h
where regexp_like(h.v_acct_num, '[^0-9]')

并删除它们

.

希望对您有所帮助。

显然 v_acct_num 列包含非数字值。 to_number() 函数限制参数中的值不能包含任何非数字字符,否则系统会抛出 ORA-01722 : invalid number。如果您确定在提取非数字字符时数据匹配,则在 joinon 子句的排序规则中使用 regexp_replace(t2.v_acct_num,'[^[:digit:]]') :

select t2.column  
  from table1 t1
  join table2 t2 on nvl(t1.acct_nmbr,0) = nvl(regexp_replace(t2.v_acct_num,'[^[:digit:]]'),0)
 where t2.created_date = date'2017-05-17'

Join 使用 ANSI-92 标准,对 date 语法使用 ISO-8601 标准。

如果您使用的是 Oracle 12.2 或更高版本,那么您可以使用 TO_NUMBER with ON CONVERSION ERROR 子句,如下所示:

SELECT
    H.COLUMN
FROM
    TABLE1 H
    JOIN TABLE2 C 
    ON NVL(C.ACCT_NMBR, 0) = NVL(TO_NUMBER(H.V_ACCT_NUM DEFAULT -999 ON CONVERSION ERROR), 0)
    -- use any number which is impossible in your column 
    -- so that it do not match any random records.
WHERE
    C.CREATED_DATE = DATE '2017-05-17';

注:

  • 使用标准 ANSI 加入
  • 在任何你想将字符串转换为日期或TO_DATE函数的地方使用DATE文字

干杯!!