PL/SQL Cursor with JDBC
오라클 프로시저에서 리턴한 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>