[20141212]ORA-01722.txt

[20141212]ORA-01722.txt

--昨天做优化,遇到一个奇怪的问题,记录一下。

SCOTT@test> @ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.3.0     Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

SCOTT@test> create table t as select to_char(rownum) id,'test' name from dual connect by levelTable created.

SCOTT@test> create unique index i_t_id on t(id);
Index created.

SCOTT@test> select  *  from t where id=60;
ID                                       NAME
---------------------------------------- --------------------
60                                       test

SCOTT@test> @dpc '' ''
PLAN_TABLE_OUTPUT
--------------------------------------------------------------
SQL_ID  0g3c5maxawf09, child number 0
-------------------------------------
select  *  from t where id=60
Plan hash value: 1601196873
--------------------------------------------------------
| Id  | Operation         | Name | E-Rows | Cost (%CPU)|
--------------------------------------------------------
|   0 | SELECT STATEMENT  |      |        |    66 (100)|
|*  1 |  TABLE ACCESS FULL| T    |      1 |    66   (4)|
--------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter(TO_NUMBER("ID")=60)

--存在隐式转换,导致不会使用索引。

SCOTT@test> insert into t values ('x','aaa');
1 row created.

SCOTT@test> commit ;
Commit complete.

SCOTT@test> select  *  from t where id=60;
ERROR:
ORA-01722: invalid number
no rows selected

$ oerr ora 1722
01722, 00000, "invalid number"
// *Cause: The specified number was invalid.
// *Action: Specify a valid number.

--这个时候查询失败,注意最后的提示no rows selected。实际上这个语句是执行的,直到遇到了id='x',这个转换出错,无法继续。
--如果写成这样就可以有结果。
SCOTT@test> select  *  from t where id=60 and rownumID                                       NAME
---------------------------------------- --------------------
60                                       test

--看出视图:
SCOTT@test> select sql_id,sql_text,executions,buffer_gets,child_number from v$sql where sql_id='0g3c5maxawf09';
SQL_ID        SQL_TEXT                                                     EXECUTIONS BUFFER_GETS CHILD_NUMBER
------------- ------------------------------------------------------------ ---------- ----------- ------------
0g3c5maxawf09 select  *  from t where id=60                                         2         464            0

--从执行次数以及BUFFER_GETS都可以看出是遇到错误停止了。

如果我修改第1条记录。
SCOTT@test> update t set id='y' where id='1';
1 row updated.

SCOTT@test> commit ;
Commit complete.

SCOTT@test> select  *  from t where id=60;
select  *  from t where id=60
                        *
ERROR at line 1:
ORA-01722: invalid number

SCOTT@test> select sql_id,sql_text,executions,buffer_gets,child_number from v$sql where sql_id='0g3c5maxawf09';
SQL_ID        SQL_TEXT                                                     EXECUTIONS BUFFER_GETS CHILD_NUMBER
------------- ------------------------------------------------------------ ---------- ----------- ------------
0g3c5maxawf09 select  *  from t where id=60                                         3         467            0

--对比上下buffer_gets的差值,可以推出第3次执行仅仅3个逻辑读。注意一个小细节,这次执行没有no rows selected提示。

--这个也是我开始觉得奇怪的地方,执行计划是全表扫描,而逻辑读却很低。做一个记录。

--现在优化的项目就是存在大量的隐式转换,tmd就是一个豆腐渣工程....实在懒得跟开发提........

时间: 2024-07-31 01:49:27

[20141212]ORA-01722.txt的相关文章

[20141212]关于sql_id.txt

[20141212]关于sql_id.txt http://blog.itpub.net/267265/viewspace-1357292/ http://blog.itpub.net/267265/viewspace-1220996/ --昨天别人问一些sql_id计算的问题,实际上我也不懂具体的算法,我给他看了上面的链接. --他问的问题,还是通过例子来说明: SCOTT@test> @ver1 PORT_STRING                    VERSION        BA

[20160512]tnsnames.ora配置文件.txt

[20160512]tnsnames.ora配置文件.txt --今天再次解决1个tnsnames.ora配置文件.看来这个文件最好不要手工修改!! --通过例子来说明: 78 =   (DESCRIPTION =     (ADDRESS_LIST =       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.100.78)(PORT = 1521))     )     (SDU = 32768)     (CONNECT_DATA =       (

UNIX oracle 10g能用utl

oracle|unix|数据 UNIX oracle 10g能用utl_file包读取文件数据吗? 我在WINDOW 下ORACLE 8i利用utl_file可以读取文本文件的数据,我本人测试通过,但是在UNIX oracle 10g不行呀!出错!begin loadfiledata('d:\ora','1.txt'); end; ORA-29280: 目录路径无效ORA-06512: 在 "SYS.UTL_FILE", line 33ORA-06512: 在 "SYS.UT

[20170914]tnsnames.ora的管理.txt

[20170914]tnsnames.ora的管理.txt --//昨天朋友讲tnsnams.ora的内容太长了,而且许多不需要的.管理不方便.我记得以前写[20150409]tnsnames.ora与IFILE.txt.链接 --//http://blog.itpub.net/267265/viewspace-1561107/ --//这样你可以按照某种分类管理.实际上这个我也是以前看别人的机器学来的,很简单就是建立多个tnsnames配置文件. --//使用参数IFILE=/path/xxx

[20150924]tnsnames.ora是否可以带斜线.txt

[20150924]tnsnames.ora是否可以带斜线.txt --10g开始oracle支持ezconnect简单连接方式建立与数据库的连接. d:\tools\sqltemp>sqlplus scott/xxxxxx@192.168.100.40:1521/test.com SQL*Plus: Release 12.1.0.1.0 Production on Thu Sep 24 08:32:43 2015 Copyright (c) 1982, 2013, Oracle.  All r

[20111220]tnsnames.ora的定位.txt

[20111220]tnsnames.ora的定位.txt 1.跟踪在linux下sqlplus的执行过程,可以很容易定位tnsnames.ora的定位过程. $ export TNS_ADMIN=/tmp$ strace -o  findtnsnames.txt sqlplus scott/xxxx@noexist $ grep -i tnsname findtnsnames.txtaccess("/home/oracle/.tnsnames.ora", F_OK) = -1 ENO

[20130528]tnsnames.ora的格式问题.txt

[20130528]tnsnames.ora的格式问题.txt --注:为了blog的显示问题,空格使用下划线. 40X =(DESCRIPTION =_(ADDRESS_LIST =_(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.100.40)(PORT = 1521))_)_(CONNECT_DATA =__(SERVER = DEDICATED)__(SERVICE_NAME = test.com))) 使用上面的连接数据库,会出现:ERROR:OR

Oracle Net Listener Parameters (listener.ora)(转)

  12/20 7 Oracle Net Listener Parameters (listener.ora) This chapter provides a complete listing of the listener.ora file configuration parameters. This chapter contains these topics: Overview of Oracle Net Listener Configuration File Oracle Net List

[20171019]绑定变量的分配长度7.txt

[20171019]绑定变量的分配长度7.txt --//如果绑定变量中字符串分配占用空间的长度变化,oracle会建立子光标. --//参考连接: http://blog.itpub.net/267265/viewspace-1993495/ --//oracle 可以通过一个10503事件设置大的缓存,测试看看: $ oerr ora 10503 10503, 00000, "enable user-specified graduated bind lengths" // *Cau