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.如果表中有储存了字符型的数据,那么就会报错。
这个结论解释了 为什么 我们在一些数据库里运行程序是可以,在一些数据库上就会报错,实际上是表的数据不一样造成的。 但是 归根揭底是 类型的错误运用导致的。
还是那句老话: 类型一定要匹配。