Oracle中,遊標是操作資料最常用,也是最有效方法.
根據Oracle遊標的聲明方法不同,可以將Oracle的遊標分為顯式和隱式兩種.
顯式遊標就是有明確聲明的遊標,顯式遊標的操作主要有如下幾類:
第一,遊標的聲明:
聲明遊標時,要用關鍵字 CURSOR ,
如 CURSOR CUR_SAMPLE IS SELECT * FROM TAB;
其中,CURSOR, IS 為關鍵字, CUR_SAMPLE 為遊標名稱,後面的 SELECT 語句是與遊標關聯的查詢語句.這幾部分不能少.
第二,參數傳遞:
在聲明遊標時,不僅可以使用上面的方法:
CURSOR CUR_SAMPLE IS SELECT * FROM TAB;
同時,也可以給遊標傳遞參數,
CURSOR CUR_SAMPLE(PAR_TABLENAME VARCHAR2(24)) IS SELECT * FROM TAB WHERE TNAME = PAR_TABLENAME;
給遊標傳遞的參數可以是多個,也可以是不同的類型.但是參數只能傳入,不能傳出.
在指定參數的同時,可以同時設定預設值.
如: CURSOR CUR_SAMPLE(PAR_TABLENAME VARCHAR2(24) DEFAULT 'EMPLOYEES') IS SELECT * FROM TAB WHERE TNAME = PAR_TABLENAME;
第三,聲明遊標變數
用下面的方法聲明一個遊標:
CURSOR CUR_SAMPLE IS SELECT * FROM TAB;
但在使用遊標時,必段要聲明遊標變數或其它變數,存放從遊標中取出的資料:
遊標變數類型可以有兩種:
(1) 定義遊標類型的變數:
C_SMAPLE CUR_SAMPLE%ROWTYPE;
(2)
聲明一個變數列表:
M_TNAME VARCHAR2(30);
M_TABTYPE VARCHAR2(7);
M_CLUSTERID NUMBER(5);
第四,開啟遊標
在操作資料之前,首先要開啟遊標:
先聲明一個遊標:
CURSOR CUR_SAMPLE IS SELECT * FROM TAB;
然後再開啟:
OPEN CUR_SAMPLE;
對於有參數的遊標,在開啟時,需要同時傳遞參數:
如遊標聲明如下:
CURSOR CUR_SAMPLE(PAR_TABLENAME VARCHAR2(24) DEFAULT 'EMPLOYEES') IS SELECT * FROM TAB WHERE TNAME = PAR_TABLENAME;
開啟方法如下:
OPEN CUR_SAMPLE('EMPLOYEES');
但時,如果參數有預設值,並且想使用預設值,可以直接:
OPEN CUR_SAMPLE;
此時,PAR_TABLENAME值等於'EMPLOYEES',也就是相當於
OPEN CUR_SAMPLE('EMPLOYEES');
但是如果開啟一個已經開啟的遊標,會報錯:
ORA-06511:PL/SQL:cursor already open;
OPEN 一個遊標時,遊標的指標自動的指向活動集的第一條記錄.
第五,讀取遊標資料:
讀取資料之前,遊標一定要先開啟:
需要傳遞參數的,用參數開啟,不需要參數的,可以直接開啟.
讀取資料也就是用 FETCH 方法把資料讀取到變數中.
對於遊標類型的變數,可以用下面的方法: (遊標參數的定義請看第三)
FETCH CUR_SAMPLE INTO C_SAMPLE;
也可以
FETCH CUR_SMALE INTO M_TNAME,M_TABTYPE,M_CLUSTERID;
使用變數列表時,變數列表的順序一定要和遊標活動結果集中的欄位順序相同.
如果用遊標類型的變數時,用以下的方法訪問其中的值:
C_SMAPLE.TNAME,C_SAMPLE.TABTYPE,C_SAMPLE.CLUSTERID;
對於用變數列表的方法,直接使用變數名稱就可以了.
執行 FETCH 一次,遊標指標自動的移到下一條記錄.
第六,關閉遊標:
關閉遊標最簡單,直接
CLOSE 遊標名; 就可以了.
如對遊標:
CURSOR CUR_SAMPLE IS SELECT * FROM TAB;
就可以:
CLOSE CUR_SAMPLE;
遊標是否有參數,關閉方法相同.
使用遊標可以極大方便PL/SQL的編寫,但遊標也比較特殊,如遊標資料只能用FETCH來讀取,遊標指標的移動在FETCH資料時,自動的移到下一條,遊標開啟時,遊標指標自動的指向第一條記錄,另外,遊標是用靜態方法開啟的,也就是遊標開啟後,如果相關表執行DML(DELETE, INSERT, UPDATE)操作,其操作結果是不能反映到遊標中來的,只能先關閉遊標,再開啟遊標,才可以更新遊標活動集的資料.