Oracle PL / SQL справочный курсор, как - PullRequest
2 голосов
/ 16 февраля 2012

Я пытаюсь создать блок pl / sql, который использует ссылки.По сути, это то, что я получил до сих пор.Они оба работают как отдельные курсоры.Я нахожу это немного сложным с ссылкой.Что мне нужно, это перечислить название отдела, затем перейти к emp_cursor и перечислить всех сотрудников, которые находятся в этом отделе, в департаменте_ид = внешний курсор отдела _ид.

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
----------------------------------------------------------------------------------------

Ответы [ 2 ]

2 голосов
/ 16 февраля 2012

Вам нужна переменная курсора:

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
1 голос
/ 16 февраля 2012

Вы можете объявить 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...