oracle如何存儲(chǔ)游標(biāo) oracle存儲(chǔ)過程定義游標(biāo)

Oracle游標(biāo)使用總結(jié)

Oracle游標(biāo)分為顯示游標(biāo)和隱式游標(biāo)

創(chuàng)新互聯(lián)為客戶提供專業(yè)的網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站、程序、域名、空間一條龍服務(wù),提供基于WEB的系統(tǒng)開發(fā). 服務(wù)項(xiàng)目涵蓋了網(wǎng)頁(yè)設(shè)計(jì)、網(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語(yǔ)句時(shí) Oracle系統(tǒng)自動(dòng)分配的游標(biāo)

一 顯示游標(biāo)

使用步驟

( )定義 ( )打開 ( )使用 ( )關(guān)閉

使用演示

首先創(chuàng)建測(cè)試用表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;

自動(dòng)關(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語(yǔ)句在上下文區(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語(yǔ)句的執(zhí)行結(jié)果決定是否需要插入新記錄 CREATE TABLE STUDENT (

STUNAME VARCHAR ( BYTE)

STUNO VARCHAR ( BYTE)

AGE NUMBER

GENDER VARCHAR ( CHAR)

lishixinzhi/Article/program/Oracle/201311/17531

Oracle存儲(chǔ)過程游標(biāo)for循環(huán)怎么寫

--數(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;

oracle存儲(chǔ)過程游標(biāo)問題

--打開游標(biāo)并提取后面SQL的第一行數(shù)據(jù)放到游標(biāo)中 這里就是打開游標(biāo)

open for 是隱式游標(biāo)的寫法 不建議使用 這種游標(biāo)好象不需要關(guān)閉 具體你自己測(cè)試下 而且少了expection 處理

fetch mycur into yang_02;

--循環(huán)插入數(shù)據(jù)

多余了 可以不要 前面有fetch了如果還有這里的話 就只能插入奇數(shù)行

其他沒什么問題了 還有你這個(gè)過程用ref cursor是浪費(fèi) 沒必要用 用簡(jiǎn)單的顯示游標(biāo)更好點(diǎn)

oracle 存儲(chǔ)過程 游標(biāo)

你游標(biāo)木有定義把,一般都是這樣寫的.還有你的列名是a1,前面加了個(gè)限定t是把?如果加限定的話,那在from后面的數(shù)據(jù)來源表,就需要標(biāo)明那個(gè)表是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)頭我都是那么寫,沒有問題。

網(wǎng)站題目:oracle如何存儲(chǔ)游標(biāo) oracle存儲(chǔ)過程定義游標(biāo)
分享路徑:http://muchs.cn/article46/hjshhg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、云服務(wù)器定制開發(fā)、外貿(mào)網(wǎng)站建設(shè)、服務(wù)器托管虛擬主機(jī)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司