2013년 9월 1일 일요일

자바(JDBC)에서 오라클 커서를 리턴 받기 [오라클자바커뮤니티 JDBC자바강좌]

자바(JDBC)에서 오라클 커서를 리턴 받기 [오라클자바커뮤니티 JDBC자바강좌]

오라클에서 커서란 특정한 SQL영역을 가리키는 핸들러(한 개 또는 여러 개의  ROW를 가지는 SQL명령에 대한 work area) 정도로 보시면 되는데 우리가 작성하는 SQL문장은 모두 명시적이든 묵시적이든 커서를 가진다고 보시면 됩니다. 커서에 대한 자세한 설명은 오라클 강좌를 참고 하시기 바랍니다.
 
예를 들어 select ename, sal from emp와 같은 SQL문장의 실행 결과를 여러분들의 프로그램에서 받아 낼 수가 있는 것 입니다.


구로디지털단지역 오엔제이프로그래밍 실무교육센터 

(Java , Oracle, SQL, Oracle Tuning, BackUP& Recovery, ASP.NET, C#, C#Network ,채용확정 무상교육) 
www.onjprogramming.co.kr 


 
아래에 그 예문을 소개하니 참고 바랍니다.
 
1.     커서 변수를 사용하기 위해서는 REF CURCOR TYPE을 이용해야 하므로 간단히 package를 하나 만듭니다.
 
SQL> CREATE OR REPLACE PACKAGE types
  2  AS
  3      TYPE ref_cursor IS REF CURSOR;
  4  END;
  5  /
 
패키지가 생성되었습니다.
 
2.     이렇게 함으로서 stored function에서 REF CURSOR TYPE return 하게 만든 후 JDBC를 이용해 SELECT 리스트를 리턴 받을 수 있습니다. 이번에는 Stored Procedure를 하나 만듭니다.
 
SQL> CREATE OR REPLACE FUNCTION sp_get_emp(v_deptno IN NUMBER)
  2      RETURN types.ref_cursor
  3  AS
  4      emp_cursor types.ref_cursor;
  5  BEGIN
  6      OPEN emp_cursor FOR
  7          SELECT ename, sal FROM emp
  8          WHERE deptno = v_deptno;
  9
 10      RETURN emp_cursor;
 11  END;
 12  /
 
함수가 생성되었습니다.
 
3.     다음과 같이 SQL*Plus에서 우선 결과를 확인 해 봅니다.
 
SQL> var results refcursor
SQL> exec :results := sp_get_emp(10)
 
PL/SQL 처리가 정상적으로 완료되었습니다.
 
SQL> print results
 
ENAME             SAL
---------- ----------
CLARK            2450
KING             5000
MILLER           1300
 
4.     TEST를 위해 JSP 파일을 하나 만듭니다.
 
<%@ page language="java" contentType="text/html; charset=euc-kr" %>
<%@ page import="java.sql.*,oracle.jdbc.driver.* " %>
<%       
    Connection conn = null;
        CallableStatement cstmt = null;
        ResultSet rs = null;
 
        String driver_name = "oracle.jdbc.driver.OracleDriver"; //오라클 드라이버
        String url = "jdbc:oracle:thin:@localhost:1521:wink";   //호스트
        String user = "scott"; //계정
        String pwd = "tiger";  //비밀번호
        String query = "";
 
        try {
                Class.forName(driver_name); //jdbc 드라이버연결
                conn =  DriverManager.getConnection(url,user,pwd); //Connection인수 입력
               
                String proc_call = "{? = call sp_get_emp(?)}";
               
                // create callable statement
                cstmt = conn.prepareCall(proc_call);
 
                // key here is to register the output parameter
                // of type cursor, execute, then cast it as a ResultSet.
                cstmt.registerOutParameter(1, OracleTypes.CURSOR);
                cstmt.setInt(2, 10);  //10번 부서의 데이터만 얻기 위해
 
                cstmt.executeQuery();
                rs = (ResultSet)cstmt.getObject(1);
 
                while(rs.next()) {
                        out.println(rs.getString("ename") + " ");
                                                                          out.println(rs.getString("sal") + "<br>");
                }
        }
        catch(Throwable e)
        {
                out.println(e);
        }
        finally {
                try {
                        rs.close();
                        cstmt.close();
                        conn.close();
                }
                catch(Exception e) {}
        }
%>
 
 
5.     결과
 

댓글 없음:

댓글 쓰기