2013년 8월 18일 일요일

자바에서 오라클 커서(ORACLE CURSOR) 다루기

오라클 커서(ORACLE CURSOR)는 오라클에서 커서란 특정한 SQL영역을 가리키는 핸들러(한 개 또는 여러 개의  ROW를 가지는 SQL명령에 대한 work area) 정도로 보시면 되는데 우리가 작성하는 SQL문장은 모두 명시적이든 묵시적이든 커서를 가진다고 보시면 됩니다. 커서에 대한 자세한 설명은 오라클 강좌를 참고 하시기 바랍니다.
 

오라클자바커뮤니티에서 설립한  개발자실무교육 6년차 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클, SQL, 튜닝, 자바, 스프링, Ajax, jQuery, 안드로이드, 아이폰, 닷넷, C#, ASP.Net)   www.onjprogramming.co.kr
 
 
 
예를 들어 select ename, sal from emp와 같은 SQL문장의 실행 결과를 여러분들의 프로그램에서 받아 낼 수가 있는 것 입니다.
 
아래에 그 예문을 소개하니 참고 바랍니다.
 
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.     결과
 

댓글 없음:

댓글 쓰기