Oracle游標(biāo)分為顯示游標(biāo)和隱式游標(biāo)
創(chuàng)新互聯(lián)為客戶提供專業(yè)的網(wǎng)站設(shè)計制作、成都做網(wǎng)站、程序、域名、空間一條龍服務(wù),提供基于WEB的系統(tǒng)開發(fā). 服務(wù)項目涵蓋了網(wǎng)頁設(shè)計、網(wǎng)站程序開發(fā)、WEB系統(tǒng)開發(fā)、微信二次開發(fā)、成都手機(jī)網(wǎng)站制作等網(wǎng)站方面業(yè)務(wù)。
顯示游標(biāo)(Explicit Cursor):在PL/SQL程序中定義的 用于查詢的游標(biāo)稱作顯示游標(biāo)
隱式游標(biāo)(Implicit Cursor):是指非PL/SQL程序中定義的 而且是在PL/SQL中使用UPDATE/DELETE語句時 Oracle系統(tǒng)自動分配的游標(biāo)
一 顯示游標(biāo)
使用步驟
( )定義 ( )打開 ( )使用 ( )關(guān)閉
使用演示
首先創(chuàng)建測試用表STUDENT 腳本如下
( ) 使用WHILE循環(huán)處理游標(biāo)
create or replace PROCEDURE PROC_STU AS
BEGIN
顯示游標(biāo)使用 使用while循環(huán)
declare
定義游標(biāo) 名稱為cur_stu
cursor cur_stu is
select stuno stuname from student order by stuno;
定義變量 存放游標(biāo)取出的數(shù)據(jù)
v_stuno varchar( );
v_stuname varchar( );
begin
打開游標(biāo)cur_stu
open cur_stu;
將游標(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; 關(guān)閉游標(biāo)
end;
END PROC_STU ;
( ) 使用IF ELSE代替WHILE循環(huán)處理游標(biāo)
create or replace PROCEDURE PROC_STU AS
BEGIN
顯示游標(biāo)使用 使用if判斷
declare
定義游標(biāo) 名稱為cur_stu
cursor cur_stu is
select stuno stuname from student order by stuno;
定義變量 存放游標(biāo)取出的數(shù)據(jù)
v_stuno varchar( );
v_stuname varchar( );
begin
打開游標(biāo)cur_stu
open cur_stu;
將游標(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; 關(guān)閉游標(biāo)
end;
END PROC_STU ;
( ) 使用FOR循環(huán)處理游標(biāo)
create or replace PROCEDURE PROC_STU 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;
自動關(guān)閉游標(biāo)
end;
END PROC_STU ;
( ) 常用的使用EXIT WHEN處理游標(biāo)
create or replace
PROCEDURE PROC_STU _ AS
BEGIN
顯示游標(biāo)使用 使用exit when循環(huán)
declare
定義游標(biāo) 名稱為cur_stu
cursor cur_stu is
select stuno stuname from student order by stuno;
定義變量 存放游標(biāo)取出的數(shù)據(jù)
v_stuno varchar( );
v_stuname varchar( );
begin
打開游標(biāo)cur_stu
open cur_stu;
loop
將游標(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; 關(guān)閉游標(biāo)
end;
END PROC_STU _ ;
二 隱式游標(biāo)
使用演示
create or replace PROCEDURE PROC_STU AS
BEGIN
隱式游標(biāo)使用
update student set stuname= 張燕廣 where stuno= ;
如果更新沒有匹配則插入一條新記錄
if SQL%NOTFOUND then
insert into student(STUNO STUNAME AGE GENDER)
values( 張燕廣 男 );
end if;
END PROC_STU ;
說明
所有的SQL語句在上下文區(qū)內(nèi)部都是可執(zhí)行的 因為都有一個游標(biāo)指向上下文區(qū) 此游標(biāo)就是
SQL游標(biāo) 與現(xiàn)實游標(biāo)不同的是 SQL游標(biāo)在PL/SQL中不需要打開和關(guān)閉 而是在執(zhí)行UPDATE
DELETE是自動打開和關(guān)閉
上面例子中就是通過SQL%NOTFOUND游標(biāo)屬性判斷UPDATE語句的執(zhí)行結(jié)果決定是否需要插入新記錄 CREATE TABLE STUDENT (
STUNAME VARCHAR ( BYTE)
STUNO VARCHAR ( BYTE)
AGE NUMBER
GENDER VARCHAR ( CHAR)
lishixinzhi/Article/program/Oracle/201311/17531
--數(shù)字
FOR?loop?index?IN?[REVERSE]?lowest?number?..?highest?number
LOOP
executable?statement(s)
END?LOOP;
具體情形:
FOR?loop_counter?IN?1?..?10
LOOP
...?executable?statements?...
END?LOOP;
--游標(biāo):
DECLARE
CURSOR?occupancy_cur?IS?
SELECT?pet_id,?room_number
FROM?occupancy?WHERE?occupied_dt?=?SYSDATE;
BEGIN
FOR?occupancy_rec?IN?occupancy_cur
LOOP
update_bill?(occupancy_rec.pet_id,?occupancy_rec.room_number);
END?LOOP;
END;
--打開游標(biāo)并提取后面SQL的第一行數(shù)據(jù)放到游標(biāo)中 這里就是打開游標(biāo)
open for 是隱式游標(biāo)的寫法 不建議使用 這種游標(biāo)好象不需要關(guān)閉 具體你自己測試下 而且少了expection 處理
fetch mycur into yang_02;
--循環(huán)插入數(shù)據(jù)
多余了 可以不要 前面有fetch了如果還有這里的話 就只能插入奇數(shù)行
其他沒什么問題了 還有你這個過程用ref cursor是浪費 沒必要用 用簡單的顯示游標(biāo)更好點
你游標(biāo)木有定義把,一般都是這樣寫的.還有你的列名是a1,前面加了個限定t是把?如果加限定的話,那在from后面的數(shù)據(jù)來源表,就需要標(biāo)明那個表是t.
vstr1 varchar2(100)
vstr2 varchar2(100)
declare r_cur cursor for select t.a1,t.a2 from abc t
open r_cur
fetch from r_cur into vstr1,vstr2
后面就是
while @@FETCH_STATUS = 0 .....等等不寫了。
反正游標(biāo)頭我都是那么寫,沒有問題。