Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL开发人员绑定变量提示:强制字符串值_Sql_Oracle_Oracle10g_Oracle Sqldeveloper - Fatal编程技术网

SQL开发人员绑定变量提示:强制字符串值

SQL开发人员绑定变量提示:强制字符串值,sql,oracle,oracle10g,oracle-sqldeveloper,Sql,Oracle,Oracle10g,Oracle Sqldeveloper,我试图使用SQLDeveloperBindVariables提示符来加速查询执行,但没有得到所需的输出:看起来我输入的值被转换成了数字 表说明: Nome Null Type ------------------ -------- ------------ NUM NOT NULL VARCHAR2(13) IS_OK NUMBER(1) 初步情况: 工作更新:

我试图使用SQLDeveloperBindVariables提示符来加速查询执行,但没有得到所需的输出:看起来我输入的值被转换成了数字

表说明:

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;