首页 > 数据库 > Oracle > [20250722]使用toad的小问题.txt
[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/ ,如需转载,请注明出处,否则将追究法律责任。