0

我在我的办公室运行 Oracle 9i 服务器。我正在研究将 sys_refcursor 作为输出参数传递给另一个包(以及其他输入参数)的过程。我能够将类型定义为被调用过程在游标中返回的各种列的记录。然后我可以用这样的代码循环:

LOOP
   fetch o_results into v_rec;
   exit when o_results%notfound;
   dbms_output.put_line(v_rec.some_id);
end loop;

有没有办法只拉一列而不必声明整个行类型?我试过类似的东西:

LOOP
  fetch o_results.some_id into v_id;
  exit when o_results%notfound;
  dbms_output.put_line(v_id);
end loop;

但这没有用。还有其他想法吗?

4

1 回答 1

1

不,如果游标返回具有多列的结果集,则不能将单列提取到记录以外的局部变量中。但是,您确实有一些选择。

如果您声明一个强类型游标而不是弱类型游标,您可以基于该游标定义声明您的局部变量,而不是声明一个新集合。

create or replace procedure cursor_proc
as
  cursor emp_cur
      is
   select empno, ename
     from emp;
  l_row emp_cur%rowtype;
begin
  open emp_cur;
  loop
    fetch emp_cur into l_row;
    exit when emp_cur%notfound;
    dbms_output.put_line( l_row.ename );
  end loop;
  close emp_cur;
end;

或者,如果您知道弱类型引用游标将始终返回特定对象中的所有列,您可以将局部变量声明锚定到该对象。您始终可以通过声明您的光标从中选择的视图来完成这项工作。例如

create or replace view vw_emp
as
select ename, empno
  from emp

create or replace procedure cursor_proc2
as
  emp_cur sys_refcursor;
  l_row   vw_emp%rowtype;
begin
  open emp_cur for select * from vw_emp;
  loop
    fetch emp_cur into l_row;
    exit when emp_cur%notfound;
    dbms_output.put_line( l_row.ename );
  end loop;
  close emp_cur;
end;

最后,如果使用隐式游标,Oracle 会隐式声明集合类型

create or replace procedure cursor_proc3
as
begin
  for emp in (select ename, empno from emp)
  loop
    dbms_output.put_line( emp.ename );
  end loop;
end;
于 2011-05-18T03:28:33.110 回答