暂无图片
分享
卢春龙
2019-05-31
ORA-01722

同一条语句才两个环境,一个可以执行一个提示1722错误

image.png

image.png


收藏
分享
7条回答
默认
最新
卢春龙

最近刚出现的一种情况,本来在开发环境中sql 都没有问题,结果在测试环境中却报出:ORA-01722: 无效数字 异常。同样的sql 只是环境不同,却一个正常一个报错。也是一顿纠结。后来查出是因为Where 条件后 “列名=数字” 造成的。 表中有一状态列 :state char(1),因为最开始时里面的值都是数字类型 所以sql 中直接写 state = 1. 这样查询没报错是因为 oracle 做了隐式转换。也就是T0_NUMBER(STATE)=1 这时当数据库中出现了如 a b c d 这些字符时,TO_NUMBER 就会触发ORA-01722 错误了。所以以后要做到在写sql语句时就得认真处理好不同类型的问题 用state = ‘1’

暂无图片 评论
暂无图片 有用 0
卢春龙

有什么参数可以不加'' 

暂无图片 评论
暂无图片 有用 0
章芋文

没有这种参数,规范代码和数据模型。

暂无图片 评论
暂无图片 有用 0
卢春龙

一台数据库没有报错一台会报错

暂无图片 评论
暂无图片 有用 0
章芋文

对于SELECT语句,oracle会把字段的数据类型隐式转换为变量的数据类型。

   如假设id列的数据类型为varchar2

   select * from tab where id=1; 
   -> to_number(id)=1;

   但如果id列的数据类型为number,则

   select * from tab where id='1'; 
   -> id=to_number('1');
暂无图片 评论
暂无图片 有用 0
卢春龙

那为什么同样的语句有时候可以执行有时候不行呢?不行的原因是,为什么不会转换

暂无图片 评论
暂无图片 有用 0
卢春龙
问题已关闭: 问题已经得到解决
暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏