在PLSQL中连接集合

8

我需要从几个不同的表中收集大量id,并将其传递给另一个函数的某种变量。要从哪些表中获取id是动态的,取决于下面的param iVar。问题是如果没有更好的方法来做到这一点,因为这种方法将不得不多次复制和重新分配数组。把所有内容插入临时表中会更好吗?使用动态SQL会更好吗?请参见下面的get_ids函数:

FUNCTION concat (
    iList1 IN ID_ARRAY,
iList2 IN ID_ARRAY
) 
RETURN ID_ARRAY IS
    lConcat ID_ARRAY;
BEGIN
    SELECT column_value BULK COLLECT INTO lConcat FROM (
        (SELECT column_value FROM TABLE(CAST( iList1 AS ID_ARRAY))) 
        UNION ALL 
        (SELECT column_value FROM TABLE(CAST( iList2 AS ID_ARRAY)))
    );
    RETURN lConcat;
END concat;

FUNCTION get_ids (
    iVar           IN NUMBER
) 
RETURN ID_ID_ARRAY IS
    lIds ID_ARRAY;
BEGIN
    lids := get_ids0();
    IF iVar = 1 THEN
        lIds := concat(lFilter, get_ids1());
    ELSE
        lIds := concat(lFilter, get_ids3());
        IF iVar = 4 THEN
            lIds := concat(lFilter, get_ids4());
        END IF;
    END IF;
    RETURN lIds;
END get_ids;
2个回答

9
如果你使用的是10g或更高版本,你可以通过使用MULTISET UNION运算符来使CONCAT()函数更加高效:
FUNCTION concat (
    iList1 IN ID_ARRAY,
      iList2 IN ID_ARRAY
) 
RETURN ID_ARRAY IS
    lConcat ID_ARRAY;
BEGIN
    lConcat := iList1 
               MULTISET UNION  
               iList2 A
    ;
    RETURN lConcat;
END concat;

您可以通过填充几个不同的数组,然后一次性调用MULTISET UNION来使事情更加高效:
   lConcat := iList1 
               MULTISET UNION  
               iList2  
               MULTISET UNION  
               iList3
               MULTISET UNION  
               iList4;  

使用动态SQL(可能替换各种get_idsN()函数)可能是值得研究的方法,但可能不会在性能方面带来太多改进。暂时表不是一个好主意,因为它们与内存操作相比性能非常差。

5

5
ALL是可选的。MULTISET UNION不会以任何方式过滤条目。 - APC
应该是“不排序或过滤” 8-) - APC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接