2011-08-08 38 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