sql - 如何在 SQL Developer 中为多值参数输入绑定(bind)

标签 sql oracle oracle-sqldeveloper

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

相关文章:

Oracle SQL Developer 详细输出

sql - rails,SQL,单表继承,表地址为 "subclass"而不是类

sql - GROUP BY 在 SQL 中使用参数

sql - 计算属于特定类型的条目

sql - 在 WHERE 子句中使用自定义函数加速更新

java - 单表SQL中如何将2列对应的数据显示到第三列和第四列?

sql - 如何为所有行更新表中特定字段的值?

php - 在 solr/lucene 中过滤存储在远程数据库中的字段的最佳方法?

sql - Oracle 中针对集合类型 'object' 进行批量收集

Oracle SQL Developer - 使用外键