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 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |