一般情況下, 查詢得到的結果都是多行記錄數據, 而在P L/S Q L程序塊中S E-LECT語句只能處理查詢結果為單行記錄數據的情況。要想逐行操作記錄數據的值, 需要使用游標。游標是用戶定義的引用類型, 它能夠根據查詢條件從數據庫中查詢出一組記錄, 將其作為一個臨時表放置在數據緩沖區中, 以游標作指針, 逐行對記錄數據進行操作。
根據Oracle游標的聲明方法不同, 可以將Oracle的游標分為隱式游標和顯式游標。對于數據操縱語句和單行查詢語句來說, Oracle會為它們分配隱式游標。為了處理查詢語句返回的多行數據, 必須使用顯式游標。當查詢返回結果超過一行時, 就需要一個顯示游標, 此時用戶不能使用SELECT INTO語句。顯式游標在PL/SQL塊的聲明部分聲明, 在執行部分或異常處理部分打開、提取數據和關閉。
1 顯式游標
1.1 聲明游標
在程序中使用游標, 首先必須聲明游標。聲明游標時, 要用關鍵字CURSOR, 語法如下。
CURSOR cursor_name IS select statement。
說明:cursor_name用于指定游標的名稱;select statement用于指定游標所對應的查詢語句。
如CURSOR c_emp IS select empno, ename, salary from emp where salary>2000。
1.2 打開游標
在操作數據之前, 首先要打開游標。打開游標時, Oracle會執行游標所對應的查詢語句, 并將查詢語句的結果暫存在結果集中。打開游標的語法如下。
OPEN cursor_name。
說明:cursor_name是在聲明部分定義的游標名。
OPEN一個游標時, 游標的指針自動的指向活動集的第一條記錄。
但是如果打開一個已經打開的游標, 會報錯。
ORA-06511:PL/SQL:cursor already open。
1.3 提取數據
在打開游標之后, 從游標得到一行數據使用FETCH命令, 每次提取數據后, 游標都指向結果集的下一行。語法如下。
FETCH cursor_name INTO variable[, variable, ...]。
對于SELECT定義的游標的每一列, FET CH變量列表都應該有一個變量與之相對應, 變量的類型也要相同。
1.4 關閉游標
在提取并處理了結果集的所有數據后, 就可以關閉游標并釋放結果集。語法如下。
CLOSE cursor_name。
下面通過一個例子來說明游標的使用。
【例1】游標的使用。
2 循環游標
FOR循環游標是我們常用的一種方法, 它可以簡化顯式游標的處理代碼。在使用FOR循環游標時。ORACLE會隱含地打開游標、提取游標數據并關閉游標。語法如下:
說明:cursor_name是已定義的游標名;record_name是PL/SQL聲明的記錄變量。此變量的屬性聲明為%R O W T Y P E類型, 作用域在FOR循環之內。例2為用FOR循環重寫的例1的程序。
【例2】循環游標的使用。
3 REF游標
以上所說的隱式游標和顯式游標都是靜態的, 當用戶使用它們的時候查詢語句已經確定。如果用戶需要在運行的時候動態決定執行何種查詢, 則可以使用REF游標和游標變量。
創建REF游標變量需要兩個步驟:聲明REF游標類型和聲明REF游標類型的游標變量。聲明REF游標的語法如下。
TYPE ref_cursor_name IS REF CUR-SOR[RETURN return_type]
說明:RETURN語句為可選子句, 用于指定游標提取結果集的返回類型。
【例3】REF游標的使用。
使用游標可以極大方便PL/SQL程序的編寫, 就本質而言, 游標實際上是一種能從包括多條數據記錄的結果集中每次提取一條記錄的機制。正是游標把作為面向集合的數據庫管理系統和面向行的程序設計兩者聯系起來, 使兩個數據處理方式能夠進行溝通。游標還有很多方面的用法, 還需要我們不斷地去學習和研究。
摘要:Oracle游標是PL/SQL的重要組成部分, 在PL/SQL中, 當查詢返回結果超過一行時, 就需要用到游標。本文通過例子詳細介紹了顯示游標的聲明、打開、提取數據和關閉, 并且介紹了循環游標和REF游標的使用。
關鍵詞:游標,循環游標,REF游標