不,如果游标返回具有多列的结果集,则不能将单列提取到记录以外的局部变量中。但是,您确实有一些选择。
如果您声明一个强类型游标而不是弱类型游标,您可以基于该游标定义声明您的局部变量,而不是声明一个新集合。
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;