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 集合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 回答
0

由于我不太了解您的目标,因此请简单地为您注释 proc 的代码。

没有从 emp_tab1 到 emp_tab2 的任何复制,只是填充了两个集合。

这是一个过程,而不是函数,并且不返回任何值。

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

  -- Create empty collections
  emp_tab1  := t_num_table();
  emp_tab2  := t_num_table();

  -- Execute query
  OPEN emp_cursor;

  -- Get first value returned by query into emp_id.
  -- Potentially bug because query result set may be empty.
  FETCH emp_cursor INTO emp_id;

  -- Add first element to  collection #1
  emp_tab1.extend;
  -- Put value of emp_id into first element of collection #1
  emp_tab1(emp_tab1.count) := emp_id;

  -- Add first element to  collection #2
  emp_tab2.extend;
  -- Put value of emp_id increased by 2 into first element of collection #2
  emp_tab2(emp_tab2.count) := emp_id+2;

  -- While record exists do actions inside a loop
  WHILE (emp_cursor%FOUND) LOOP

    -- Put next value from cursor into emp_id
    FETCH emp_cursor INTO emp_id;

    -- Add one element to the end of collection #1
    emp_tab1.extend;
    -- Put current value of emp_id into last element of collection #1
    emp_tab1(emp_tab1.count) := emp_id;

    -- Add one element to the end of collection #2
    emp_tab2.extend;
    -- Put current value of emp_id increased by 2 into last element of collection #2
    emp_tab2(emp_tab2.count) := emp_id+2;

  END LOOP;

  -- Release cursor
  CLOSE emp_cursor;
end;

在循环之前填充第一个元素完全没有用,可以跳过。

按周期填充收集无效,bulk collect用于此目的。

程序完全没用,因为不返回任何东西,也不改变任何外部的东西。

于 2013-05-22T14:57:10.313 回答