【问题标题】:Oracle parameter and IN clause in SSRS(RDL) reportsSSRS(RDL) 报告中的 Oracle 参数和 IN 子句
【发布时间】:2013-10-18 09:31:13
【问题描述】:

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

假设我在报告服务器上发布的 .rdl 报告中的数据源上有此查询:

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 报告。

【问题讨论】:

  • arrCluster 通常有多少个条目?
  • 通常为 10-15。您提供的第一个答案可能会有所帮助,但我想要函数的 CREATE OR REPLACE FUNCTION.. 代码及其使用方式。我已经阅读了整篇文章,但有很多修改和缺乏真实的文档。

标签: c# sql wpf oracle reporting-services


【解决方案1】:

这种方式行不通,因为 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))

【讨论】:

  • 你能把函数的细节贴出来吗?我愿意为此提供赏金,所以请帮忙。
【解决方案2】:

如果可以确保传递的参数是数字,并且 c.cluster_cd 是数字列,请尝试以下操作

SELECT ...
FROM ...
WHERE to_char(c.cluster_cd) IN ((:paramClusterCD));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-27
    • 2018-11-25
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多