在PLSQL中连接集合

问题描述 投票:7回答:2

我需要从几个不同的表中收集大量的ID到某种类型的变量中,以传递给另一个函数。从哪个表获取ID是动态的,具体取决于下面的参数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;
sql oracle plsql user-defined-types
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()函数-可能是值得研究的方法,但可能不会为您提供很多(如果有的话)改善性能的方法。

临时表不是一个好主意,因为与在内存中进行处理相比,它们的性能非常差。


4
投票

事实证明,有一种更简单的连接方法:

iList1 MULTISET UNION ALL iList2

((信用证为https://forums.oracle.com/forums/thread.jspa?messageID=7420028。直到今天我还不知道这是可能的。)

© www.soinside.com 2019 - 2024. All rights reserved.