我正在使用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:要求执行未实现或不合理的转换。”
我不明白是什么引起了这个错误。有任何想法吗? 或者有任何最好的方法来完成这项任务。
答案 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中的空值,,
等