본문 바로가기

web/JSP

jsp procedure CURSOR

프로시저는 말만 어려워 보이지 사실 function 과 비슷하다. 단지. return 값이 하나이면 function.
두개 이상이면 procedure 일 뿐이다.

for, while , if 문구등 평상시 코딩하는것과 비슷한데, 단지 이놈의 cursor 이 문제다.
DB의 구조체라고 해야될까? 테이블에서 뽑아온 값을 저장하는정도의 오브젝트라고 생각하면된다.

가끔씩 귀찮아서 프로시져로 코딩해버리는데 리턴값이 한두개가 아닌 테이블 전체를 원한다면?
당연히 커서를 써야 할때이다. 

jsp 에서 프로시져 out 으로 나오는 커서를 간단하게 출력하는 예제를 써본다.

먼저 procedure 를 만든다.


CREATE OR REPLACE procedure procedure_test(c2 out SYS_REFCURSOR)
is

begin
      OPEN c2 FOR
        SELECT OBJECT_ID, OBJECT_NAME 
            FROM USER_OBJECTS 
            WHERE OBJECT_TYPE ='PROCEDURE'; 
            
end;
/


이 프로시져의 역활은 계정내 모든 프로시져의 이름과 ID를 출력하는 프로시져이다.

이번엔 jsp 


<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
 <%@page import="java.util.*" %>

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

<%!

/******************

오라클 접속 공통 모듈

*******************/

Connection con;
Statement stmt;
ResultSet rset;
ResultSet rs;
%>

<%

Class.forName("oracle.jdbc.driver.OracleDriver");

con = DriverManager.getConnection("DB커넥션 부분. 여기는 알아서 기술해주세요;;");

stmt = con.createStatement();

int iReturn = 0;

String sReturn = "";

Vector vProcedure = new Vector();
try{

  String strProc = "{call procedure_test(?)}";

  java.sql.CallableStatement cstmt = con.prepareCall(strProc);

  cstmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);

  cstmt.execute();

  rs = (ResultSet)cstmt.getObject(1);
  
   while(rs.next()) { 
       Hashtable htProcedure = new Hashtable();
       htProcedure.put("OBJECT_ID", rs.getString("OBJECT_ID"));
       htProcedure.put("OBJECT_NAME",  rs.getString("OBJECT_NAME"));
  
   vProcedure.addElement(htProcedure);
   
  }
  
  cstmt.close();

}catch(java.lang.Exception ex){

  System.out.println("에라 = "+ ex.getMessage());

  ex.printStackTrace();

}

stmt.close();
con.clearWarnings(); 
con.close();
%>


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
for(int i=0; i < vProcedure.size(); i++){
    Hashtable ht= (Hashtable)vProcedure.get(i);
    %>
    <%=Integer.parseInt(((ht.get("OBJECT_ID")).toString()))%> ||
    <%=ht.get("OBJECT_NAME").toString()%>
    <br>
    <%
}

%>
</body>
</html>

빨간색 부분이 중요한 부분이다.
① String strProc = "{call procedure_test(?)}";

②  java.sql.CallableStatement cstmt = con.prepareCall(strProc);

③   cstmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);

④  cstmt.execute();

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

①실행할 프로시져를 명시하고 
Call을 통해서 객체를 선언하고 
out으로 나올 커서를 담을 객체를 선언한다.( oracle.jdbc.OracleTypes.CURSOR)
④ execute()를 통해서 프로시져를 실행하고(sql 실행하는것과 같다.)
⑤ Statement객체로 넘어온 값을 ResultSet 에 담는다.

결과는 이렇게 나오네 

- 프로시져도 말만 그렇치 의외로 간단하다.

'web > JSP' 카테고리의 다른 글

Date.getYear()를 쓰지 말자.  (0) 2011.04.14
java 금액 치환  (2) 2011.03.06
서버 시간 알아내기  (0) 2011.02.15
jsp java.lang.UnsupportedClassVersionError 자바빈 500 에러  (0) 2011.01.25
jsp session  (0) 2011.01.18