경진의 블로그

CallableStatement(프로시저 실행) 본문

자바개발과정/자바(Java)

CallableStatement(프로시저 실행)

aith 2008. 6. 27. 14:34
CallableStatement

토드에서 프로시저 작성하는 방법


※ sql 파일은 토드에서 프로시저를 작성할 때 사용한다.

첨부파일


부서번호화 월급 인상률을 입력받아 부서별로 급여를 인상한다.

1 DB 접속
  con = pool.getConnection();
2 Statement (정적 처리)
  PreparedStatement (Statement보다는 동적 처리)
  =====DML↑
  =====프로시저↓
  CallableStatement cstamt = con.prepareCall
  {Call pros_emp_update(?,?)}
  ?에는 1번부서번호 2번급여 인상률

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
public class Plsqltest {
    private DBConnectionMgr pool = null;
    private Connection con  = null; //사용한 자원은 반드시 반납해야 한다.
    private CallableStatement cstmt = null; //사용한 자원은 반드시 반납해야 한다.

    Plsqltest() {} //생성자
   
    //부서번호와 월급 인상률을 입력받아서 부서별로 급여를 인상하는 메소드
    public void updateDB() {
        pool = DBConnectionMgr.getInstance();
        try{
            con = pool.getConnection();
            cstmt = con.prepareCall("{call proc_emp_sal_update(?,?)}"); // prepareCall(프로시저 호출)
            BufferedReader in_deptno  = new BufferedReader(new InputStreamReader(System.in)); //in_deptno 는 사원의 부서번호를 입력 받는다.
            BufferedReader in_rate   = new BufferedReader(new InputStreamReader(System.in)); //in_rate 는 급여인상률을 입력받는다.
            System.out.println("인상 부서코드를 입력하시오!");
            String v_deptno = in_deptno.readLine();
            System.out.println("급여 인상률을 입력하시오!");
            String v_rate = in_rate.readLine();
            cstmt.setInt(1, Integer.parseInt(v_deptno));
            cstmt.setDouble(2, Double.parseDouble(v_rate));
            cstmt.executeUpdate();
            con.commit(); //커밋을 시켜준다.
        }catch(SQLException s){
        }catch(Exception s){
        }finally{
            pool.freeConnection(con,cstmt);
        }
    }

    public static void main(String[] args) {
        Plsqltest pt = new Plsqltest();
        pt.updateDB(); //부서번호와 급여인상률 입력해야 한다.
    }
}

PL/SQL proc_emp_val_update.sql 변수선언 부분

CREATE OR REPLACE PROCEDURE proc_emp_avg_update
(v_empno    IN  NUMBER -- 사원번호를 입력하면 이 변수에 저장 된다
, msg       OUT VARCHAR2) -- 프로시저에 만들어 놓은 출력문을 자바단에서 그 변수를 읽어와서 화면(개발자가 보고 있는 콘솔창)에 출력할 문자열을 저장한다.
IS
v_avg_sal       NUMBER; -- emp테이블의 평균 급여를 계산해서 이 변수에 저장한다.
v_sal           NUMBER; -- emp테이블에 저장되어 있는 급여를 이 변수에 저장한다.
v_ename         VARCHAR2(20); -- 화면에 입력한 사원의 급여를 출력해 줄때 사원명을 저장해 두었다사용한다.
v_rate          NUMBER;
BEGIN

첨부파일


사원번호를 입력받아 그 사원의 급여 프로시저에서 정한 인상률을 기준으로 인상하여 결과를 출력한다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
public class Plsqltest {
    private DBConnectionMgr pool = null;
    private Connection con  = null; //사용한 자원은 반드시 반남해야 한다.
    private CallableStatement cstmt = null; //사용한 자원은 반드시 반납해야 한다.
   
    Plsqltest(){}
   
    public void pay_raing() {
        pool = DBConnectionMgr.getInstance();
        try{
            con = pool.getConnection();
            //첫번째 물음표는 사원번호를 받아서 넘기고, 두번쨰 물음표는 프로시저에서
            //정의한 msg변수를 받아서  처리한다.
            cstmt = con.prepareCall("{call proc_emp_avg_update(?,?)}");
            //화면에서 사용자가 입력한 값을 받는다.
            BufferedReader in_empno = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("사원번호를 입력하세요!");
            String v_empno = in_empno.readLine();
            cstmt.setInt(1, Integer.parseInt(v_empno));
            cstmt.registerOutParameter(2, java.sql.Types.VARCHAR);
            cstmt.executeUpdate();
            con.commit();
            System.out.println("프로시저에서 정의한 msg 변수값 읽어오기\n"+ cstmt.getString(2));
        }catch(SQLException s){
            System.out.println(s.toString());
        }catch(Exception e){
            System.out.println(e.toString());
        }finally{
            pool.freeConnection(con, cstmt);
        }
    }
    public static void main(String[] args) {
        Plsqltest pt = new Plsqltest();
        pt.pay_raing();
    }
}
0 Comments
댓글쓰기 폼