我有很多带有命名参数的 SQL,我需要能够在 SQL Developer 中执行它们。对于参数为标量值的 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:
是否有一种语法可以在“输入绑定”对话框中输入多个值,以便 SQL Developer 能够正确执行替换?或者绑定严格限于标量值?
我正在使用 Oracle SQL Developer 3.2.20.09。
这不是 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)