정확한 이유를 설명 드리기는 내공이 모자라 어렵사오나 대략 자바 프로그램을 할 때 굉장히 편리한 점을 REF CURSOR가 제공하기에 사용하는 경우가 많이 있습니다.
물론, PL/SQL 단독으로도 편한 기능을 제공한다고 하네요. 즉, 오라클 PL/SQL에서 여러 레코드의 쿼리 결과를 가져올 때 편하게 사용 할 수 있다는 이야기입니다.
(Oracle8i 이상에서 실행가능)
예. Oracle REF Cursor를 사용해 프로시저에서 여러행을 반환하는 예제
--헤더
CREATE OR REPLACE PACKAGE ref_cursor_pkg AS
TYPE ref_type IS REF CURSOR;
PROCEDURE ref_cursor_pro(v_result OUT ref_type, v_sql in VARCHAR2);
END;
--본문
CREATE OR REPLACE PACKAGE BODY ref_cursor_pkg AS
PROCEDURE ref_cursor_pro(v_result OUT ref_type, v_sql IN VARCHAR2) AS
BEGIN
OPEN v_result FOR v_sql;
END;
END;
자바 예.
특정 SQL문을 PL/SQL In Parameter로 입력 받아서 쿼리 결과를 Out파라미터로 반환하는 예제입니다.
Java Source를 실행하기 전에 위에 패키지 헤더와 본문을 SQL*Plus에서 먼저 실행.
import java.sql.*;
import oracle.jdbc.driver.OracleCallableStatement;
import oracle.jdbc.driver.OracleTypes;
public class RefCursor {
public static void main(String[] args) {
RefCursor vTest = new RefCursor();
vTest.prepareCall();
}
void prepareCall() {
Connection conn = null
CallableStatement cstmt = null;
OracleCallableStatement ocstmt = null;
try {
DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());
conn = DriverManager.getConnection ("jdbc:oracle:thin:@127.0.0.1:1521:ORACLE", "scott", "tiger");
//프로시저 호출을 위해 JDBC Callable Statement를 사용
cstmt = conn.prepareCall("BEGIN ref_cursor_pkg.ref_cursor_pro(?, ?); END;");
//파라미터 세팅
cstmt.setString(2, "SELECT empno, ename FROM emp");
//REF CURSOR 출력 파라미터를 OracleTypes.CURSOR로 세팅(or 등록)
cstmt.registerOutParameter (1, OracleTypes.CURSOR);
//CallableStatement를 실행
cstmt.execute ();
//getCursor() method를 사용하기 위해 CallableStatement를 OracleCallableStatement object로 전환
ocstmt = (OracleCallableStatement)cstmt;
//OracleCallableStatement의 getCursor() method를 사용해서 REF CURSOR를 JDBC ResultSet variable 에 저장합니다.
ResultSet cursor = ocstmt.getCursor(1);
//쿼리 결과출력
while (cursor.next ()) {
System.out.print (cursor.getString(1) + " ");
System.out.println (cursor.getString(2));
}
} catch(Exception e) {
} finally {
ocstmt.close();
cstmt.close();
conn.close();
}
}
}
--실행
java -classpath .;C:\classes12.zip RefCursor
--결과값
7369 SMITH
7521 WARD
7566 JONES
7654 MARTIN
7698 BLAKE
7782 CLARK
7788 SCOTT
7839 KING
7844 TURNER
7876 ADAMS
7902 FORD
7934 MILLER
-- 좋은하루 되시구요. 도움이 되셨으면 합니다.