十六、Oracle中的遊標

目錄

16.1. 什麼是遊標

16.2.  遊標的屬性


16.1. 什麼是遊標

遊標是一種 PL/SQL 控制結構;可以對 SQL 語句的處理進行顯示控制,便於對錶的行數據逐條進行處理。

遊標並不是一個數據庫對象,只是存留在內存中

 

操作步驟:

 •聲明遊標

 •打開遊標

 •取出結果,此時的結果取出的是一行數據

 •關閉遊標到底那種類型可以把一行的數據都裝進來

 •此時使用 ROWTYPE 類型,此類型表示可以把一行的數據都裝進來。

 


16.2.  遊標的屬性

 oracle遊標有4個屬性: %ISOPEN , %FOUND , %NOTFOUND,%ROWCOUNT

--%ISOPEN 判斷遊標是否被打開,如果打開%ISOPEN 等於true,否則等於false

--%FOUND %NOTFOUND 判斷遊標所在的行是否有效,如果有效,則%FOUNDD等於true,否則等於false

-- %ROWCOUNT 返回當前位置爲止遊標讀取的記錄行數。


例子

查詢僱員編號爲 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 循環操作遊標(比較常用)

DECLARE

  -- 聲明遊標 

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

  empInfo emp%ROWTYPE;

  cou     NUMBER;

BEGIN

  -- 遊標操作使用循環,但是在操作之前必須先將遊標打開

  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;


 

編寫第一個遊標,輸出全部的信息

DECLARE

  -- 聲明遊標

  CURSOR mycur IS

    SELECT * FROMemp;

  -- List (EmpPo)

  empInfo emp%ROWTYPE;

BEGIN

  -- 遊標操作使用循環,但是在操作之前必須先將遊標打開

  OPEN mycur;

  -- 使遊標向下一行

  FETCH mycur INTO empInfo;

  -- 判斷此行是否有數據被發現  

  WHILE (mycur%FOUND) LOOP

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

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

    -- 修改遊標,繼續向下              

    FETCH mycur     INTO empInfo;

  END LOOP;

END;


 

也可以使用另外一種方式循環遊標:LOOP…END LOOP

DECLARE

  -- 聲明遊標

  CURSOR mycur IS

    SELECT * FROMemp;

  empInfo emp%ROWTYPE;

BEGIN

  -- 遊標操作使用循環,但是在操作之前必須先將遊標打開 

  OPEN mycur;

  LOOP

    -- 使遊標向下一行

    FETCH mycur     INTOempInfo;

    EXIT WHEN mycur%NOTFOUND;

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

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

  END LOOP;

END;


注意 1:

 在打開遊標之前最好先判斷遊標是否已經是打開的。 

通過 ISOPEN 判斷,

格式:遊標%ISOPEN

 IFmycur%ISOPEN THEN   null ;

 ELSE  OPEN mycur ;

 ENDIF ;

 


注意 2: 

可以使用 ROWCOUNT 對遊標所操作的行數進行記錄。

DECLARE

  -- 聲明遊標

  CURSOR mycur IS

    SELECT * FROMemp;

  empInfo emp%ROWTYPE;

  cou     NUMBER;

BEGIN

  -- 遊標操作使用循環,但是在操作之前必須先將遊標打開

  IF mycur%ISOPEN THEN

    null;

  ELSE

    OPENmycur;

  END IF;

  LOOP

    -- 使遊標向下一行 

    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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章