我有很多带有命名参数的 SQL,我需要能够在 SQL Developer 中执行这些 SQL。对于参数是标量值的 SQL,很容易将 SQL 粘贴到工作表中,SQL Developer 将提示我(在标题为“Enter Binds”的对话框中)输入参数值。但是对于参数需要保存多个值的情况,如下所示:
select count(*) from foo
where foo.id in (:ids)
比如说,
:ids
需要替换为 1,2,3
以便执行的查询是select count(*) from foo
where foo.id in (1,2,3)
我尝试在对话框中输入值(并且我尝试用逗号分隔,或者只是空格,或者将所有内容包装在括号中),无论我尝试什么,我都会收到错误消息:
ORA-01722: invalid number
01722. 00000 - "invalid number"
*Cause:
*Action:
是否有在“输入绑定(bind)”对话框中输入多个值的语法,以便 SQL Developer 能够正确执行替换?或者绑定(bind)是否严格限制为标量值?
我正在使用 Oracle SQL Developer 3.2.20.09。
最佳答案
这不是 SQL Developer 的限制,它只是绑定(bind)变量的工作方式。你正在有效地做:
select count(*) from foo
where foo.id in ('1,2,3')
... 真的是
in (to_number('1,2,3'))
,因此错误。它适用于单个值,如果您的小数分隔符是逗号,则为两个值给出奇数结果,并且失败更多。您不能在绑定(bind)提示符处输入多个值,或向
in()
提供多个值。与单个绑定(bind)。不过,你可以作弊有点创造性。 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
关于sql - 如何在 SQL Developer 中为多值参数输入绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22075001/