실무개발자를위한 실무교육 전문교육센터학원
www.oraclejava.co.kr에 오시면 보다 다양한 강좌를 보실 수 있습니다.
자바 프로그램에서 오라클의 Procedure를 호출하면 원래는 리턴되어 돌아 오는 값이 없지만 out 매개변수로 Procedure를 만들었으므로 값이 돌아오는 예제 입니다.
아래 예제를 참고하세요~
먼저 실습을 위해 오라클의 scott/tiger로 들어가서 Procedure를 하나 만듭니다.
create or replace procedure emp_job2
(v_name in emp.ename%TYPE, v_job out emp.job%TYPE)
is
begin
select job into v_job from emp
where ename = v_name;
exception
when no_data_found or too_many_rows then
v_job := 'TOO MANY JOB';
when others then
v_job := 'NO JOB';
end;
/
다음으로 프로그램을 만들어 보죠~
Tomcat5등에서 서블릿을 돌릴려면 web.xml 파일에 서블릿 매핑을 해야 합니다.
ROOT/webapps/WEB-INF/ 아래에서 web.xml 파일에 다음을 추가 합니다.
<servlet>
<servlet-name>StoredFunction</servlet-name>
<servlet-class>StoredFunction</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>StoredFunction</servlet-name>
<url-pattern>/servlet/StoredFunction</url-pattern>
</servlet-mapping>
그런 다음 톰캣을 다시 시작하시구요...
tomcat아래 webapps/ROOT 에 sp_test2.html을 만듭니다.
<html>
<head><title>Stored Function Call Test </title></head>
<body>
<form name=myform action=/servlet/StoredProcedure method=get>
성명 : <input type=text name=name>
<input type=submit>
</form>
</body>
</html>
이번엔 서블릿을 tomcat 아래 webapps/ROOT/WEB-INF/classes에 만듭니다.
/* Oracle의 Stored Procedure를 JDBC로 이용하는 예제입니다. StoredProcedure.java*/
/* EMP 테이블의 이름을 값으로 받아 그 사람의 JOB을 리턴하는 예제 입니다. */
/* PL/SQL의 out 매개변수로 프로시저를 만들었습니다. */
/* out 매개 변수 이므로 Procedure지만 값을 되돌려 받을 수 있습니다 */
import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class StoredProcedure extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
Connection con = null;
Statement stmt = null;
res.setContentType("text/html; charset=euc-kr");
PrintWriter out = res.getWriter();
try {
// 오라클 드라이버를 Load 한다
Class.forName("oracle.jdbc.driver.OracleDriver");
// 데이타 베이스에 접속을 한다.
con = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:wink", "scott", "tiger");
// Statement object를 생성한다.
CallableStatement cstmt = con.prepareCall("{ call emp_job2(?) }");
//Stored Procedure의 input value의 setting및 output value의 type설정
cstmt.registerOutParameter(1,Types.VARCHAR);
cstmt.setString(2, han(req.getParameter("name"))); //Procedure의 parameter setting
cstmt.execute(); //CallableStatement 실행
String job = cstmt.getString(1);
out.println("요청하신 " + han(req.getParameter("name")) + " 님의 JOB은 " + job + " 입니다.");
}
catch(ClassNotFoundException e) {
out.println("Couldn't load database driver: " + e.getMessage());
}
catch(SQLException e) {
out.println("SQLException caught: " + e.getMessage());
}
finally { // 언제나 데이타 베이스 연결을 종료한다.
try { if (con != null) con.close(); }
catch (SQLException ignored) { }
}
}
//한글변환 함수
public static String han(String Unicodestr) throws UnsupportedEncodingException {
if( Unicodestr == null)
return null;
return new String(Unicodestr.getBytes("8859_1"),"KSC5601");
}
}
서블릿 컴파일 후 웹브라우저에서 http://localhost/sp_test2.html을 실행 후
이름을 SMITH라고 넣어 보세요...
[결과]
요청하신 SMITH 님의 JOB은 CLERK 입니다.