2011-08-08 40 views
0

我正在使用Oracle 10g。 我的情景:Oracle逗號將參數分隔到行並與其他表連接

我在逗號分隔的字符串('ord0000,ord0001,ord0002,......')中獲取了4000多條記錄作爲參數。我需要將這些值與table1進行比較,並找出匹配的記錄集。

出於這個目的,我創建瞭如下功能:

function get_split_values (

csv_string varchar2 
) return split_table pipelined 
as 
Delimit_String varchar2(32767) := csv_string; 
Delimit_index integer; 
begin 
loop 
Delimit_index := instr(delimit_string,','); 
if Delimit_index > 0 then 
pipe row(substr(delimit_string,1,delimit_index-1)); 
delimit_string := substr(delimit_string,delimit_index+1); 
else 
pipe row(delimit_string); 
exit; 
end if; 
end loop; 
return; 
end get_split_values; 

現在,當我用這個功能我在下面的程序表1,加盟:

create procedure abc (parameter_csv varchar2,...) 
as 
begin 
open cursor for 
select t.col1 from table1 t join table(get_split_values(parameter_csv)) x 
on x.column_value = t.col1; 
... 
end abc; 

它工作正常時, parameter_csv有大約300或400個ID('ord0000,ord0001,ord0002,......'),但是當它包含更多的記錄時,我得到了錯誤 「ORA 01460:未實現或不合理的轉換請求。

我不明白是什麼引發了這個錯誤。有任何想法嗎? 或者有什麼最好的方法來完成這項任務。

+0

什麼是最小的(近似)產生誤差所需的條目數? – Dan

回答

0

如果其使用PL/SQL過程的錯誤,您可以將字符串拆分爲內聯視圖的一部分。就像是。

SELECT T.col1 
FROM table1 T 
JOIN ( SELECT REGEXP_SUBSTR(parameter_csv, '[^,]+', 1, LEVEL) AS id 
      FROM DUAL 
      CONNECT BY LEVEL <= 
       LENGTH(REGEXP_REPLACE(parameter_csv, '[^,]+', '')) + 1 
     ) X 
ON  X.id = T.col1; 

注:不處理事情像的CSV重複的ID,空值在CSV ,,

+0

我也試過這個,但它說「字符串太長」。 – niceApp

+0

是的,如果parameter_csv大於4000字節,這個解決方案似乎就會中斷。所以仍然達到極限。對不起,關於流浪漢 – Sodved