我需要从几个不同的表中收集大量I到某种类型的变量中,以便传递给另一个函数。从哪个表获取is是动态的,这取决于下面的参数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;发布于 2011-09-16 21:19:09
如果您使用的是10g或更高版本,则可以通过使用多集并集运算符使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()函数-可能是一种值得研究的方法,但在提高性能方面可能不会给您带来太多好处。
临时表不是一个好主意,因为与在内存中做事情相比,临时表的性能非常差。
发布于 2011-09-16 21:17:53
事实证明,有一种简单得多的方法来连接:
iList1 MULTISET UNION ALL iList2(归功于https://forums.oracle.com/forums/thread.jspa?messageID=7420028。直到今天,我才知道这是可能的。)
https://stackoverflow.com/questions/7444234
复制相似问题