Oracle ref cursorの使用
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)ストレージプロセス
2)Java呼び出し
3)効果は以下の通り:
-------------------------
present by dylan.
前の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)効果は以下の通り:
-------------------------
present by dylan.