커서에 담긴 select 결과를 보는 방법은 어디에서 보느냐에 따라 두가지 정도 있습니다.
프로시져 내에서 그 결과를 보고 싶다면 커서에 담긴 갯수만큼 루프를 돌리면서 dbms_output.put_line() 함수를 사용하면 프로시져를 작성한 툴에서 (이를 테면 토드) 곧바로 볼 수 있습니다.
그렇지 아니하고 프로그램내에서 받아서 출력하고 싶다면 ResultSet으로 받아서 루프를 돌리면서 출력해야 합니다. 아래 코드는 제가 예전에 pl/sql 공부하면서 테스트용으로 짜 놓은 건데 굳이 패키지는 만들지 않아도 됩니다.
1.scott/tiger 계정으로 접속하여 아래와 같은 패키지를 만든다
1)패키지 명세서
create or replace package Employee as
cursor c1 is select * from emp;
type empCur is ref cursor return c1%rowtype;
procedure GetEmpData(indeptno IN NUMBER,EmpCursor in out empCur );
end Employee;
/
2)패키지 본문
create or replace package body Employee as
procedure GetEmpData(indeptno IN NUMBER,EmpCursor in out empcur)
is
begin
open EmpCursor for select * from emp where deptno= indeptno;
end GetEmpData;
end Employee;
/
2.톰켓을 설치하고 common/lib에 오라클의 classes12.zip을 classes12.jar로 이름을 변경한 후 복사해 넎는다
3.ExamCursor.jsp를 코딩하고 http://localhost:8080/plsql/cursor/ExamCursor.jsp로 접근하여 실행한다
***ExamCursor.jsp***
<%@ page contentType="text/html;charset=euc-kr"%>
<%@ page import!="oracle.jdbc.driver.*,java.sql.*,java.io.*"%>
<html>
<head>
<title>Untitled</title>
</head>
<body>
<%
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
int empNo;
String empName;
String empJob;
int empMgr;
Date empHire;
double empSal;
double empComm;
int deptNo;
String cursorName;
try
{
Class.forName("oracle.jdbc.driver.OracleDriver");
conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:kim","scott","tiger");
//call 패키지이름.프로시져이름(in파라미터,out파라미터
CallableStatement call = conn.prepareCall("{ call Employee.GetEmpData(?, ?) }");
call.setInt(1, 20);
call.registerOutParameter(2, OracleTypes.CURSOR);
call.executeQuery();
rs = (ResultSet)call.getObject(2);
out.println("emp 테이블에서 부서번호가 20인 사원레코드를 출력<br>");
out.println("---------------------------------------------<br>");
out.println("empNo\tempName\tempJob\tmepMgr\tempHire\tempSal\tempComm\tdeptNo<br>");
out.println("---------------------------------------------<br>");
while(rs.next())
{
empNo=rs.getInt("empno");
empName=rs.getString("ename");
empJob=rs.getString("job");
empMgr=rs.getInt("mgr");
empHire=rs.getDate("HireDate");
empSal=rs.getDouble("sal");
empComm=rs.getDouble("comm");
deptNo=rs.getInt("deptno");
out.println(empNo+"\t"+empName+"\t"+empJob+"\t"+empMgr+"\t"+empHire+"\t"+empSal+"\t"+empComm+"\t"+deptNo+"<br>");
}
}
catch(SQLException e1)
{
System.out.println(e1);
}
catch(Exception e2)
{
System.out.println(e2);
}
finally
{
if(rs!=null) try{rs.close();}catch(Exception e){}
if(stmt!=null) try{stmt.close();}catch(Exception e){}
if(conn!=null) try{conn.close();}catch(Exception e){}
}
%>
</body>
</html>