我正在使用 Oracle SQL Developer 4.0.1.14 并试图找出一些变量绑定(bind)。我从以下查询开始:
SELECT *
FROM Ships
WHERE UniqueId = 17;
和
SELECT *
FROM Ships
WHERE UniqueId = :variable;
这些都成功执行。当您运行第二个时,Oracle SQL Developer 提示您输入一个值,我输入 17。但是,当我尝试使用字符串参数执行相同的操作时,我不成功(查询返回 0 行)。例如:
SELECT *
FROM Ships
WHERE ShipName = 'Atlantic Boat';
和
SELECT *
FROM Ships
WHERE ShipName LIKE :variable;
只有第一个查询成功。我尝试进入弹出窗口
大西洋船
'大西洋船'
《大西洋之船》
和其他变化没有成功。我怎样才能使这项工作?
编辑:我尝试使用 like 语句并发现了一些成功。
SELECT *
FROM Ships
WHERE ShipName LIKE '%Atlantic Boat%';
和
SELECT *
FROM Ships
WHERE ShipName LIKE :variable;
两者实际上都有效。第二个需要 %Atlantic Boat%,没有字符串引号 ('')。但是,即使有 % 的变化,我仍然无法让 = one 工作。
最佳答案
如果表的名称定义为 varchar2
字段然后它按预期工作:
create table ships (uniqueid number, shipname varchar2(20));
insert into ships values (17, 'Atlantic Boat');
SELECT *
FROM Ships
WHERE ShipName = 'Atlantic Boat';
UNIQUEID SHIPNAME
---------- ------------------------------
17 Atlantic Boat
var variable varchar2(20);
anonymous block completed
exec :variable := 'Atlantic Boat';
SELECT *
FROM Ships
WHERE ShipName LIKE :variable;
UNIQUEID SHIPNAME
---------- ------------------------------
17 Atlantic Boat
但是如果表有
char
列然后它显示您描述的行为:drop table ships;
create table ships (uniqueid number, shipname char(20));
insert into ships values (17, 'Atlantic Boat');
SELECT *
FROM Ships
WHERE ShipName = 'Atlantic Boat';
UNIQUEID SHIPNAME
---------- ------------------------------
17 Atlantic Boat
var variable varchar2(20);
exec :variable := 'Atlantic Boat';
anonymous block completed
SELECT *
FROM Ships
WHERE ShipName LIKE :variable;
no rows selected
即使绑定(bind)变量声明为
char(20)
,也会发生这种情况。也是。char
值存储在字段长度的空白处,因此在这种情况下,存储的值实际上是 'Atlantic Boat '
, 末尾有 7 个空格。通常,当您进行 WHERE ShipName = 'Atlantic Boat'
之类的比较时字符串文字是 implicitly converted到您要比较的列类型,并且在比较期间它们被视为相等。绑定(bind)变量似乎没有发生这种情况,但我无法立即在文档中看到对该行为的任何引用。当您使用
LIKE 'Atlantic Boat%'
或通过 Atlantic Boat%
作为绑定(bind)变量,多余的空格不再相关,因为完整的 'Atlantic Boat '
确实像 Atlantic Boat%
.没有真正的理由使用
char
(有些像短标志或字段总是固定长度为 char
,但即使有也没什么区别)。解决此问题的最佳方法是更改表定义,使字段为 varchar2
.如果你不能这样做,你可以在查询中强制转换绑定(bind)变量:
SELECT *
FROM Ships
WHERE ShipName LIKE cast(:variable as char(20));
UNIQUEID SHIPNAME
---------- ------------------------------
17 Atlantic Boat
关于sql - Oracle SQL Developer 字符串变量绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23766407/