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

来源:这里教程网 时间:2026-03-03 22:23:55 作者:

[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没有输出。

相关推荐