我有很多带有命名参数的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。
答案 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