2014년 10월 23일 목요일

Oracle의 Stored Procedure/Function 이용하기 (CallableStatement)[자바개발자교육/자바교육/자바강좌/자바,Spring교육잘하는곳/자바,spring교육추천/자바실무교육/JAVA/JAVA교육/JAVA스프링학원/JAVA실무교육]

Oracle의 Stored Procedure/Function 이용하기 (CallableStatement)  
  
  
============================================== 
Oracle의 Stored Procedure/Function 이용하기  
============================================== 

CallableStatement 

모든 DBMS들에 대한 표준방법으로 저장 프로시져(stored procedure)를 호출하는 방법을 제공한다. 
두가지 형태중의 하나인 escape 문법으로 작성되어진다.  즉, 결과 매개변수를 가지는 형태와 결과 매개변수가 없는 형태 
 결과 매개변수를 리턴하는 프로시져를 위한 문법은 다음과 같다.:  
{? = call procedure_name[(?, ?, ...)]} 매개변수가 없는 저장 프로시져를 위한 문법은 다음과 같을 것이다. :  
{call procedure_name}  


CallableStatement 객체는 Connection의 prepareCall 메쏘드에 의해 생성된다.  아래의 예제는 저장 프로시져 getTestData의 호출을 포함하는 CallableStatement의 인스턴스를 만든다.  이것은 두 개의 인자들을 가지고 있고 결과 매개변수는 없다.:  
  CallableStatement cstmt = con.prepareCall("{call getTestData(?, ?)}");  


CallableStatement객체로 IN 매개변수를 넘겨주는 것은 PreparedStatement로부터 상속받은 setXXX 메쏘드이다. 넘겨질 값의 데이터형은 사용할 setXXX 메쏘드를 결정한다.(setFloat는 float 값을 넘겨준다.등등)    만약 저장 프로시져가 OUT 매개변수를 리턴한다면, 각 OUT 매개변수의 SQL형은 CallableStatement 객체를 실행할 수 있기 전에 등록되어져야 한다.(이것은 몇몇 DBMS들이 SQL형을 필요로 하기 때문에 필요하다.)  SQL형을 등록하는 것은 registerOutParameter 메쏘드를 사용한다.  


다음의 예제는 유일한 매개변수로 INOUT 매개변수를 가지고 있는 저장 프로시져 reviseTotal이 있다는 것을 가정한다. setByte 메쏘드는 매개변수를 25로 설정하며, 이것은 드라이버가 SQL TINYINT로써 데이터베이스에 전송할 것이다. 그런다음 registerOutParameter는 SQL TINYINT로써 매개변수를 등록한다. 저장 프로시져가 실행된 후에, 새로운 SQL TINYINT 값을 리턴하고, getByte 메쏘드는 이 새로운 값을 자바 byte로 검색할 것이다.  
CallableStatement cstmt = con.prepareCall("{call reviseTotal(?)}");  
      cstmt.setByte(1, 25); cstmt.registerOutparameter(1, java.sql.Types.TINYINT); cstmt.executeUpdate(); byte x = cstmt.getByte(1);  




------------------------------ 
CallableStatement 예제 
------------------------------ 

/* Oracle Server에 작성된 Function */ 

function employ_age (v_name in employees.name%TYPE) return number 
is 
v_age number(3) := 0; 
begin 
  select age into v_age from employees 
  where  name = v_name; 
  return v_age; 
exception 
  when no_data_found or too_many_rows then 
      return v_age; 
end; 



--------------- 



----------------------- 
// storedprocedure.html 
------------------------ 

<html> 
<head><title>Stored Procedure Call Test </title></head> 
<body> 
<form name=myform action=/servlet/StoredProcedure method=get> 
성명 : <input type=text name=name> 
<input type=submit> 
</form> 
</body> 
</html>      


-------------------- 
StoredProcedure.java 
-------------------- 
/* Oracle의 Stored Procedure를 JDBC로 이용하는 예제입니다.  StoredProcedure.java*/ 
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 employ_age(?) }"); 

      //Stored Procedure의 input value의 setting및 output value의 type설정 
  cstmt.registerOutParameter(1,Types.INTEGER); 
  cstmt.setString(2, han(req.getParameter("name")));  //Procedure의 parameter setting 
  cstmt.execute();                                    //CallableStatement 실행 

  int age = cstmt.getInt(1); 

  out.println("요청하신 " + han(req.getParameter("name")) + " 님의 나이는 " + age + " 입니다."); 



                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");    
  }    







  
  
Previous Article : 34. Log출력용 Class 만들기  
Next Article : 32. ResultSetMetaData 인터페이스  


 기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/웹퍼블리싱… 오라클자바…12-272250
 [채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취…오라클자바…12-111617
53 [평일주간100%환급]Spring,JAVA,JSP,안드로이드,C#닷넷,SQL,튜닝… 오라클자바…03-151411
52 [주말]C#,ASP.NET마스터 오라클자바…01-311530
51 [기업100%환급,평일주간]SQL기초에서스키마오브젝트,PLSQL,힌트… 오라클자바…01-311768
50 [기업100%환급]개발자를위한스프링,마이바티스,하이버네이트(스… 오라클자바…01-311219
49 [평일주간,평일야간,주말]Spring,MyBatis,Hibernate개발자과정 오라클자바…01-191512
48 [평일주간,평일야간,주말]안드로이드개발자과정 오라클자바…01-111343
47 [평일야간,주말주간,주말야간]JAVA,Network&JSP&Spring,MyBatis,… 오라클자바…01-031879
46 기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/웹퍼블리싱… 오라클자바…12-272250
45 [기업100%환급]자바웹개발기초과정(JAVA,JDBC,JSP,Servlet,Aajx,… 오라클자바…12-191617
44 [평일주간야간, 주말]웹퍼블리싱 마스터(HTML5,CSS3,jQUERY,AJAX… 오라클자바…12-141588
43 [채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취… 오라클자바…12-111617
42 [주말주간]자바&웹,jQUERY,스프링프레임워크 오라클자바…12-091291
41 [평일야간]닷넷(C#,Network,ADO.NET,ASP.NET)마스터 오라클자바…12-011511
40 [기업100%환급]자바기초&안드로이드개발자과정(Android전액환급… 오라클자바…12-011693
39 [평일야간,주말]SQL기초에서실무까지(SQL기초,PLSQL,힌트,튜닝) 오라클자바…12-011162

댓글 없음:

댓글 쓰기