plsql游标迭代问题

时间:2009-07-23 06:09:53

标签: plsql cursor iteration

我使用oracle演示模式 scott 来进行一些plsql测试(该模式中的数据永远不会更改)。我编写了以下程序来获取每个部门的员工编号。问题是,只有4个部门,但我的程序输出5行。我找不到原因,任何人都可以帮忙吗?非常感谢。

declare
    cursor employees(department_id number) is
    select count(*) howmany
    from scott.emp
    where deptno=department_id;

    employees_per_dept employees%rowtype;


    cursor departments is
    select *
    from scott.dept;

    a_department departments%rowtype;

begin
    dbms_output.put_line('-----------------------------------');
    open departments;
    loop
        exit when departments%notfound;

        fetch departments into a_department;

        open employees(a_department.deptno);
        fetch employees into employees_per_dept;
        dbms_output.put_line(employees_per_dept.howmany);
        close employees;


    end loop;
    close departments;
    dbms_output.put_line('-----------------------------------');
end;

2 个答案:

答案 0 :(得分:4)

如果在dbms_output中输出deptno,你会看到原因。

您需要切换这两行:

fetch departments into a_department;
exit when departments%notfound;
在初始FETCH之前,

%NOTFOUND没有意义;你的代码在最后一个部门计算两次的emps。

答案 1 :(得分:0)

declare

cursor cl(ccode varchar2) is

Select * from employees where department_id=ccode;

z cl%rowtype;

cnt number:=0;

begin

    Open cl('90');

    fetch cl into Z;

    while (cl%found) loop 

    dbms_output.put_line ( 'nsme is  '  || z.last_name);

        fetch cl into Z;

        cnt := cnt +1;

        end  loop;

         dbms_output.put_line (cnt);

    close cl;

   end;