在标记为重复之前,我已阅读以下内容:
假设我在我的报告服务器上发布的.rdl报告中对我的DataSource有这个查询:
SELECT ...
FROM ...
WHERE c.cluster_cd IN (:paramClusterCD)
Report Builder 2.0自动将参数识别为@paramClusterCD
。在我的wpf项目中,我必须创建一个具有多个值的参数,如下所示:
var arrCluster = (lbCluster.SelectedItems.Cast<CLUSTER_MSTR>().ToList()).Select(x => x.CLUSTER_CD).ToArray();
string strCluster = string.Join(",", arrCluster); // result is "1,2,3"
现在每当我运行(在报表查看器中传递参数)时,我都会遇到此错误:
ORA-01722: invalid number
上一篇文章的解决方法无效,因为这是SSRS报告。
答案 0 :(得分:3)
它不会以这种方式工作,因为Oracle无法识别您实际上是在尝试传递可能值的列表。
您想要的是像
这样的查询select * from t where x in (1,2,3)
但你的代码是做什么的
select * from t where x = '1,2,3'
由于x是数字,Oracle会尝试将“1,2,3”转换为数字 - 并且失败......
请参阅此excellent thread at AskTom以获取正确的解决方案(以及关于绑定变量重要性的讲道)。
更新:Tom的第一个答案已包含您需要的所有内容,但它使用的是现已过时的THE
关键字,而不是TABLE
。以下是适合您的步骤:
首先为数字集合创建一个类型
create or replace type TableOfNumber as table of number;
然后创建一个分割字符串并返回新创建的集合的函数
create or replace function in_list( p_string in varchar2 ) return TableOfNumber as
l_string long default p_string || ',';
l_data TableOfNumber := TableOfNumber();
n number;
begin
loop
exit when l_string is null;
n := instr( l_string, ',' );
l_data.extend;
l_data(l_data.count) := to_number( substr( l_string, 1, n-1 ) );
l_string := substr( l_string, n+1 );
end loop;
return l_data;
end;
现在您可以在查询中使用此功能:
SELECT ...
FROM ...
WHERE c.cluster_cd IN
(select * from TABLE (select cast(in_list(:paramClusterCD) as mytableType) from dual))
答案 1 :(得分:0)
如果您可以确保传递的参数是数字并且c.cluster_cd是数字列,请尝试以下
SELECT ...
FROM ...
WHERE to_char(c.cluster_cd) IN ((:paramClusterCD));