【问题标题】:Oracle PLSQL BULK Collect and For LoopOracle PLSQL BULK 收集和 For 循环
【发布时间】:2015-01-06 10:54:57
【问题描述】:

我编写了以下 oracle 程序来批量获取数据并分块处理。我正在使用带限制的批量收集选项来获取数据。但是在 for 循环中我无法检索 ORD_ID。我正在尝试使用

输出 ORD_ID
DBMS_OUTPUT.put_line(l_orders(indx)); 

但出现编译错误“调用 'PUT_LINE' 时参数的数量或类型错误”

create or replace PROCEDURE TESTPROC AS 

CURSOR order_id_cur IS SELECT ORD_ID FROM orders ORDER BY ORD_ID ASC;
 l_order_id   VARCHAR2(100);
 TYPE orders_aat IS TABLE OF order_id_cur%ROWTYPE;
 l_orders orders_aat;
 limit_in NUMBER      :=10; 
 batch_in NUMBER :=0;


BEGIN
  OPEN order_id_cur;
  LOOP
    FETCH order_id_cur 
        BULK COLLECT INTO l_orders LIMIT limit_in;
    DBMS_OUTPUT.put_line('Batch-----'||batch_in);
    FOR indx IN 1 .. l_orders.COUNT 
    LOOP
        DBMS_OUTPUT.put_line(indx);
        DBMS_OUTPUT.put_line(l_orders(indx));
    END LOOP;

    EXIT WHEN l_orders.COUNT < limit_in;
    batch_in := batch_in+1;
   END LOOP;
   CLOSE order_id_cur;
END TESTPROC;

如何在 for 循环中获取 ORD_ID 的值。

【问题讨论】:

    标签: oracle plsql bulk-collect


    【解决方案1】:

    这样做 -

    DBMS_OUTPUT.put_line(l_orders(indx).ORD_ID);

    例如,

    SQL> DECLARE
      2  type t
      3  IS
      4    TABLE OF emp%rowtype;
      5    a t;
      6  BEGIN
      7    SELECT * BULK COLLECT INTO a FROM emp;
      8    FOR i IN 1..a.count
      9    LOOP
     10      dbms_output.put_line (a(i).ename);
     11    END LOOP;
     12  END;
     13  /
    SMITH
    ALLEN
    WARD
    JONES
    MARTIN
    BLAKE
    CLARK
    SCOTT
    KING
    TURNER
    ADAMS
    JAMES
    FORD
    MILLER
    
    PL/SQL procedure successfully completed.
    
    SQL>
    

    【讨论】:

    • 谢谢...我正在尝试另一种方式 l_orders.ORD_ID(indx)
    • 还有一个疑问......是否可以一次获取所有 ORD_ID,而不是使用 for 循环并遍历每个。基本上我想在“IN”语句中使用所有的 ord_ids..例如“从 orders_bckup 中删除 ord_id in (allOrderIds)”
    • 您可以对DELETE 使用FORALL 语句。 row by row 始终是 slow by slow。但是,既然可以在SQL 中完成,为什么还要使用PL/SQL。你是在不必要地介绍context switching
    • 谢谢...将调查 FORALL...无论如何,上面的过程只是一个示例......在我的场景中,我必须将数据从特定表复制到备份表并从原始表中删除数据基于不同条件的表格...
    • @Lalit Kumar B - 我们可以在批量收集循环中使用选择语句并将收集中的存储值设置为选择查询吗? stackoverflow.com/questions/66605055/…
    【解决方案2】:

    你也可以像下面这样直接循环到光标

    FOR recc in order_id_cur 
       LOOP
           DBMS_OUTPUT.put_line(recc.ORD_ID );
       END LOOP;
    

    【讨论】:

      猜你喜欢
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多