[답변]Ref Cursor 사용 0 0 3,766

by 안병훈 [2006.11.10 09:49:18]


정확한 이유를 설명 드리기는 내공이 모자라 어렵사오나 대략 자바 프로그램을 할 때 굉장히 편리한 점을 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

 

-- 좋은하루 되시구요. 도움이 되셨으면 합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입