SQL Developer绑定变量提示:强制字符串值

时间:2017-02-20 10:21:11

标签: sql oracle oracle10g oracle-sqldeveloper

我试图使用SQL Developer绑定变量提示来加速查询执行,但我没有得到所需的输出:看起来像我输入的值被转换为数字。

表格描述:

Nome               Null     Type         
------------------ -------- ------------ 
NUM                NOT NULL VARCHAR2(13) 
IS_OK                       NUMBER(1)

初始情况:

enter image description here

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

1 个答案:

答案 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列上的任何索引,并可能导致意外结果 - 在这种情况下,如果这些是例如英国的电话号码,无论是否有领先的零,你可能都没有相同的价值,但这通常需要警惕。