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;
/