我试图使用SQL Developer绑定变量提示来加速查询执行,但我没有得到所需的输出:看起来像我输入的值被转换为数字。
表格描述:
Nome Null Type
------------------ -------- ------------
NUM NOT NULL VARCHAR2(13)
IS_OK NUMBER(1)
初始情况:
select NUM, IS_OK from numbers_table where NUM = cast(:dn as varchar2(13));
NUM |IS_OK |
------------|------|
08331930078 |1 |
工作更新:
1
update numbers_table set IS_OK = 0 where NUM = 08331930078;
2
update numbers_table set IS_OK = 0 where NUM = '08331930078';
输出中:
'1 row updated'
不工作更新:
update numbers_table set IS_OK = 0 where NUM = cast(:dn as varchar2(13));
输出中:
'0 rows updated'
不知道我还能做些什么来强制将值解析为字符串。
SQL Developer版本4.1.3.20
答案 0 :(得分:0)
这很有趣,看起来像个bug。你实际上不需要强制转换,“输入绑定”窗口中的值无论如何都是一个字符串,所以这有效:
update numbers_table set IS_OK = 0 where NUM = :dn;
在对话框中输入零填充字符串08331930078。
不需要演员,但应该仍然有效。如果您使用已定义的绑定变量作为脚本运行,则两个表单都可以正常工作:
var dn varchar2(13);
exec :dn := '08331930078';
update numbers_table set IS_OK = 0 where NUM = :dn;
rollback;
update numbers_table set IS_OK = 0 where NUM = cast(:dn as varchar2(13));
rollback;
两个语句都会得到1 row updated
。即使在同一会话的脚本中定义了绑定变量,返回到作为语句运行仍然会提示并仍然具有相同(奇怪)的行为。
顺便提一下,当你这样做时:
update numbers_table set IS_OK = 0 where NUM = 08331930078;
你正在做的事情,正如你可以从执行计划的谓词部分看到的那样,是:
update numbers_table set IS_OK = 0 where to_number(NUM) = 8331930078;
将停止正在使用的num
列上的任何索引,并可能导致意外结果 - 在这种情况下,如果这些是例如英国的电话号码,无论是否有领先的零,你可能都没有相同的价值,但这通常需要警惕。