from:http://www.111cn.net/database/Oracle/42873.htm
1,什么是 REF游標 ?
動態關聯結果集的臨時對象。即在運行的時候動態決定執行查詢。
2,REF 游標 有什么作用?
實現在程序間傳遞結果集的功能,利用REF CURSOR也可以實現BULK SQL,從而提高SQL性能。
3,靜態游標和REF 游標的區別是什么?
①靜態游標是靜態定義,REF 游標是動態關聯;
②使用REF 游標需REF 游標變量。
③REF 游標能做為參數進行傳遞,而靜態游標是不可能的。
4,什么是REF 游標變量?
REF游標變量是一種 引用 REF游標類型 的變量,指向動態關聯的結果集。
5,怎么使用 REF游標 ?
①聲明REF 游標類型,確定REF 游標類型;
⑴強類型REF游標:指定retrun type,REF 游標變量的類型必須和return type一致。
語法:Type REF游標名 IS Ref Cursor Return 結果集返回記錄類型;
⑵弱類型REF游標:不指定return type,能和任何類型的CURSOR變量匹配,用於獲取任何結果集。
語法:Type REF游標名 IS Ref Cursor;
②聲明Ref 游標類型變量;
語法:變量名 已聲明Ref 游標類型;
③打開REF游標,關聯結果集 ;
語法:Open Ref 游標類型變量 For 查詢語句返回結果集;
④獲取記錄,操作記錄;
語法:Fatch REF游標名 InTo 臨時記錄類型變量或屬性類型變量列表;
⑤關閉游標,完全釋放資源;
語法:Close REF游標名;
例子:強類型REF游標
代碼如下 | 復制代碼 |
/*conn scott/tiger*/ Declare Type MyRefCurA IS REF CURSOR RETURN emp%RowType; Type MyRefCurB IS REF CURSOR RETURN emp.ename%Type; vRefCurA MyRefCurA; vRefCurB MyRefCurB; vTempA vRefCurA%RowType; vTempB vRefCurB.ename%Type; Begin Open vRefCurA For Select * from emp Where SAL > 2000; Loop Fatch vRefCurA InTo vTempA; Exit When vRefCurA%NotFound; DBMS_OUTPUT.PUT_LINE(vRefCurA%RowCount||' '|| vTempA.eno||' '||vTempA.ename ||' '||vTempA.sal) End Loop; Close vRefCurA; DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------------------------------------------'); Open vRefCurB For Select ename from emp Where SAL > 2000; Loop Fatch vRefCurB InTo vTempB; Exit When vRefCurB%NotFound; DBMS_OUTPUT.PUT_LINE(vRefCurB%RowCount||' '||vTempB) End Loop; Close vRefCurB; DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------------------------------------------'); Open vRefCurA For Select * from emp Where JOB = 'CLERK'; Loop Fatch vRefCurA InTo vTempA; Exit When vRefCurA%NotFound; DBMS_OUTPUT.PUT_LINE(vRefCurA%RowCount||' '|| vTempA.eno||' '||vTempA.ename ||' '||vTempA.sal) End Loop; Close vRefCurA; End; |
例子:弱類型REF游標
代碼如下 | 復制代碼 |
/*conn scott/tiger*/
|
6,怎樣讓REF游標作為參數傳遞?
代碼如下 | 復制代碼 |
--作為函數返回值 declare
--作為參數 declare |
REF CURSOR 示例包括下列三個 Visual Basic 示例,演示如何使用 REF CURSOR。
示例 說明
在 OracleDataReader 中檢索 REF CURSOR 參數
此示例執行一個 PL/SQL 存儲過程,返回 REF CURSOR 參數,並將值作為 OracleDataReader 讀取。
使用 OracleDataReader 從多個 REF CURSOR 檢索數據
此示例執行一個 PL/SQL 存儲過程,返回兩個 REF CURSOR 參數,並使用 OracleDataReader 讀取值。
使用一個或多個 REF CURSOR 填充 DataSet
此示例執行一個 PL/SQL 存儲過程,返回兩個 REF CURSOR 參數,並使用返回的行填充 DataSet。
要使用這些示例,可能需要創建 Oracle 表,並且必須創建 PL/SQL 包和包正文。
創建 Oracle 表
這些示例使用 Oracle Scott/Tiger 架構中定義的表。大多數 Oracle 安裝均包括 Oracle Scott/Tiger 架構。如果此架構不存在,可以使用 {OracleHome}rdbmsadminscott.sql 中的 SQL 命令文件創建供這些示例使用的表和索引。
創建 Oracle 包和包正文
這些示例要求服務器上存在以下 PL/SQL 包和包正文。在 Oracle 服務器上創建以下 Oracle 包
代碼如下 | 復制代碼 |
CREATE OR REPLACE PACKAGE BODY CURSPKG AS ELSE END IF; PROCEDURE OPEN_TWO_CURSORS (EMPCURSOR OUT T_CURSOR,
|
Oracle提供REF CURSOR,通過該功能可以實現在程序間傳遞結果集的功能,利用REF CURSOR也可以實現BULK SQL,從而提高SQL性能。
使用scott用戶的emp表實現以下測試案例:
代碼如下 | 復制代碼 |
SQL> desc emp 使用ref cursor獲得結果集輸出:
PL/SQL procedure successfully completed.
|