一)游标:
            1)每次声明、打开、推进、关闭游标
declare
cursor c is select .........;--声明
begin
open c;--打开
loop
exit when..........;
fetch c into .........;--推进
......
.....
end loop;
close c;--关闭
end;
             2)使用游标变量更加简洁
declare
cursor c is select..........;声明
begin
for rec_c in c loop      --打开、推进、关闭 全包括
exit when......
end loop;
end;
3)动态游标;
             declare
type c_ref is ref cursor;    ---------------------声明动态游标
v_c_ref c_ref;                  -----------------------定义一个动态游标
type rec is record(          ------------------------声明记录
id   sun_department.id%type,                       
department  sun_department.department%type);
v_rec rec;                              --------------------定义一个记录;
begin
open v_c_ref for                          --------------------打开动态游标并付集合值
select id,department from sun_department where id<100;
fetch v_c_ref into v_rec;                                 -------------将游标起到记录中
while v_c_ref%found loop                               ----------------------只要游标中有值就一直输出;
dbms_output.put_line(v_rec.id||'   '||v_rec.department);
fetch  v_c_ref into v_rec;                                 ---------------------游标的取出值放到记录中;
end loop;                                                  
close v_c_ref;
end;
二)过程
create or replace procedure test_p(id in number,name out varchar2)----参数in out in out
is
i number:=0; -----------------------------------------------无declare 为局部变量;
cursor c is select sun.name from sun where sun.id=id;
begin
for v_c in c ----------------------------------------------------------游标变量;
loop
name:=v_c.name;
-- dbms_output.put_line('name'||name);
end loop;
end test_p;
三)函数
create or replace function test_f(id in number,name out varchar2)
return number is ----------------------------------------------return 类型
i number:=0;
val number;
cursor c is select s.id from sun.department s where id<10 for update of id;
begin
open c;
loop
fetch c into val;
if (c%rowcount<>0)then
update sun_department set id:=100 where current of c;
else
update sun_department set id:=1 where current of c;
end if;
i:=c%rowcount
end loop;
end;
end;
四)包
      
create or replace package pack_test        --package specification start--
is
   type get_test_cursor is ref cursor;      --定义动态游标
   function getcur return get_test_cursor;  --函数声明【函数返回类型为动态游标】
end pack_test;                             
/                                          --package specification  end--
create or replace package body pack_test   --package body start --
is
  function getcur return get_test_cursor 
  is
    mycur get_test_cursor;                 --用动态游标定义变量
  begin
    open mycur                             --打开并与具体数据关联
    for select * from  sun_department;
    return mycur;                          --返回游标
  end getcur;
end pack_test;
/                                          --package body end --
declare                                  -- package test start --
    testcur pack_test.get_test_cursor;
    temp  sun_department%rowtype;                    --记录变量定义
  begin
    testcur := pack_test.getcur();       --方法调用
    loop
      fetch testcur  into temp;
         dbms_output.put_line(temp.id || ' : ' ||  temp.department);
      exit when testcur%notfound;
    end loop;
    close testcur;
end;
/                                        -- package test end --