ITPub博客

首页 > 数据库 > Oracle > [20250722]使用toad的小问题.txt

[20250722]使用toad的小问题.txt

原创 Oracle 作者:lfree 时间:2025-07-25 21:24:18 0 删除 编辑

[20250722]使用toad的小问题.txt

--//无意中测试发现toad的小问题,如果带入绑定变量是整形,如果数值很大会报错。
  SELECT OWNER
        ,OBJECT_NAME
        ,SUBOBJECT_NAME
        ,OBJECT_TYPE
        ,DECODE (EXTRACTVALUE (NOTES, '/obj_note/equality_predicates_only'), 'YES', 'E') ALLEQ
        ,DECODE (EXTRACTVALUE (NOTES, '/obj_note/simple_column_predicates_only'), 'YES', 'C') ALLCOLS
        ,DECODE (EXTRACTVALUE (NOTES, '/obj_note/index_access_by_join_predicates'), 'YES', 'J') NLJNIX
        ,DECODE (EXTRACTVALUE (NOTES, '/obj_note/filter_on_joining_object'), 'YES', 'F') FILTER
        ,NUM_ROWS
    FROM SYS.DBA_SQL_PLAN_DIR_OBJECTS
   WHERE DIRECTIVE_ID = :B1
ORDER BY OBJECT_TYPE DESC
        ,OWNER
        ,OBJECT_NAME
        ,SUBOBJECT_NAME

--//带入13972766652855831375会报错。提示 ''13972766652855831375'' is not a valid integer value

--//sqlplus下没有这个问题:
$ cat ga.txt
variable B1 number ;
exec :B1 := &&1;
  SELECT OWNER
        ,OBJECT_NAME
        ,SUBOBJECT_NAME
        ,OBJECT_TYPE
        ,DECODE (EXTRACTVALUE (NOTES, '/obj_note/equality_predicates_only'), 'YES', 'E') ALLEQ
        ,DECODE (EXTRACTVALUE (NOTES, '/obj_note/simple_column_predicates_only'), 'YES', 'C') ALLCOLS
        ,DECODE (EXTRACTVALUE (NOTES, '/obj_note/index_access_by_join_predicates'), 'YES', 'J') NLJNIX
        ,DECODE (EXTRACTVALUE (NOTES, '/obj_note/filter_on_joining_object'), 'YES', 'F') FILTER
        ,NUM_ROWS
    FROM SYS.DBA_SQL_PLAN_DIR_OBJECTS
   WHERE DIRECTIVE_ID = :B1
ORDER BY OBJECT_TYPE DESC
        ,OWNER
        ,OBJECT_NAME
        ,SUBOBJECT_NAME;

SYS@book01p> @ ga.txt 13972766652855831375
PL/SQL procedure successfully completed.
OWNER OBJECT_NAME SUBOBJECT_NAME OBJECT_TYPE A A N FILTER NUM_ROWS
----- ----------- -------------- ----------- - - - ------ --------
SYS   OBJ$                       TABLE             F
SYS   X$KSPPCV                   TABLE             F
SYS   X$KSPPI                    TABLE             F

SCOTT@book01p> select min(DIRECTIVE_ID) from dba_sql_plan_directives;
   MIN(DIRECTIVE_ID)
--------------------
   24160170414108990
--//17个数字组成。

SYS@book01p> @ ga.txt 24160170414108990
PL/SQL procedure successfully completed.
OWNER  OBJECT_NAME SUBOBJECT_NAME  OBJECT_TYPE                    A A N FILTER NUM_ROWS
------ ----------- --------------- ------------------------------ - - - ------ --------
AUDSYS AUD$UNIFIED                 TABLE
AUDSYS AUD$UNIFIED EVENT_TIMESTAMP COLUMN

--//在toad下带入24160170414108990查询没有报上面的错误,但是没有结果输出。

--//使用自带的sqldbmon.exe跟踪:
SELECT OWNER
        ,OBJECT_NAME
        ,SUBOBJECT_NAME
        ,OBJECT_TYPE
        ,DECODE (EXTRACTVALUE (NOTES, '/obj_note/equality_predicates_only'), 'YES', 'E') ALLEQ
        ,DECODE (EXTRACTVALUE (NOTES, '/obj_note/simple_column_predicates_only'), 'YES', 'C') ALLCOLS
        ,DECODE (EXTRACTVALUE (NOTES, '/obj_note/index_access_by_join_predicates'), 'YES', 'J') NLJNIX
        ,DECODE (EXTRACTVALUE (NOTES, '/obj_note/filter_on_joining_object'), 'YES', 'F') FILTER
        ,NUM_ROWS
    FROM SYS.DBA_SQL_PLAN_DIR_OBJECTS
   WHERE DIRECTIVE_ID = :B1
ORDER BY OBJECT_TYPE DESC
        ,OWNER
        ,OBJECT_NAME
        ,SUBOBJECT_NAME

B1=[0.241601704e+017]
--//可以发现toad下仅仅支持科学计数法的小数点后9位小数。这样相当于输入24160170400000000,自然查询没有结果。
--//遇到这种情况简单处理方法就是在toad下选择类型为字符类型就可以绕过这个限制,因为可以规避隐式转换问题。
--//我测试在toad下最大输入整形是9999999999999998,占16个字符。
--//如果输入9999999999999999,实际上输入1E16。

--//我看到开发很少使用toad,至少我们开发团队是这样,不知道PLSQL DEVELOP是否存在类似问题。
--//我工作偶尔会使用toad,提醒注意在toad下绑定变量是整形很大要注意这个细节问题。
--//具体最大整数是9999999999999998(占16个字符)。

--//验证脚本如下
SCOTT@book01p> create table tx (a number);
Table created.

SCOTT@book01p> insert into tx values (9999999999999998);
1 row created.

SCOTT@book01p> insert into tx values (9999999999999999);
1 row created.

SCOTT@book01p> commit;
Commit complete.

select * from scott.tx where a  =:BB
--//在toad下带入9999999999999998有输出,带入9999999999999999没有输出。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-3092128/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7969454