【问题标题】:"BULK COLLECT" in Oracle runs into an infinite loopOracle 中的“BULK COLLECT”陷入无限循环
【发布时间】:2021-12-10 13:39:48
【问题描述】:

我在 Oracle 的 SCOTT 中创建了如下所示的包/正文。

-- PACKAGE SPECIFICATION:

create or replace package emp_pkg Is

    TYPE tbl_emp IS TABLE OF EMP%ROWTYPE;

    PROCEDURE p_displayEmpName;
   
end emp_pkg;
-- PACKAGE BODY:

create or replace package body emp_pkg Is
   
PROCEDURE p_displayEmpName IS   
    CURSOR c_rec IS select * from emp where deptno = 30;
    v_tbl_emp tbl_emp;
    BEGIN
        open c_rec;
        loop
            fetch c_rec bulk collect into v_tbl_emp;
            for i in 1..v_tbl_emp.count loop
                dbms_output.put_line(v_tbl_emp(i).ename || ','||v_tbl_emp(i).hiredate);
            end loop;
        end loop;
    END p_displayEmpName;
end emp_pkg;   

编译包和正文没有问题。

一旦我执行了这个过程,它就会进入一个无限循环:

-- CALL ing the procedure:
exec emp_pkg.p_displayempname;

我怎样才能知道我做错了什么?

【问题讨论】:

    标签: oracle procedure bulk collect


    【解决方案1】:

    EXIT 没有更多行时的循环和CLOSE 您的光标(是的,它应该被隐式关闭,但最好养成良好的习惯并在使用语言/驱动程序时始终关闭它游标没有隐式关闭):

    create or replace package body emp_pkg Is
       
    PROCEDURE p_displayEmpName
    IS   
      CURSOR c_rec IS select * from emp where deptno = 30;
      v_tbl_emp tbl_emp;
      BEGIN
        open c_rec;
        loop
          EXIT WHEN c_rec%NOTFOUND;
          fetch c_rec bulk collect into v_tbl_emp LIMIT 50;
    
          for i in 1..v_tbl_emp.count loop
            dbms_output.put_line(v_tbl_emp(i).ename || ',' || v_tbl_emp(i).hiredate);
          end loop;
        end loop;
    
        CLOSE c_rec;
      END p_displayEmpName;
    end emp_pkg;
    /
    

    db小提琴here

    【讨论】:

      猜你喜欢
      • 2020-05-13
      • 1970-01-01
      • 2013-03-17
      • 2021-02-15
      • 2022-01-23
      • 2021-01-23
      相关资源
      最近更新 更多