SSRS(RDL)报告中的Oracle参数和IN子句

时间:2013-10-18 09:31:14

标签: c# sql wpf oracle reporting-services

在标记为重复之前,我已阅读以下内容:

假设我在我的报告服务器上发布的.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报告。

2 个答案:

答案 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));