PL/SQL 遊標

Ryan_Bai發表於2019-11-14

一、說明

遊標字面理解就是遊動的游標。

用資料庫語言來描述:遊標是對映在結果集中一行資料上的位置實體,有了遊標使用者就可以訪問結果集中的任意一行資料了,將遊標放置到某行後,即可對該行資料進行操作,例如提取當前行的資料等等。

二、分類

  • 顯式遊標

    用CURSOR...IS 命令定義的遊標,它可以對查詢語句(SELECT)返回的多條記錄進行處理。

  • 隱式遊標

    是在執行插入(INSERT)、刪除(DELETE)、修改(UPDATE)和返回單條記錄的查詢(SELECT)語句時有PL/SQL自動定義的。

三、屬性

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

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

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

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

四、使用

  • 宣告遊標

    CURSOR emp_info(vartype number) is select * from emp;

  • 開啟遊標

    open emp_info;

  • 讀取遊標

    fetch mycur into varno,varprice;

  • 關閉遊標

    close emp_info;

五、顯示遊標遍歷

  1. 方法一

    DECLARE  
      V_EMP_INFO EMP%ROWTYPE;  
      CURSOR EMP_INFO IS  
        SELECT * FROM EMP;   --1、宣告遊標  
    BEGIN  
      OPEN EMP_INFO;         --2、開啟遊標,傳遞引數值    
      LOOP  
        FETCH EMP_INFO INTO V_EMP_INFO;   --3、提取遊標fetch into    
        IF EMP_INFO%FOUND THEN  
          DBMS_OUTPUT.PUT_LINE(V_EMP_INFO.ENAME || '的僱傭日期是' ||  
                               V_EMP_INFO.HIREDATE);  
        ELSE  
          DBMS_OUTPUT.PUT_LINE('已經處理完結果集了');  
          EXIT;  
        END IF;  
      END LOOP;  
      CLOSE EMP_INFO;       --4、關閉遊標  
    END;
  2. 方法二

    DECLARE  
      V_EMP_INFO EMP%ROWTYPE;  
      CURSOR EMP_INFO IS  
        SELECT * FROM EMP; --1、宣告遊標  
    BEGIN  
      OPEN EMP_INFO; --2、開啟遊標,傳遞引數值    
      LOOP  
        FETCH EMP_INFO INTO V_EMP_INFO; --3、提取遊標fetch into  
        EXIT WHEN EMP_INFO%NOTFOUND;  
        DBMS_OUTPUT.PUT_LINE(V_EMP_INFO.ENAME || '的僱傭日期是' ||  
                             V_EMP_INFO.HIREDATE);  
      END LOOP;  
      DBMS_OUTPUT.PUT_LINE('已經處理完結果集了');  
      CLOSE EMP_INFO; --4、關閉遊標  
    END;
    /
  3. 方法三

    DECLARE  
      V_EMP_INFO EMP%ROWTYPE;  
      CURSOR EMP_INFO IS  
        SELECT * FROM EMP; --1、宣告遊標  
    BEGIN  
      FOR V_EMP_INFO IN EMP_INFO LOOP  
        DBMS_OUTPUT.PUT_LINE(V_EMP_INFO.ENAME || '的僱傭日期是' ||  
                             V_EMP_INFO.HIREDATE);  
      END LOOP;  
      DBMS_OUTPUT.PUT_LINE('已經處理完結果集了');  
    END;  
    /

六、隱式遊標處理

DECLARE  
  V_EMP_INFO EMP%ROWTYPE;  
BEGIN  
  SELECT * INTO V_EMP_INFO FROM EMP WHERE ename='SMITH';  
  IF SQL%FOUND THEN  
    DBMS_OUTPUT.PUT_LINE(V_EMP_INFO.ENAME || '的僱傭日期是' ||  
                         V_EMP_INFO.HIREDATE);  
  END IF;  
  DBMS_OUTPUT.PUT_LINE('已經處理完結果集了');  
END; 
/

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31490526/viewspace-2664199/,如需轉載,請註明出處,否則將追究法律責任。

相關文章