2012-02-16 43 views
2

我试图创建一个使用引用的pl/sql块。基本上,这是迄今为止我所拥有的。他们都作为个人游标工作。我在参考资料中发现它有点困难。我需要的是列出部门名称,然后转至emp_cursor并列出所有在department_id =外部游标部门_id中的员工。Oracle PL/SQL参考游标如何到

set serveroutput on 
declare 
    cursor dept_cursor is 
    select department_id, department_name 
    from departments 
    where department_id < 100; 
    dep_id departments.department_id%type; 
    dep_name departments.department_name%type; 

    cursor emp_cursor is 
     select last_name, job_id, hire_date, salary 
     from employees 
     where employee_id < 120 and department_id =/*Need reference from deptartmens.departments_id*/department_id; 
     emp_ln employees.last_name%type; 
     emp_jid employees.job_id%type; 
     emp_hd employees.hire_date%type; 
     emp_sal employees.salary%type; 

begin 
    for rec_dept in dept_cursor loop 
     dbms_output.put_line('Department Number: '||rec_dept.department_id|| ' Department Name: ' || rec_dept.department_name); 
     dbms_output.put_line('---------------------------------------------'); 
     for rec_emp in emp_cursor loop 
     dbms_output.put_line(rec_emp.last_name||' ' || rec_emp.job_id ||' ' || rec_emp.hire_date ||' '|| rec_emp.salary); 
     end loop; 
     dbms_output.put_line('---------------------------------------------'); 
    end loop; 

end ; 

例如,某些输出将如下所示。

Department Number : 10 Department Name : Administration 
---------------------------------------------------------------------------------------- 
Department Number : 20 Department Name : Marketing 
---------------------------------------------------------------------------------------- 
Department Number : 30 Department Name : Purchasing 
Raphaely PU_MAN 07-DEC-94 11000 
Khoo PU_CLERK 18-MAY-95 3100 
Baida PU_CLERK 24-DEC-97 2900 
Tobias PU_CLERK 24-JUL-97 2800 
Himuro PU_CLERK 15-NOV-98 2600 
Colmenares PU_CLERK 10-AUG-99 2500 
---------------------------------------------------------------------------------------- 

回答

1

你可以声明EMP_CURSOR作为参数光标。像

declare 
    cursor dept_cursor is 
    select department_id, department_name 
    from departments 
    where department_id < 100; 
    dep_id departments.department_id%type; 
    dep_name departments.department_name%type; 
    cursor emp_cursor(p_department_id IN NUMBER) is 
    select last_name, job_id, hire_date, salary 
    from employees 
    where employee_id < 120 
     and department_id = p_department_id; 
    emp_ln employees.last_name%type; 
    emp_jid employees.job_id%type; 
    emp_hd employees.hire_date%type; 
    emp_sal employees.salary%type; 
begin 
    for rec_dept in dept_cursor loop 
    dbms_output.put_line('Department Number: '||rec_dept.department_id|| ' Department Name: ' || rec_dept.department_name); 
    dbms_output.put_line('---------------------------------------------'); 
    for rec_emp in emp_cursor(rec_dept.department_id) loop 
     dbms_output.put_line(rec_emp.last_name||' ' || rec_emp.job_id ||' ' || rec_emp.hire_date ||' '|| rec_emp.salary); 
    end loop; 
    dbms_output.put_line('---------------------------------------------'); 
    end loop; 
end ; 

一些东西,在HR模式会产生以下结果现在

Department Number: 10 Department Name: Administration 
--------------------------------------------- 
--------------------------------------------- 
Department Number: 20 Department Name: Marketing 
--------------------------------------------- 
--------------------------------------------- 
Department Number: 30 Department Name: Purchasing 
--------------------------------------------- 
Raphaely PU_MAN 07-DEC-02 11000 
Khoo PU_CLERK 18-MAY-03 3100 
Baida PU_CLERK 24-DEC-05 2900 
Tobias PU_CLERK 24-JUL-05 2800 
Himuro PU_CLERK 15-NOV-06 2600 
Colmenares PU_CLERK 10-AUG-07 2500 
--------------------------------------------- 
Department Number: 40 Department Name: Human Resources 
--------------------------------------------- 
--------------------------------------------- 
Department Number: 50 Department Name: Shipping 
--------------------------------------------- 
--------------------------------------------- 
Department Number: 60 Department Name: IT 
--------------------------------------------- 
Hunold IT_PROG 03-JAN-06 9000 
Ernst IT_PROG 21-MAY-07 6000 
Austin IT_PROG 25-JUN-05 4800 
Pataballa IT_PROG 05-FEB-06 4800 
Lorentz IT_PROG 07-FEB-07 4200 
--------------------------------------------- 
Department Number: 70 Department Name: Public Relations 
--------------------------------------------- 
--------------------------------------------- 
Department Number: 80 Department Name: Sales 
--------------------------------------------- 
--------------------------------------------- 
Department Number: 90 Department Name: Executive 
--------------------------------------------- 
King AD_PRES 17-JUN-03 24000 
Kochhar AD_VP 21-SEP-05 17000 
De Haan AD_VP 13-JAN-01 17000 
--------------------------------------------- 

,从性能的角度来看,你会更好的服务来连接两个表,而不是写你自己的嵌套循环在PL/SQL中。

2

你需要的是一个游标变量:

cursor emp_cursor (v_dept_id number) is 
    select last_name, job_id, hire_date, salary 
    from employees 
    where employee_id < 120 and department_id = v_dept_id; 

然后:

for rec_emp in emp_cursor loop 

变为:

for rec_emp in emp_cursor(rec_dept.department_id) loop