2009-07-23 123 views
0

我使用oracle演示模式scott做一些plsql测试(该模式中的数据从不改变)。我编写了以下程序以获取每个部门的员工编号。问题是,只有4个部门,但我的程序输出5行。我找不到原因,任何人都可以帮忙?万分感谢。plsql光标迭代问题

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; 

回答

3

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

需要将以下两行切换:

fetch departments into a_department; 
exit when departments%notfound; 

%NOTFOUND是无意义的之前的初始FETCH;你的代码在最后一个部门中统计了两次。

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;