我在Oracle的SCOTT中创建了如下的Package/Body。
-- 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;
我怎么知道我做错了什么?
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<此处小提琴>此处小提琴>