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

varchar类型代入number类型时报错的疑问

(2011-11-02 10:39:01)
标签:

杂谈

分类: oracle基础

varchar类型代入number类型时报错的疑问

TEST@ earth>create table t1 (a varchar2(10));

表已创建。

 

TEST@ earth>insert into t1 values(1);

 

已创建 1 行。

 

TEST@ earth>commit;

 

提交完成。

 

TEST@ earth>select * from t1 where a=1; --代入number数字 1 不会报错

 

A

--------------------

1

 

TEST@ earth>insert into t1 values('a');

 

已创建 1 行。

 

TEST@ earth>commit;

 

提交完成。

 

TEST@ earth>select * from t1 where a=1; --代入number数字 1 不会报错

ERROR:

ORA-01722: 无效数字 --报错无效数字, 1 可是有效数字

 

 

 

未选定行

 

TEST@ earth>set autotrace on --看一下oracle 是怎么处理这个sql

TEST@ earth>select * from t1 where a=1;

ERROR:

ORA-01722: 无效数字

 

 

 

未选定行

 

 

执行计划

----------------------------------------------------------

Plan hash value: 3617692013

 

--------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

--------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 1 | 7 | 3 (0)| 00:00:01 |

|* 1 | TABLE ACCESS FULL| T1 | 1 | 7 | 3 (0)| 00:00:01 |

--------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

1 - filter(TO_NUMBER("A")=1) --oracle的处理方法

 

 

统计信息

----------------------------------------------------------

0 recursive calls

0 db block gets

4 consistent gets

0 physical reads

0 redo size

402 bytes sent via SQL*Net to client

400 bytes received via SQL*Net from client

2 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

0 rows processed

 

oracle的处理方法1 - filter(TO_NUMBER("A")=1) 可以看出oracle内部把这个sql转换成

 

select * from t1 where TO_NUMBER("A")=1;

 

而我们的t1表的数据 a ,to_number('a') 就会报错,如下所示

TEST@ earth>select to_number('a') from dual;

select to_number('a') from dual

*

1 行出现错误:

ORA-01722: 无效数字

 

总结:1.varchar类型代入number类型的值,如果表中都是number类型的数据(比如储存的数据都 1,2,100这些数字),那么就不会报错

2.如果表中有储存了字符型的数据,那么就会报错。

 

这个结论解释了 为什么 我们在一些数据库里运行程序是可以,在一些数据库上就会报错,实际上是表的数据不一样造成的。 但是 归根揭底是 类型的错误运用导致的。

 

还是那句老话: 类型一定要匹配。

0

阅读 收藏 喜欢 打印举报/Report
  

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

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

新浪公司 版权所有