PLSQL/CURSOR

PL/SQL Cursor with JDBC

Soul-Learner 2014. 7. 25. 13:17

오라클 프로시저에서 리턴한 CURSOR를 JDBC에서 다루는 예


오라클 SQL Developer 의 왼편 메뉴에 있는 프로시저 항목에 다음과 같은 프로시저를 생성한다

오라클 CURSOR 는 테이블의 한행 전체나 여러개의 행을 저장할 수 있기 때문에 자바와 연동할 때 ResultSet 객체로 전달할 수 있다.

아래의 프로시저에서는 OUT 파라미터로 SYS_REFCURSOR 형의 변수를 선언하고 있는데, 이 변수를 자바에까지 전달되며 자바 프로그램에서는 ResultSet 으로 형변환하여 사용할 수가 있다


Oracle SQL Developer 에서 프로시저 작성

CREATE OR REPLACE PROCEDURE SP_GETEMP2 

(

  p_EMPNO IN EMP.EMPNO%TYPE 

, EMP_CURSOR OUT SYS_REFCURSOR 

) AS 

BEGIN 

  OPEN EMP_CURSOR FOR

  SELECT * FROM emp WHERE empno=p_EMPNO;

END SP_GETEMP2;


위와 같이 생성한 후에 SQL Developer 에서 컴파일하고 이어서 초록색 실행버튼을 눌러 실행해보면 출력변수로 설정된 EMP_CURSOR의 내용이 화면 하단에 있는 [출력변수] 탭에 나타나게 된다. 


Java 에서 위의 프로시저를 호출하고 ResultSet 으로 처리하는 예

<%@page import="oracle.jdbc.OracleTypes"%>

<%@page import="java.sql.*"%>

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%

Connection conn;

//PreparedStatement pstmt;

CallableStatement cstmt;

ResultSet rs;

String jdbc_driver = "oracle.jdbc.OracleDriver";

String db_url = "jdbc:oracle:thin:@localhost:1521:XE";

Class.forName(jdbc_driver);

conn = DriverManager.getConnection(db_url,"scott","tiger");

String procStr = "{call SP_GETEMP2(?,?)}";                       // IN, OUT

cstmt = conn.prepareCall(procStr);

cstmt.setInt(1, 7369);                                                 // IN

cstmt.registerOutParameter(2, OracleTypes.CURSOR);       // OUT

cstmt.executeQuery();

rs = (ResultSet)cstmt.getObject(2);

rs.next();

int empno = rs.getInt("EMPNO");

String ename = rs.getString("ENAME");

java.sql.Date hiredate = rs.getDate("HIREDATE");

cstmt.close();

conn.close();

%>

<!DOCTYPE html>

<html>

<head>

<meta charset="EUC-KR">

<title>Oracle Stored Procedure Test</title>

</head>

<body>

사 번 <%=empno %>

이 름 <%=ename %>

입사일 <%=hiredate %>

</body>

</html>