【问题标题】:Oracle comma separated parameter to row and join with other tablesOracle 逗号分隔参数行并与其他表连接
【发布时间】:2011-08-08 23:05:32
【问题描述】:

我正在使用 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:请求的转换未实现或不合理。”

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

【问题讨论】:

  • 产生错误所需的最小(大约)条目数是多少?

标签: sql oracle plsql


【解决方案1】:

最初我以为您的 varchar2(32767) 溢出,但快速查看您的示例 ID 表明您不应该那么早(400 个 id)。

错误的快速谷歌将我带到了 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 错误

【讨论】:

    【解决方案2】:

    如果它是使用 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 ,, 中的空值等内容

    【讨论】:

    • 是的,如果 parameter_csv 超过 4000 字节,这个解决方案似乎会中断。所以还是达到了极限。对流浪汉感到抱歉
    猜你喜欢
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2021-09-18
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多