立即执行批量收集限制
Posted
技术标签:
【中文标题】立即执行批量收集限制【英文标题】:Bulk collect limit with execute immediate 【发布时间】:2017-02-22 07:30:13 【问题描述】:为了对数百万条记录进行操作,我想将限制设置为 500,但以下代码会出错。 错误报告: ORA-06550:第 6 行,第 49 列: PLS-00103:在预期以下情况之一时遇到符号“LIMIT”:
DECLARE
TYPE EMP_T IS TABLE OF NUMBER;
EMP_ID EMP_T;
QRY VARCHAR2(4000):='SELECT EMPLOYEE_ID FROM EMPLOYEES';
begin
execute immediate QRY bulk collect into EMP_ID LIMIT 500;
END;
【问题讨论】:
"Bulk Collect Into" and "Execute Immediate" in Oracle的可能重复LIMIT 500
。我猜你不明白为什么使用 LIMIT 以及你可以为批量收集设置的最佳 LIMIT 是什么。 LIMIT 根本不是一个行数计数器。如果您想要一个行计数器,请在动态查询中使用它来限制行。读这个 。 ***.com/questions/38659739/…
【参考方案1】:
这不是使用 LIMIT 子句的方式。我认为您不能将 BULK COLLECT 中的 LIMIT 子句与 EXECUTE IMMEDIATE 一起使用。 BULK COLLECT LIMIT in EXECUTE IMMEDIATE
示例:
DECLARE
TYPE EMP_T IS TABLE OF NUMBER;
EMP_ID EMP_T;
CURSOR c_data IS SELECT empid FROM EMPLOYEE;
begin
OPEN c_data;
LOOP
FETCH c_data
BULK COLLECT INTO EMP_ID LIMIT 100;
EXIT WHEN EMP_ID.count = 0;
-- Process contents of collection here.
DBMS_OUTPUT.put_line(EMP_ID.count || ' rows');
END LOOP;
CLOSE c_data;
END;
/
【讨论】:
我不能使用游标,因为我的查询不是静态的。查询是动态构建的,然后用于立即执行。 如果您使用的是 Oracle 12c,您可以使用行限制子句,例如 FETCH FIRST 500 ROWS以上是关于立即执行批量收集限制的主要内容,如果未能解决你的问题,请参考以下文章
javascript ContinuousBatchLibrary是一个Google Apps脚本库,可管理大批量工作,并可解决GAS执行的5分钟限制。