我正在使用Oracle SQL Developer 4.0.1.14并尝试找出一些变量绑定。我从下面的查询开始:
SELECT *
FROM Ships
WHERE UniqueId = 17;
和
SELECT *
FROM Ships
WHERE UniqueId = :variable;
这两个都成功执行。当您运行第二个时,Oracle SQL Developer会提示您输入一个值,我输入了17.但是,当我尝试使用字符串参数执行相同操作时,我不成功(Query返回0行)。例如:
SELECT *
FROM Ships
WHERE ShipName = 'Atlantic Boat';
和
SELECT *
FROM Ships
WHERE ShipName LIKE :variable;
只有第一个查询成功。我试过进入弹出窗口
大西洋船
'Atlantic Boat'
“大西洋船”
和其他变化没有成功。我怎样才能做到这一点?
编辑:我尝试过使用like语句并取得了一些成功。
SELECT *
FROM Ships
WHERE ShipName LIKE '%Atlantic Boat%';
和
SELECT *
FROM Ships
WHERE ShipName LIKE :variable;
两者都有效。第二个需要%Atlantic Boat%,没有字符串引号('')。我仍然无法让=一个工作,即使有%变化。
答案 0 :(得分:4)
如果使用名称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
即使绑定变量也被声明为char(20)
,也会发生这种情况。
char
值以空白填充存储到字段长度,因此在这种情况下,存储的值实际为'Atlantic Boat '
,最后有7个空格。通常,当您对WHERE ShipName = 'Atlantic Boat'
进行比较时,字符串文字为implicitly converted与您要比较的列类型,并且在比较期间,它们被视为相等。对于绑定变量似乎没有发生这种情况,但我无法在文档中立即看到对该行为的任何引用。
当您使用LIKE 'Atlantic Boat%'
或传递Atlantic Boat%
作为绑定变量时,额外的空格不再相关,因为完整的'Atlantic Boat '
确实类似于Atlantic Boat%
。
没有真正的理由使用char
(有些像短旗或字段总是固定长度为char
,但即使这样也没什么区别)。解决此问题的最佳方法是更改表定义,使字段为varchar2
。
如果你不能这样做,你可以在查询中转换绑定变量:
SELECT *
FROM Ships
WHERE ShipName LIKE cast(:variable as char(20));
UNIQUEID SHIPNAME
---------- ------------------------------
17 Atlantic Boat
答案 1 :(得分:1)
我正在使用SQL Developer 4.0.1.14,它只在我身边传递Atlantic Boat
:
正如@Alex Poole在上面的评论中所提到的,请确保ShipName
的类型为varchar2
。输入desbribe Ships
以检查该信息:
您还可以查看this SQL Fiddle。看到like
'Atlantic Boat'
正确提取该行。