加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Oracle报错--无效数字

(2018-04-19 11:48:48)
标签:

oracle

error

无效数字

分类: Oracle

ORA-01722:无效数字

 

主要原因是:

1、对于两个类型不匹配(一个数字类型,一个非数字类型,同下)的值进行赋值操作;
2、两个类型不匹配的值进行比较操作(例如,“=”);
3、to_number函数中的值,非数字的,比如,to_number('a')肯定是不行的,to_number('12306')则是正常的。

要避免这些问题,要做到在写sql语句时就好认真处理好不同类型的问题。
比如如果要比较的话,同时都用to_number强制转换(to_number(字段a) = to_number(字段b)),或者同时转换为字符串类型(字段a||'' = 字段b||'',都连接一个空字符串使之变成字符串类型)。
在语句中使用to_number函数时,要保证值一定是数字格式,或者写好异常处理。
当我们碰到这个错误提示时,就从所有用到的数字类型的字段开始检查,逐一排查,从而解决问题

 

举例:

-- Test CODE_RESULT_COUNTERPARTY
select sum(case when tsk.code_result_counterparty <> nvl(to_char(tcp.t_manualenum_1) ,'XNA') then 1 else 0 end) cnt_err,
       sum(case when tsk.code_result_counterparty = nvl(to_char(tcp.t_manualenum_1) ,'XNA') then 1 else 0 end) cnt_ok,
       count(*) as total
from owner_dwh.f_camp_task_ad tsk
left join t_counterparty_imp tcp on tcp.t_taskcalendar_1 = tsk.id_source
--
where 1=1
  and tsk.dtime_execution >= date'2018-04-12' and tsk.dtime_execution < date'2018-04-18'
;

通过查看两个蓝色字段,发现 左侧蓝色字段为‘字符类型’,右侧蓝色字段为‘数字类型’,这是导致出现‘错误--无效数字’的原因,属于上文提到原因中的第2种。因此,在右侧加上了显示转换to_char() ,解决了问题。

0

阅读 收藏 喜欢 打印举报/Report
前一篇:Excel-vlookup
后一篇:ETL基础知识
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有