立即执行批量收集限制

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

以上是关于立即执行批量收集限制的主要内容,如果未能解决你的问题,请参考以下文章

PLSQL - 批量收集的最大限制?

为啥批量收集到子句限制了 pl/sql 中嵌套表的大小

无法在立即执行中调用函数(存储在批量收集中)

javascript ContinuousBatchLibrary是一个Google Apps脚本库,可管理大批量工作,并可解决GAS执行的5分钟限制。

kali linux工具--信息批量收集工具theharvester

Dynamics CRM 修改Excel 最大导出记录限制及 最大上传文件限制