(1).使用WHILE循環(huán)處理游標(biāo) create or replace PROCEDURE PROC_STU1 AS BEGIN --顯示游標(biāo)使用,使用while循環(huán) declare --1.定義游標(biāo),名稱為cur_stu cursor cur_stu is select stuno,stuname from student order by stuno; --定義變量,存放游標(biāo)取出的數(shù)據(jù) v_stuno varchar(4); v_stuname varchar(20); begin --2.打開游標(biāo)cur_stu open cur_stu; --3.將游標(biāo)的當(dāng)前行取出存放到變量中 fetch cur_stu into v_stuno,v_stuname; while cur_stu%found --游標(biāo)所指還有數(shù)據(jù)行,則繼續(xù)循環(huán) loop --打印結(jié)果 dbms_output.PUT_LINE(v_stuno||'->'||v_stuname); --繼續(xù)將游標(biāo)所指的當(dāng)前行取出放到變量中 fetch cur_stu into v_stuno,v_stuname; end loop; close cur_stu; --4.關(guān)閉游標(biāo) end; END PROC_STU1; (2).使用IF..ELSE代替WHILE循環(huán)處理游標(biāo) create or replace PROCEDURE PROC_STU2 AS BEGIN --顯示游標(biāo)使用,使用if判斷 declare --1.定義游標(biāo),名稱為cur_stu cursor cur_stu is select stuno,stuname from student order by stuno; --定義變量,存放游標(biāo)取出的數(shù)據(jù) v_stuno varchar(4); v_stuname varchar(20); begin --2.打開游標(biāo)cur_stu open cur_stu; --3.將游標(biāo)的當(dāng)前行取出存放到變量中 fetch cur_stu into v_stuno,v_stuname; loop if cur_stu%found then --如果游標(biāo)cur_stu所指還有數(shù)據(jù)行 --打印結(jié)果 dbms_output.PUT_LINE(v_stuno||'->'||v_stuname); --繼續(xù)將游標(biāo)所指的當(dāng)前行取出放到變量中 fetch cur_stu into v_stuno,v_stuname; else exit; end if; end loop; close cur_stu; --4.關(guān)閉游標(biāo) end; END PROC_STU2; (3).使用FOR循環(huán)處理游標(biāo) create or replace PROCEDURE PROC_STU3 AS BEGIN --顯示游標(biāo)使用,使用for循環(huán) declare --定義游標(biāo),名稱為cur_stu cursor cur_stu is select stuno,stuname from student order by stuno; begin for stu in cur_stu loop dbms_output.PUT_LINE(stu.stuno||'->'||stu.stuname); --循環(huán)做隱含檢查 %notfound end loop; --自動(dòng)關(guān)閉游標(biāo) end; END PROC_STU3; (4).常用的使用EXIT WHEN處理游標(biāo) create or replace PROCEDURE PROC_STU1_1 AS BEGIN --顯示游標(biāo)使用,使用exit when循環(huán) declare --1.定義游標(biāo),名稱為cur_stu cursor cur_stu is select stuno,stuname from student order by stuno; --定義變量,存放游標(biāo)取出的數(shù)據(jù) v_stuno varchar(4); v_stuname varchar(20); begin --2.打開游標(biāo)cur_stu open cur_stu; loop --3.將游標(biāo)的當(dāng)前行取出存放到變量中 fetch cur_stu into v_stuno,v_stuname; exit when cur_stu%notfound; --游標(biāo)所指還有數(shù)據(jù)行,則繼續(xù)循環(huán) --打印結(jié)果 dbms_output.PUT_LINE(v_stuno||'->'||v_stuname); end loop; close cur_stu; --4.關(guān)閉游標(biāo) end; END PROC_STU1_1; 二.隱式游標(biāo) 1.使用演示 create or replace PROCEDURE PROC_STU4 AS BEGIN --隱式游標(biāo)使用 update student set stuname='張燕廣' where stuno='1104'; --如果更新沒有匹配則插入一條新記錄 if SQL%NOTFOUND then insert into student(STUNO,STUNAME,AGE,GENDER) values('1104','張燕廣',18,'男'); end if; END PROC_STU4; 2.說明 所有的SQL語句在上下文區(qū)內(nèi)部都是可執(zhí)行的,因?yàn)槎加幸粋€(gè)游標(biāo)指向上下文區(qū),此游標(biāo)就是 SQL游標(biāo),與現(xiàn)實(shí)游標(biāo)不同的是,SQL游標(biāo)在PL/SQL中不需要打開和關(guān)閉,而是在執(zhí)行UPDATE、 DELETE是自動(dòng)打開和關(guān)閉。 上面例子中就是通過SQL%NOTFOUND游標(biāo)屬性判斷UPDATE語句的執(zhí)行結(jié)果決定是否需要插入新記錄。