本篇介紹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_id
及v_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
%NOTFOUND
是CURSOR屬性(Cursor Attribute),放在Cursor變數c1
後來取用,例如c1%NOTFOUND
,若fetch cursor時取不到任何資料則回傳TRUE
,若有取得資料則回傳FALSE
。
除了%NOTFOUND
,還有%FOUND
,%ISOPEN
及%ROWCOUNT
三個屬性。每一個Explicit Cursor都有這四種屬性來取得Cursor的資訊。
沒有留言:
張貼留言