출처: 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 : }
'IT_Programming > Java' 카테고리의 다른 글
[펌] Arrays in JNI (0) | 2009.04.13 |
---|---|
[펌] Java Native Interface (JNI) - Strings in JNI (0) | 2009.04.13 |
[JNI] 키보드 후킹 소스 (0) | 2009.04.13 |
[펌] HTML내 본문 추출 구현.. (0) | 2009.04.12 |
[펌] Java JMF _ USB Cam을 이용한 JPEG 캡쳐 (0) | 2009.04.12 |