plsql-Oracle集合
如何从表中获取所有列并将其存储到集合变量中。(作为单个变量) 大家好,plsql-Oracle集合,plsql,plsqldeveloper,user-defined-types,Plsql,Plsqldeveloper,User Defined Types,如何从表中获取所有列并将其存储到集合变量中。(作为单个变量) 大家好, 请帮助我在oracle plsql中编写这些问题的代码。这个问题太模糊了,无法给出确切的答案,但这段代码是对其中一种解释的解决方案:“如何填充与表的投影匹配的PL/SQL集合?” “如何从表中获取所有列并将其存储到集合变量中。(作为单个变量”-如果表中有数百万/数十亿行,该怎么办?您想占用PGA内存! 您可以使用具有限制的批量收集来获取有限数量的行并对其进行处理,处理完成后,您可以将它们存储在某个位置并获取下一组行 默认情况
请帮助我在oracle plsql中编写这些问题的代码。这个问题太模糊了,无法给出确切的答案,但这段代码是对其中一种解释的解决方案:“如何填充与表的投影匹配的PL/SQL集合?” “如何从表中获取所有列并将其存储到集合变量中。(作为单个变量”-如果表中有数百万/数十亿行,该怎么办?您想占用PGA内存! 您可以使用具有限制的批量收集来获取有限数量的行并对其进行处理,处理完成后,您可以将它们存储在某个位置并获取下一组行 默认情况下,优化器在
批量收集
子句后设置限制100。PLSQL\u OPTIMIZE\u级别需要设置为级别2或更高。
这里有一个例子
DECLARE
TYPE yourtable_nt IS TABLE OF yourtable%rowtype;
tab yourtable_nt;
CURSOR cur IS SELECT * FROM yourtable;
BEGIN
OPEN cur;
LOOP
FETCH cur BULK COLLECT INTO tab LIMIT 100; -- FOR EVERY FETCH DATA IS STORED IN tab FROM INDEX 1
FOR i in 1..tab.COUNT LOOP
Null;
-- PROCESS YOUR COLLECTION DATA
END LOOP;
EXIT WHEN cur%NOTFOUND;
END LOOP;
CLOSE cur;
EXCEPTION
WHEN OTHERS THEN
IF cur%ISOPEN THEN
CLOSE cur;
END IF;
END;
/
您可能需要为表中的批量收集限制
找到一个甜数。
如果您的表有很多行,请为LIMIT
尝试不同的数字,否则执行时间的差异是微不足道的
DECLARE
TYPE yourtable_nt IS TABLE OF yourtable%rowtype;
tab yourtable_nt;
CURSOR cur IS SELECT * FROM yourtable;
BEGIN
OPEN cur;
LOOP
FETCH cur BULK COLLECT INTO tab LIMIT 100; -- FOR EVERY FETCH DATA IS STORED IN tab FROM INDEX 1
FOR i in 1..tab.COUNT LOOP
Null;
-- PROCESS YOUR COLLECTION DATA
END LOOP;
EXIT WHEN cur%NOTFOUND;
END LOOP;
CLOSE cur;
EXCEPTION
WHEN OTHERS THEN
IF cur%ISOPEN THEN
CLOSE cur;
END IF;
END;
/