AdSense

網頁

2017/9/4

Oracle 如何使用Cursor

本篇介紹Oracle PL/SQL中Cursor的使用方式。

Cursor類似Java的ResultSet,你可以把Cursor想成是一塊暫存的資料表,裡面存放著SQL的查詢結果,所以透過Cursor我們便可以操作結果的每一列資料,但一次只能處理一列資料。

下面範例所使用的資料表USER_SCORE如下。

  USER_ID   SCORE  
 --------- ------- 
  1            98  
  2            87  
  3            56  
  4            73  
  5            41  
  6            82  

在宣告區建立v_user_idv_score變數來承接Cursor取出的資料,然後建立Cursor c1

DECLARE
    v_user_id VARCHAR2(3);
    v_score NUMBER(3,0);
      
    -- 宣告一個cursor
    CURSOR c1 IS               
        SELECT USER_ID, SCORE 
        FROM USER_SCORE 
        WHERE SCORE > 60;
BEGIN
    OPEN c1; -- fetch前要先開啟cursor
        LOOP
            FETCH c1 INTO v_user_id, v_score;
            EXIT WHEN c1%NOTFOUND;
            DBMS_OUTPUT.PUT_LINE('USER ID:' || v_user_id || ', SCORE:' || v_score );
        END LOOP;
    CLOSE c1; -- 關閉cursor
END;

印出結果為

USER ID:1, SCORE:98
USER ID:2, SCORE:87
USER ID:4, SCORE:73
USER ID:6, SCORE:82

c1的內容如下,決定於後面的SELECT USER_ID, SCORE FROM USER_SCORE WHERE SCORE > 60;

  USER_ID   SCORE  
 --------- ------- 
  1            98  
  2            87  
  4            73  
  6            82  

%NOTFOUNDCURSOR屬性(Cursor Attribute),放在Cursor變數c1後來取用,例如c1%NOTFOUND,若fetch cursor時取不到任何資料則回傳TRUE,若有取得資料則回傳FALSE

除了%NOTFOUND,還有%FOUND%ISOPEN%ROWCOUNT三個屬性。每一個Explicit Cursor都有這四種屬性來取得Cursor的資訊。

沒有留言:

AdSense