加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 站长百科 > 正文

Oracle SQL Developer字符串变量绑定

发布时间:2021-01-21 06:29:45 所属栏目:站长百科 来源:网络整理
导读:我正在使用Oracle SQL Developer 4.0.1.14并尝试找出一些变量绑定.我从下面的查询开始: SELECT *FROM ShipsWHERE UniqueId = 17; 和 SELECT *FROM ShipsWHERE UniqueId = :variable; 这些都成功执行.当您运行第二个时,Oracle SQL Developer会提示您输入一个

我正在使用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;

只有第一个查询成功.我试过进入弹出窗口

大西洋船

‘大西洋船’

“大西洋船”

和其他变化没有成功.我怎样才能做到这一点?

编辑:我尝试使用类似的声明,并取得了一些成功.

SELECT *
FROM Ships
WHERE ShipName LIKE '%Atlantic Boat%';

SELECT *
FROM Ships
WHERE ShipName LIKE :variable;

两者都有效.第二个需要%Atlantic Boat%,没有字符串引号(”).我仍然无法让=一个工作,即使%变化.

解决方法

如果使用名称作为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,并且在比较期间它们被视为相等.对于绑定变量似乎没有发生这种情况,但我无法立即在文档中看到对该行为的任何引用.

当您使用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

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读