SQL开发人员绑定变量提示:强制字符串值
我试图使用SQLDeveloperBindVariables提示符来加速查询执行,但没有得到所需的输出:看起来我输入的值被转换成了数字 表说明:SQL开发人员绑定变量提示:强制字符串值,sql,oracle,oracle10g,oracle-sqldeveloper,Sql,Oracle,Oracle10g,Oracle Sqldeveloper,我试图使用SQLDeveloperBindVariables提示符来加速查询执行,但没有得到所需的输出:看起来我输入的值被转换成了数字 表说明: Nome Null Type ------------------ -------- ------------ NUM NOT NULL VARCHAR2(13) IS_OK NUMBER(1) 初步情况: 工作更新:
Nome Null Type
------------------ -------- ------------
NUM NOT NULL VARCHAR2(13)
IS_OK NUMBER(1)
初步情况:
工作更新:
一,
二,
输出:
'1 row updated'
'0 rows updated'
非工作状态更新:
update numbers_table set IS_OK = 0 where NUM = cast(:dn as varchar2(13));
输出:
'1 row updated'
'0 rows updated'
不知道我还能做些什么来强制将值解析为字符串
SQL Developer版本4.1.3.20很有趣,看起来像个bug。实际上,您不需要强制转换,“enter binds”窗口中的值无论如何都是字符串,因此可以这样做:
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行。即使在同一会话中的脚本中定义了绑定变量,返回到以语句形式运行仍然会提示并仍然具有相同的(奇数)行为
顺便说一句,当您这样做时:
update numbers_table set IS_OK = 0 where NUM = 08331930078;
从执行计划的谓词部分可以看出,您实际正在做的是:
update numbers_table set IS_OK = 0 where to_number(NUM) = 8331930078;
这将停止正在使用的num
列上的任何索引,并可能导致意外的结果-在这种情况下,如果这些是英国电话号码,则前导零和前导零的值可能不相同,但通常需要小心。无需强制转换任何内容,您的查询应该是:updatenumbers\u表集是\u OK=0,其中NUM=:dn;事实证明它不是那样工作的(这是我最初假设的),实际上您发布的第一个更新(带有绑定变量但没有显式强制转换的更新)在我这方面不起作用,是否SQL开发人员正试图变得聪明?也许它看到了所有的数字,并假设bind变量是一个数字。因此,它会删除前导的0。当查询运行时,我们要么得到隐式数据类型转换,要么执行显式CAST();无论哪种方式,字符串现在都丢失了前导0。只是一个理论。。。
update numbers_table set IS_OK = 0 where to_number(NUM) = 8331930078;