12
返回列表 发新帖
楼主: wabjtam123

请教大家一个很奇怪的问题 ,关于ORA-01722: invalid number

[复制链接]
论坛徽章:
0
11#
发表于 2008-3-13 11:51 | 只看该作者
原帖由 wabjtam123 于 2008-3-13 09:49 发表
和RBO和从下到上无关
我分析了表,走了CBO,也一样可以查询
另外我表没分析,改变了AND的顺序,也可以查询

我的问题是奇怪的是,为什么只要有一个字段搞了索引,并且是正确的不转化的类型,另一个字段就可以隐试转化了


没有理解我说的意思。

补充测试:
SQL> select * from t1 where key_name=111 and id=2;
select * from t1 where key_name=111 and id=2
                       *
ERROR at line 1:
ORA-01722: invalid number

PLAN_TABLE_OUTPUT                                                               
--------------------------------------------------------------------------------
                                                                                
---------------------------------------------------------------------------     
| Id  | Operation                   |  Name       | Rows  | Bytes | Cost  |     
---------------------------------------------------------------------------     
|   0 | SELECT STATEMENT            |             |       |       |       |     
|*  1 |  TABLE ACCESS BY INDEX ROWID| T1          |       |       |       |     
|*  2 |   INDEX UNIQUE SCAN         | PK_T1       |       |       |       |     
---------------------------------------------------------------------------     
                                                                                
Predicate Information (identified by operation id):                             
---------------------------------------------------                             
                                                                                
PLAN_TABLE_OUTPUT                                                               
--------------------------------------------------------------------------------
                                                                                
   1 - filter(TO_NUMBER("T1"."KEY_NAME")=111)                                   
   2 - access("T1"."ID"=2)                       

这里虽然通过index访问,但是由于符合查询条件的结果
SQL> select * from t1 where id=2;

        ID KEY_NAME
---------- --------------------
         2 sdaf11   --> 无法被隐式转为number,所以还是会报错,你执行的查询之所以没报错,是因为查询的结果key_name是可以转换成number

建议消除程序中潜在的隐式转换。
隐式转化将使该字段上的索引失去作用
SQL> drop index pk_t1;

Index dropped.

SQL> create index idx_t1_key_name on t1(key_name);

Index created.

SQL> explain plan for select * from t1 where key_name=111;

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------

--------------------------------------------------------------------
| Id  | Operation            |  Name       | Rows  | Bytes | Cost  |
--------------------------------------------------------------------
|   0 | SELECT STATEMENT     |             |       |       |       |
|*  1 |  TABLE ACCESS FULL   | T1          |       |       |       |
--------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
   1 - filter(TO_NUMBER("T1"."KEY_NAME")=111)

SQL> explain plan  for select * from t1 where key_name='111';
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------

--------------------------------------------------------------------------------
| Id  | Operation                   |  Name            | Rows  | Bytes | Cost  |
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                  |       |       |       |
|   1 |  TABLE ACCESS BY INDEX ROWID| T1               |       |       |       |
|*  2 |   INDEX RANGE SCAN          | IDX_T1_KEY_NAME  |       |       |       |
--------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------

   2 - access("T1"."KEY_NAME"='111')

使用道具 举报

回复
论坛徽章:
14
授权会员
日期:2005-10-30 17:05:332011新春纪念徽章
日期:2011-02-18 11:43:36生肖徽章2007版:牛
日期:2009-02-20 15:06:152009新春纪念徽章
日期:2009-01-04 14:52:28生肖徽章2007版:龙
日期:2008-12-25 11:27:31生肖徽章2007版:鼠
日期:2008-01-02 17:35:53生肖徽章2007版:鸡
日期:2008-01-02 17:35:53数据库板块每日发贴之星
日期:2006-05-24 01:01:36会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07
12#
发表于 2008-3-13 16:28 | 只看该作者
能守规矩的话尽量守规矩,尽量不要用隐式转换
不要给自己带来不必要的烦恼

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表