Oracle逗号将参数分隔为行并与其他表连接

时间:2011-08-08 23:05:33

标签: sql oracle plsql

我正在使用Oracle 10g。 我的情景:

我在逗号分隔的字符串('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;

现在,我在下面的过程中使用此函数与table1连接:

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:要求执行未实现或不合理的转换。”

我不明白是什么引起了这个错误。有任何想法吗? 或者有任何最好的方法来完成这项任务。

2 个答案:

答案 0 :(得分:1)

最初我以为你的varchar2(32767)溢出了,但是快速查看你的样本ID表明你不应该早期(400 ids)。

快速谷歌的错误让我进入了OTN的这个论坛:http://forums.oracle.com/forums/thread.jspa?threadID=507725&start=15&tstart=0

此博文:http://oraclequirks.blogspot.com/2008/10/ora-01460-unimplemented-or-unreasonable.html

表示这可能是一个oracle bug

答案 1 :(得分: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中的空值,,