21、游標(biāo)

游標(biāo)是一種 PL/SQL 控制結(jié)構(gòu);可以對 SQL 語句的處理進(jìn)行顯示控制,便于對表的行數(shù)據(jù)逐條進(jìn)行處理。

游標(biāo)并不是一個數(shù)據(jù)庫對象,只是存留在內(nèi)存中


操作步驟:

??聲明游標(biāo)

??打開游標(biāo)

??取出結(jié)果,此時的結(jié)果取出的是一行數(shù)據(jù)

??關(guān)閉游標(biāo)到底那種類型可以把一行的數(shù)據(jù)都裝進(jìn)來

??此時使用 ROWTYPE 類型,此類型表示可以把一行的數(shù)據(jù)都裝進(jìn)來。



?游標(biāo)的屬性

?oracle游標(biāo)有4個屬性: %ISOPEN , %FOUND , %NOTFOUND,%ROWCOUNT

--%ISOPEN 判斷游標(biāo)是否被打開,如果打開%ISOPEN 等于true,否則等于false

--%FOUND %NOTFOUND 判斷游標(biāo)所在的行是否有效,如果有效,則%FOUNDD等于true,否則等于false

-- %ROWCOUNT 返回當(dāng)前位置為止游標(biāo)讀取的記錄行數(shù)。


例子

查詢雇員編號為 7369 的信息(肯定是一行信息)。

DECLARE

??eno emp.empno%TYPE ;?

empInfo emp%ROWTYPE ;

BEGIN?

eno := &en ;

SELECT * INTO empInfo FROM emp WHERE empno=eno ;?

DBMS_OUTPUT.put_line('雇員編號:'||empInfo.empno) ;

DBMS_OUTPUT.put_line('雇員姓名:'||empInfo.ename) ;

END ;


使用 for 循環(huán)操作游標(biāo)(比較常用)

DECLARE

? -- 聲明游標(biāo)?

? CURSOR mycur IS? ? SELECT * FROM emp where empno = -1;

? empInfo emp%ROWTYPE;

? cou???? NUMBER;

BEGIN

? -- 游標(biāo)操作使用循環(huán),但是在操作之前必須先將游標(biāo)打開

? FOR empInfo IN mycur LOOP

??? cou := mycur%ROWCOUNT;

??? DBMS_OUTPUT.put_line(cou ||'雇員編號:'|| empInfo.empno);

??? DBMS_OUTPUT.put_line(cou ||'雇員姓名:'|| empInfo.ename);

? END LOOP;

END;



編寫第一個游標(biāo),輸出全部的信息

DECLARE

? -- 聲明游標(biāo)

? CURSOR mycur IS

??? SELECT * FROMemp;

? -- List (EmpPo)

? empInfo emp%ROWTYPE;

BEGIN

? -- 游標(biāo)操作使用循環(huán),但是在操作之前必須先將游標(biāo)打開

? OPEN mycur;

? -- 使游標(biāo)向下一行

? FETCH mycur INTO empInfo;

? -- 判斷此行是否有數(shù)據(jù)被發(fā)現(xiàn)??

? WHILE (mycur%FOUND) LOOP

??? DBMS_OUTPUT.put_line('雇員編號:'|| empInfo.empno);

??? DBMS_OUTPUT.put_line('雇員姓名:'|| empInfo.ename);

??? -- 修改游標(biāo),繼續(xù)向下??????????????

??? FETCH mycur? ? ?INTO empInfo;

? END LOOP;

END;



也可以使用另外一種方式循環(huán)游標(biāo):LOOP…END LOOP

DECLARE

? -- 聲明游標(biāo)

? CURSOR mycur IS

??? SELECT * FROMemp;

? empInfo emp%ROWTYPE;

BEGIN

? -- 游標(biāo)操作使用循環(huán),但是在操作之前必須先將游標(biāo)打開?

? OPEN mycur;

? LOOP

??? -- 使游標(biāo)向下一行

??? FETCH mycur? ? ?INTOempInfo;

??? EXIT WHEN mycur%NOTFOUND;

??? DBMS_OUTPUT.put_line('雇員編號:'|| empInfo.empno);

??? DBMS_OUTPUT.put_line('雇員姓名:'|| empInfo.ename);

? END LOOP;

END;


注意 1:

?在打開游標(biāo)之前最好先判斷游標(biāo)是否已經(jīng)是打開的。?

通過 ISOPEN 判斷,

格式:游標(biāo)%ISOPEN

?IFmycur%ISOPEN THEN?? null ;

?ELSE??OPEN mycur ;

?ENDIF ;



注意 2:?

可以使用 ROWCOUNT 對游標(biāo)所操作的行數(shù)進(jìn)行記錄。

DECLARE

? -- 聲明游標(biāo)

? CURSOR mycur IS

??? SELECT * FROMemp;

? empInfo emp%ROWTYPE;

? cou???? NUMBER;

BEGIN

? -- 游標(biāo)操作使用循環(huán),但是在操作之前必須先將游標(biāo)打開

? IF mycur%ISOPEN THEN

??? null;

? ELSE

??? OPENmycur;

? END IF;

? LOOP

??? -- 使游標(biāo)向下一行?

??? FETCH mycur? ?INTO empInfo;

??? EXIT WHEN mycur%NOTFOUND;

??? cou := mycur%ROWCOUNT;

??? DBMS_OUTPUT.put_line(cou ||'雇員編號:'|| empInfo.empno);

??? DBMS_OUTPUT.put_line(cou ||'雇員姓名:'|| empInfo.ename);

? END LOOP;

END;


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ORACLE自學(xué)教程 --create tabletestone ( id number, --序號usernam...
    落葉寂聊閱讀 1,242評論 0 0
  • 1.PLSQL入門 Oracle數(shù)據(jù)庫對SQL進(jìn)行了擴展,然后加入了一些編程語言的特點,可以對SQL的執(zhí)行過程進(jìn)行...
    隨手點燈閱讀 687評論 0 8
  • plsql語句塊: set serveroutput on; //打開控制臺輸出的命令 語法: declare 聲...
    Qing勇閱讀 1,102評論 0 0
  • 自從笑來老師鼓勵大家踐行坐享,本人開始關(guān)注冥想,購買并閱讀了幾本這類書籍。說來也很有意思,自從關(guān)注它,就總能有意無...
    踐行哲閱讀 821評論 1 1
  • 單位煤炭用完,無法做飯,自古就有巧婦難為無米之炊,沒火也還是很難的,和幾個戰(zhàn)友一起被派去拾柴,給炊事班生火做...
    似冰的夢閱讀 431評論 5 7

友情鏈接更多精彩內(nèi)容