2013-10-18 57 views
1

之前標記爲重複,我已經閱讀了以下內容:甲骨文參數,在SSRS(RDL)子句報告

認爲我有這個在我的報表服務器發佈的.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報告。

+0

多少項呢arrCluster有典型的? –

+0

通常10-15。您提供的第一個答案可能會有所幫助,但我希望函數的「CREATE OR REPLACE FUNCTION ...」代碼以及它的使用方式。我已經閱讀了整個主題,但很多修訂和缺乏真實的文檔。 –

回答

3

它不會這樣的工作方式,因爲Oracle將無法識別你實際上試圖傳遞一個可能的值列表。

你想是什麼樣的

select * from t where x in (1,2,3) 

,但你的代碼做一個查詢是

select * from t where x = '1,2,3' 

隨着x爲數字,甲骨文試圖施展「1,2,3」成數 - 並且失敗...

請參閱此excellent thread at AskTom以獲得正確的解決方案(以及有關綁定變量重要性的佈道)。

更新:湯姆的第一個答案已經包含了你所需要的一切,但它使用了現在已經過時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)) 
+0

你可以發佈功能的細節?我願意爲此給予獎勵,請幫助。 –

+0

最後。謝謝! –

0

請嘗試以下,如果你能確保傳遞的參數是一個數字,如果c.cluster_cd是數列

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

這不起作用。 –