IT_Programming/Java

[JDBC] Procedure Call 샘플 코드

JJun ™ 2009. 4. 13. 00:08

출처: http://blog.naver.com/maul5?Redirect=Log&logNo=70043659864

 

정리

 

PreparedStatement 인터페이스에서 파생된 CallableStatement 인터페이스를 사용

 

1) 가장 간단한 형태

    CallableStatement call = connection.prepareCall("{call procedureName}");

    ResultSet result = call.executeQuery();

    // 이제 프로시저에서 리턴된 ResultSet을 이용하여 데이터를 얻을 수 있다.

    // 이 코드는 저장 프로시저가 하나의 결과셋을 만들어 낸다고 가정한 것이다.

    // 다중 결과셋을 만들어 냈을 때는 excute() 메소드를 사용하여 프로시저를 실행 한 후 

    // getResultSet()메소드를 사용하여 결과셋을 얻는다.

 

2) 입력값(IN) 지정하는 인수를 가질 때 (SELECT QUERY로 RS 빼오는 것과 같다.

    다시말해 서버사이드에서 data를 넘겨주었을 경우)

    CallableStatement call = connection..prepareCall("{call getMonthData(?,?)"});

    call.setInt(1,6);                                    // 첫번째 인수의 값을 지정한다.

    call.setInt(2,1999);                              // 두번째 인수의 값을 지정한다.

    ResultSet result = call.executeQuery();    

    // 프로시저 호출을 실행한다.(ResultSet에 결과값을 받아온다구 생각하면 큰 오산이다.

    // in만하는거다.)


3) 결과를 리턴(OUT)하는 인수를 가질 때

    CallableStatement call = connection..prepareCall("{call getMonthData(?,?)"});

    call.registerOutParameter(2,Types.INTEGER);  // OUT인수이며 INTEGER형인 받아올

                                                                  // 두번째 인수의 형을 셋팅한다.

    int value = call.getInt(2);  // 두번째 인수값을 읽어 온다.

 

4) 입출력(INOUT)용 인수를 가질 때

    CallableStatement call = connection..prepareCall("{call getMonthData(?,?)"}); 

    call.setInt(1,6);                                    

    call.setInt(2,1999);                              

    ResultSet result = call.executeQuery(); 

    call.registerOutParameter(2,Types.INTEGER);  

    int value = call.getInt(2);

 

5) 저장 프로시저는 인수부분이 아닌 리턴값을 가질 수도 있다. 

    CallabelStatement call = connection..preparecall("{? = call getData(?,?)}");

    call.registerOutParameter(1,Type.DECIMAL);

    call.getDouble(1);

 

 

샘플 코드

 

00001 : import java.sql.*;

00002 : 

00003 : public class ProCall {

00004 : 

00005 :     public static void main(String[] args) {

00006 : 

00007 :         Connection con = null;

00008 :         CallableStatement cstmt = null;

00009 :         String driver = "oracle.jdbc.driver.OracleDriver";

00010 :         String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";

00011 : 

00012 :         try {

00013 :             Class.forName(driver);

00014 :             

00015 :             con = DriverManager.getConnection(url, "user", "passwd");

00016 :             

00017 :             cstmt = con.prepareCall("{call loginCheck(?,?)}");

00018 : 

00019 :             cstmt.setString(1, "user");

00020 :             cstmt.registerOutParameter(2, Types.VARCHAR, 15);

00021 :             

00022 :             cstmt.execute();

00023 : 

00024 :             String pw = cstmt.getString(2);

00025 : 

00026 :             System.out.println("당신의 암호는 " + pw + " 입니다.");

00027 : 

00028 :         } catch (ClassNotFoundException e) {

00029 :             e.printStackTrace();

00030 :         } catch (SQLException e) {

00031 :             e.printStackTrace();

00032 :         } finally {

00033 :             try {

00034 :                 cstmt.close();

00035 :                 con.close();

00036 :             } catch (SQLException e) {

00037 :                 e.printStackTrace();

00038 :             }

00039 :         }

00040 :     }

00041 : }