【发布时间】:2018-01-28 06:12:34
【问题描述】:
如何从表中获取所有列并存储到集合变量中。(作为单个变量)
大家好, 请帮我在oracle plsql中的这些问题中编写代码
【问题讨论】:
标签: plsql plsqldeveloper user-defined-types
如何从表中获取所有列并存储到集合变量中。(作为单个变量)
大家好, 请帮我在oracle plsql中的这些问题中编写代码
【问题讨论】:
标签: plsql plsqldeveloper user-defined-types
“如何从表中获取所有列并存储到集合变量中。(作为单个变量” - 如果您的表有数百万/数十亿行怎么办?您想淹没您的 PGA 内存! 您可以使用带限制的批量收集来获取有限数量的行并对其进行处理,当处理完成后,您可以将它们存储在某处并获取下一组行。
默认情况下,优化器将 Limit 100 放在 BULK COLLECT 子句之后。 PLSQL_OPTIMIZE_LEVEL 需要设置在 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;
/
您可能需要为您的餐桌找到一个适合BULK COLLECT LIMIT 的号码。
如果您的表有很多行,请为 LIMIT 尝试不同的数字,否则执行时间的差异是微不足道的。
【讨论】:
这个问题太模糊了,无法提供一个确定的答案,但这段代码是对它的一种解释的解决方案:“如何填充与表的投影匹配的 PL/SQL 集合?” p>
declare
--
-- collection of records which match EMP table
type emp_nt is table of emp%rowtype;
--
-- variable instance of that type
emp_recs emp_nt;
begin
-- use BULK COLLECT clause to populate the collection with records
select e.*
bulk collect into emp_recs
from emp e
where e.deptno = 20;
end;
【讨论】: