Oracle ref cursorの使用

4385 ワード

Oracleシリーズ:REF Cursor
前のOracleシリーズで:Cursor(次を参照:http://blog.csdn.net/qfs_v/archive/2008/05/06/2404794.aspx)では、カーソルをパラメータとして渡すにはどうすればいいのでしょうか.この問題を解決するにはREF Cursorが必要です.
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結果セットはレコードタイプを返します.(2)弱いタイプの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*/Declare Type MyRefCur IS Ref Cursor;  vRefCur MyRefCur;   vtemp  vRefCur%RowType;  Begin   Case(&n)    When  1 Then Open vRefCur  For Select   *   from emp;    When  2 Then Open vRefCur  For Select   *   from dept;    Else     Open vRefCur  For Select   eno,  ename  from emp Where JOB = 'CLERK';   End Case;   Close  vRefCur;  End;
6,REFカーソルをパラメータとして渡すにはどうすればよいか--ここの原文はありません.自分で補充します.
ストレージプロセスを作成し、JAVAは部門番号10の全従業員情報を呼び出します.
1)ストレージプロセス
CREATE OR REPLACE PROCEDURE findset_emp(v_deptno IN NUMBER,
                                        c_cursor OUT SYS_REFCURSOR) AS
BEGIN
    OPEN c_cursor FOR
        SELECT *
        FROM emp
        WHERE deptno = v_deptno;
END;

 
2)Java呼び出し
public static void main(String[] args) {
		// TODO Auto-generated method stub
		try{
			// load oracle driver
			Class.forName("oracle.jdbc.driver.OracleDriver");
			Connection ct = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott","tiger");
									
			CallableStatement cs = ct.prepareCall("{call findset_emp(?,?)}");
			cs.setInt(1, 10);
			cs.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);
			
			cs.execute();
			ResultSet rs = (ResultSet)cs.getObject(2);
			while(rs.next()){
				System.out.println(rs.getInt(1)+" "+rs.getString(2));
			}
			cs.close();
			ct.close();
		}
		catch(Exception e){
			e.printStackTrace();
		}

 
3)効果は以下の通り:
 
  Oracle ref cursor使用_第1张图片
 
 
 
 
 
-------------------------
present by dylan.