遊標在運算元據庫時經常用到的。它使用相對靈活。遊標--資料的緩衝區。遊標的使用可以讓使用者像運算元組一樣操作查詢出來的資料集,這使得使用PL/SQL更加方便。實際上,它提供了一種從集合性質的結果中提取單條記錄的手段。
遊標的概念
可以將遊標(Cursor)形象地看做成一個變動的游標。它實際上是一個指標,它在一段Oracle存放資料查詢結果集或資料操作結果集的記憶體中,這個指標可以指向結果集中的任何一條記錄 。這樣就可以得到它所指向的資料了,但初始時它指向首記錄。這種模型很像程式語言中的陣列。
可以簡單的理解遊標為指向結果集記錄的指標,利用遊標可以把返回它當前指向 的行記錄(只能返回一行記錄)。如果要返回多行,那麼需要不斷滾動遊標,把想要的資料查詢一遍。使用者可以操作遊標所在位置行的記錄。
遊標的種類
Oracle中游標分為靜態遊標和REF遊標。其中,靜態遊標就像一個資料快照,開啟遊標後的結果集是對資料庫資料的一個備份,資料不隨著對錶執行DML操作而改變。從這個特性來說,結果集是靜態的。
靜態遊標包含如下兩種型別:
顯式遊標:是指在使用前必須有著明確的遊標宣告和定義,這樣的遊標定義會關聯資料查詢語句,通常會返回一行或多行。開啟遊標後,使用者可以利用遊標的位置對結果集進行檢索,使之返回單一的行記錄,使用者可以操作次記錄。關閉遊標後,就不能再對結果集進行任何操作。顯式遊標需要使用者自己寫程式碼完成,一切由使用者控制。
隱式遊標:和顯式遊標不同,它被PL/SQL自動管理,也被稱為PL/SQL遊標。由Oracle自動管理。該遊標使用者無法控制,但能得到它的屬性資訊。
顯式遊標
顯式遊標在PL/SQL程式設計中有著重要的作用,通過顯式遊標使用者可以操作返回的資料,使得一些在程式語言複雜的功能變得更容易實現。遊標的語法:
CURSOR cursor_name
[(parameter_name,dataTYPE,...)]
IS select_statement ;
語法說明:CURSOR : 宣告遊標關鍵字;cursor_name: 遊標的名字 ;
parameter_name: 引數名稱;dataTYPE: 引數型別;
select_statement :遊標關聯的SELECT語句,但該語句不能是SELECT....INTO ...語句
遊標使用步驟
顯式遊標的使用順序可以明確的分成宣告遊標、開啟遊標、讀取資料和關閉遊標4個步驟。
(1)宣告遊標
主要用來給遊標命名並且使得遊標關聯一個查詢。具體語句:
DECLARE
CURSOR stunames IS SELECT s.sname FROM student s ;
stuname student.sname%TYPE;
(2)開啟遊標
遊標 中任何對資料的操作都是建立在遊標被開啟的前提下。開啟遊標初始化了遊標指標,遊標一旦開啟,其結果集都是靜態的。也就是說,結果集此時不會反映出資料庫中對資料進行的增加、刪除和修改操作。語法:
OPEN stunames ;
(3)讀取資料
讀取資料需要使用FETCH語句完成,它可以把遊標執行位置的記錄放到 PL/SQL宣告的變數當中。它只能讀取指標當前行的記錄。正常情況下,FETCH要和迴圈語句一起使用,這樣指標會不斷前進,知道某個條件不符合要求而退出。使用FETCH時遊標屬性%ROWCOUNT會不斷累加。具體用法:
FETCH stunames INTO stuname ;
(4)關閉遊標
關閉某個名稱的遊標。此時釋放資源,結果集中的資料將不能做任何操作。
CLOSE stunames;
遊標中的LOOP語句
通常顯式遊標提取的資料不會是一條記錄,而是多條記錄。這樣就需要一個遍歷結果集的標準方法,而LOOP語句就能實現這樣的功能。
完整的示例:
使用BULK COLLECT 和FOR 語句的遊標
遊標中通常使用FETCH....INTO...語句提取資料,這種方式是單條資料提取,在資料量很大的情況下執行效率不是很理想。而FETCH.....BULK COLLECT INTO...語句可以批量提取資料,在資料量很大的情況下它的執行效率比單條提取資料的高。
使用CURSOR FOR LOOP
遊標很多機會都是迭代結果集,在PL/SQL這個過程中可以使用更簡單的方式實現,CURSOR FOR LOOP不需要特別的宣告變數,它可以提出行物件的資料
顯式遊標的屬性
利用遊標屬性可以得到遊標執行的相關資訊。顯式遊標由4個屬性:
- %ISOPEN:用於判斷遊標是否開啟,如果已經開啟則返回TRUE,如果遊標未開啟則返回FALSE。
- %FOUND:可用來檢測行資料是否有效。如果有效該屬性返回TRUE,否則返回FALSE。
- %NOTFOUND :與%FOUND屬性恰好相反,如果沒有提取出資料則返回TRUE,否則返回FALSE。
- %ROWCOUNT:累計到當前為止使用FETCH提取資料的行數。
注意: --dbms_output.put_line() 只能列印數字和字串......
帶引數的遊標
在使用顯式遊標時可以指定引數,指定的引數可以傳遞給遊標使用,這樣就方便根據不同的查詢條件進行查詢,也方便遊標在儲存過程中使用。