【问题标题】:SQL Developer bind variables prompt: force string valuesSQL Developer 绑定变量提示:强制字符串值
【发布时间】:2017-07-09 13:51:16
【问题描述】:

我正在尝试使用 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;
update numbers_table set IS_OK = 0 where NUM = '08331930078';

输出:

'1 row updated'

无效更新:

1.

update numbers_table set IS_OK = 0 where NUM = :dn;
update numbers_table set IS_OK = 0 where NUM = cast(:dn as varchar2(13));

输出:

'0 rows updated'

不知道我还能做些什么来强制将值解析为字符串。

SQL Developer 版本 4.1.3.20

【问题讨论】:

  • 什么都不需要,你的查询应该是:update numbers_table set IS_OK = 0 where NUM = :dn;
  • 事实证明它不是那样工作的(这是我最初的假设)

标签: sql oracle oracle10g oracle-sqldeveloper


【解决方案1】:

这很有趣,而且看起来像一个错误。您实际上不需要强制转换,“输入绑定”窗口中的值无论如何都是一个字符串,所以这有效:

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 列上的任何索引,并可能导致意外结果 - 在这种情况下,如果这些是例如英国电话号码在有或没有前导零的情况下可能不会具有相同的值,但通常需要注意这一点。

【讨论】:

  • 实际上您发布的第一个更新(具有绑定变量但没有显式转换的更新)对我也不起作用
  • 会不会是 SQL Developer 试图变得聪明?也许它正在查看所有数字并假设绑定变量是一个数字。因此,它会丢弃前导 0。当查询运行时,我们要么得到隐式数据类型转换,要么执行显式 CAST();无论哪种方式,字符串现在都失去了前导 0。只是一个理论......
猜你喜欢
  • 1970-01-01
  • 2020-03-20
  • 2018-01-07
  • 2017-06-30
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多