如何在SQL Developer中为多值参数输入绑定

时间:2014-02-27 16:51:06

标签: sql oracle oracle-sqldeveloper

我有很多带有命名参数的SQL,我需要能够在SQL Developer中执行。对于参数是标量值的SQL,可以很容易地将SQL粘贴到工作表中,SQL Developer会提示我(在标题为“输入绑定”的对话框中)输入参数值。但是对于参数需要包含多个值的情况,如下所示:

select count(*) from foo 
where foo.id in (:ids)

其中,例如:ids需要替换为1,2,3,以便执行的查询是

select count(*) from foo 
where foo.id in (1,2,3)

我尝试将值输入到对话框中(我尝试用逗号分隔,或者只是空格,或者用parens包装所有内容),无论我尝试什么,我都会收到错误消息:

ORA-01722: invalid number
01722. 00000 -  "invalid number"
*Cause:    
*Action:

是否存在将多个值输入“Enter Binds”对话框的语法,以便SQL Developer能够正确执行替换?或者绑定是否严格限于标量值?

我正在使用Oracle SQL Developer 3.2.20.09。

1 个答案:

答案 0 :(得分:3)

这不是SQL Developer的限制,它只是绑定变量的工作方式。你有效地做了:

select count(*) from foo 
where foo.id in ('1,2,3')

...这真的是in (to_number('1,2,3')),因此错误。它适用于单个值,如果您的小数点分隔符是逗号,则为两个值提供奇数结果,并且对于任何其他值都失败。

您无法在绑定提示符下输入多个值,也无法使用单个绑定向in()提供多个值。你可以作弊虽然有点创造性。 xmltable函数会将逗号分隔的字符串转换为每行中包含一个值的行:

var ids varchar2(50);
exec :ids := '1,2,3';
select * from xmltable(:ids);

COLUMN_VALUE
------------
1            
2            
3            

然后您可以将其用作查找表:

select count(*)
from xmltable(:ids) x
join foo f on f.id = to_number(x.column_value);

  COUNT(*)
----------
         3