首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在PLSQL中串联集合

在PLSQL中串联集合
EN

Stack Overflow用户
提问于 2011-09-16 19:49:43
回答 2查看 9.6K关注 0票数 7

我需要从几个不同的表中收集大量I到某种类型的变量中,以便传递给另一个函数。从哪个表获取is是动态的,这取决于下面的参数iVar。问题是,是否没有更好的方法来做到这一点,因为这种方法将不得不多次复制和重新分配数组。将其全部插入到临时表中是不是更好?使用动态sql是不是更好。请参见下面的get_ids函数:

代码语言:javascript
运行
复制
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;
EN

回答 2

Stack Overflow用户

发布于 2011-09-16 21:19:09

如果您使用的是10g或更高版本,则可以通过使用多集并集运算符使CONCAT()函数的效率更高:

代码语言:javascript
运行
复制
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一次来提高效率:

代码语言:javascript
运行
复制
   lConcat := iList1 
               MULTISET UNION  
               iList2  
               MULTISET UNION  
               iList3
               MULTISET UNION  
               iList4;  

使用动态SQL -可能用来替换各种get_idsN()函数-可能是一种值得研究的方法,但在提高性能方面可能不会给您带来太多好处。

临时表不是一个好主意,因为与在内存中做事情相比,临时表的性能非常差。

票数 9
EN

Stack Overflow用户

发布于 2011-09-16 21:17:53

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

代码语言:javascript
运行
复制
iList1 MULTISET UNION ALL iList2

(归功于https://forums.oracle.com/forums/thread.jspa?messageID=7420028。直到今天,我才知道这是可能的。)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7444234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档