0

このコードで何が起こっているのかよくわかりません。理解したいので、試してみましたが、理解するのではなく暗記しているようです。

create or replace type t_num_table as table of number INDEX BY BINARY_INTEGER;

create or replace PROCEDURE pro_return_table
(DEP_ID IN NUMBER,
emp_tab1 OUT t_num_table,
emp_tab2 OUT t_num_table
) as
emp_id number;
cursor emp_cursor is select employee_id from employees where department_id = DEP_ID;
begin
emp_tab1  := t_num_table();
emp_tab2  := t_num_table();
OPEN emp_cursor;
FETCH emp_cursor INTO emp_id;
emp_tab1.extend;
emp_tab1(emp_tab1.count) := emp_id;
emp_tab2.extend;
emp_tab2(emp_tab2.count) := emp_id+2;
WHILE (emp_cursor%FOUND)
LOOP
FETCH emp_cursor INTO emp_id;
emp_tab1.extend;
emp_tab1(emp_tab1.count) := emp_id;
emp_tab2.extend;
emp_tab2(emp_tab2.count) := emp_id+2;
END LOOP;
CLOSE emp_cursor;
end;

最初の行もわかりません () を t_num_table の後に置くことの意味、 emp_tab1 から emp_tab2 に移動するとき、なぜ彼は 2 移動するのか、この関数は何を返す必要がありますか。助けてください、私はとても出発しました。

4

2 に答える 2

0

関数は、部門で従業員 ID の 2 つのコレクションを構築するようDEP_IDです。この関数にはいくつかの問題があります。たとえば、従業員テーブルで何も見つからない場合、最初のフェッチ、拡張などは何もしません。この関数を次のように書き換えることができます

create or replace procedure pro_return_table
(
  dep_id   in  number,
  emp_tab1 out t_num_table,
  emp_tab2 out t_num_table
) 
as
begin 

  select employee_id , employee_id + 2 
  bulk collect into emp_tab1 , emp_tab2
  from employees 
  where department_id = dep_id;

exception when NO_DATA_FOUND then
  raise_application_error(-20001 , 'Department ' || dep_id || ' not found.');
end;

についてはわかりませんemployee_id + 2。これは、ある種の応用問題のように見えます。

お役に立てれば。

于 2013-05-22T14:51:54.950 に答える