全部博文(136)
分类: Oracle
2008-07-31 13:05:09
SQL> create table yct1(id varchar2(3), name varchar2(20))
2 / 表已创建。
SQL> insert into yct1 select 2, 'yct'||rownum from dual connect by
rownum < 6;
已创建5行。
SQL> insert into yct1 select '02', 'yct'||rownum from dual connect by
rownum < 6;
已创建5行。
SQL> commit;
提交完成。
SQL> select * from yct1;
ID NAME
--- -------------------- 2 yct1 2 yct2 2 yct3 2 yct4 2 yct5 02 yct1 02 yct2 02 yct3 02 yct4 02 yct5 已选择10行。 |
-- 条件中使用数值
SQL> select * from yct1 where id = 02;
ID NAME
--- -------------------- 2 yct1 2 yct2 2 yct3 2 yct4 2 yct5 02 yct1 02 yct2 02 yct3 02 yct4 02 yct5 已选择10行。
-- 条件中使用字符
SQL> select * from yct1 where id = '02';
ID NAME --- -------------------- 02 yct1 02 yct2 02 yct3 02 yct4 02 yct5 |
SQL> select * from v$version;
BANNER
---------------------------------------------------------------- Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod PL/SQL Release 10.2.0.1.0 - Production CORE 10.2.0.1.0 Production TNS for 32-bit Windows: Version 10.2.0.1.0 - Production NLSRTL Version 10.2.0.1.0 - Production SQL> explain plan for
2 select * from yct1 where id = 02; 已解释。
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------- Plan hash value: 1878970141 --------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 10 | 150 | 3 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| YCT1 | 10 | 150 | 3 (0)| 00:00:01 | -------------------------------------------------------------------------- Predicate Information (identified by operation
id):
--------------------------------------------------- PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------- 1 - filter(TO_NUMBER("ID")=02)
Note
----- - dynamic sampling used for this statement 已选择17行。 |
select * from yct1 where to_number(id) =
2; |
SQL> insert into yct1 values('x02', 'yctx');
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from yct1;
ID NAME
--- -------------------- 2 yct1 2 yct2 2 yct3 2 yct4 2 yct5 02 yct1 02 yct2 02 yct3 02 yct4 02 yct5 x02 yctx 已选择11行。
SQL> select * from yct1 where id = 02;
ERROR: ORA-01722: 无效数字 未选定行 |
SQL> select * from yct1 where to_number(id) = 2;
ERROR: ORA-01722: 无效数字 未选定行 |
chinaunix网友2009-12-09 14:37:21
虽然 Oracle 可以自动转换一些类型,但我们编码时,不要寄希望于 Oracle,而应该使用显式的类型转换,将数据类型一一对应。否则带来的问题可能很难发现,比如若字段 yct1.id 上存在索引,Oracle 强制类型转换后也会无法使用。