----4.7 ref游标(loop循环)
/***
怎么使用 REF游标 ?
①声明REF 游标类型,确定REF 游标类型;
⑴强类型REF游标:指定retrun type,REF 游标变量的类型必须和return type一致。
语法:Type REF游标名 IS Ref Cursor Return 结果集返回记录类型;
⑵弱类型REF游标:不指定return type,能和任何类型的CURSOR变量匹配,用于获取任何结果集。
语法:Type REF游标名 IS Ref Cursor;
②声明Ref 游标类型变量;
语法:变量名 已声明Ref 游标类型;
③打开REF游标,关联结果集 ;
语法:Open Ref 游标类型变量 For 查询语句返回结果集;
④获取记录,操作记录;
语法:Fetch REF游标名 InTo 临时记录类型变量或属性类型变量列表;
⑤关闭游标,完全释放资源;
语法:Close REF游标名;
能够使用ref弱类型REF游标就不要使用强类型REF游标
***/
--案例1:ref弱类型游标:loop循环
create or replace procedure proc_select8
(
choice in varchar2
)
as
TYPE cur IS REF CURSOR; --声明游标类型为ref
a cur; --声明变量为ref游标类型
osname t1%rowtype;
begin
if choice='full' then
open a for select * from t1;
loop
fetch a into osname;
exit when a%notfound;
dbms_output.put_line( '职工的编号为:'||osname.sid||';'||'的职工姓名为 '||osname.sname );
end loop;
elsif choice='top' then
open a for select * from t1 where rownum<10;
loop
fetch a into osname;
exit when a%notfound;
dbms_output.put_line( '职工的编号为:'||osname.sid||';'||'的职工姓名为 '||osname.sname );
end loop;
else
dbms_output.put_line('请输入正确值full或top!谢谢配合!');
return;
end if;
close a;
end;
set serveroutput on
exec proc_select8('full') ;
exec proc_select8('top') ;
--案例2:ref强类型游标:loop循环
create or replace procedure proc_select9
as
TYPE cur IS REF CURSOR RETURN t1%RowType; --声明游标类型为ref
a cur; --声明变量为ref游标类型
osname t1%rowtype;
begin
open a for select * from t1;
loop
fetch a into osname;
exit when a%notfound;
dbms_output.put_line( '职工的编号为:'||osname.sid||';'||'的职工姓名为 '||osname.sname );
end loop;
close a;
end;
set serveroutput on
exec proc_select9 ;