sql - Oracle SQL Developer 字符串变量绑定(bind)

标签 sql string oracle variables binding

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

相关文章:

sql - FORALL 与 FOR 批量更新

PHP - 插入带有先前选择语句结果名称的表

c - 简单偏移加密中的段错误

javascript - 在 PHP 字符串中插入 JS 变量

c - printf 上附加了奇怪的字符串

Oracle 约束和空值

sql - ORA-01403 - 未找到数据 - 即使游标 SELECT 语句运行正常

c# - EF6 : Configure complex mapping for entities (code first)

java - Hibernate和mysql错误: Cannot add or update a child row

java - JSP搜索数据库