Oracle SQL Developer字符串变量绑定

时间:2014-05-20 17:33:40

标签: sql string oracle variables binding

我正在使用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%,没有字符串引号('')。我仍然无法让=一个工作,即使有%变化。

2 个答案:

答案 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

enter image description here

正如@Alex Poole在上面的评论中所提到的,请确保ShipName的类型为varchar2。输入desbribe Ships以检查该信息:

enter image description here


您还可以查看this SQL Fiddle。看到like 'Atlantic Boat'正确提取该行。