07 PL/SQL

프로그래밍/DB 2007. 11. 27. 14:12 Posted by galad

★ 프로시져 간단 예제2

- empno 2개를 입력 받아, 첫번째 사람의 sal을 v_sal에 받은 후,

두번째 사람의 sal을 v_sal * 1.2로 바꾼다.


create or replace procedure proc2(a_empno in number, a_empno2 in number)
is
   v_sal number;
begin
   proc1(a_empno, v_sal);   // 미리 만든 proc1을 사용한다.
   update emp set sal = 1.2 * v_sal where empno = a_empno2;
end;
/


show errors


// 결과 확인

SQL> select empno, sal from emp;   // 프로시져 실행 전의 결과

     EMPNO        SAL
---------- ----------
      7369        800
      7499       1600
      7521       1250
      7566       2975
      7654       1250
      7698       2850
      7782       2450
      7788       3000
      7839       5000
      7844       1500
      7876       1100

      7900        950                  // 두번째 사람의 sal을 바꾼다
      7902       3000
      7934       1300                  // 첫번째 사람의 sal을 가져와서

14 개의 행이 선택되었습니다.


SQL>  exec proc2(7934, 7900);

PL/SQL 처리가 정상적으로 완료되었습니다.


SQL> select empno, sal from emp;       // 실행 후의 결과

     EMPNO        SAL
---------- ----------
      7369        800
      7499       1600
      7521       1250
      7566       2975
      7654       1250
      7698       2850
      7782       2450
      7788       3000
      7839       5000
      7844       1500
      7876       1100

      7900       1560             // 7934의 1.2배로 바뀌었다.
      7902       3000
      7934       1300

14 개의 행이 선택되었습니다.





/******************************************************************************
*   파일      : CallTest.java
*   용도      : CallableStatement를 테스트하는 예제
*   작성자   : 성홍제
*   작성일   : 2006. 07. 28
*   Version : 1.0
******************************************************************************/

package CallableStatement;

import java.sql.*;
import java.io.*;
import ConnectionPool.DBConnectionMgr;

public class CallTest
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        DBConnectionMgr mgr = DBConnectionMgr.getInstance();
        Connection conn = null;
        CallableStatement cstmt = null;
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int num = 0;
       
        try
        {
           conn = mgr.getConnection();
           cstmt = conn.prepareCall("{call proc1(?, ?)}");   // 함수 호출하는 방식
          
           System.out.print("찾을 사원의 번호은? >> ");
           String str = br.readLine();      // 사원 번호를 입력 받아서          
           num = Integer.parseInt(str);
          
           cstmt.setInt(1, num);        // 넣고
           cstmt.registerOutParameter(2, Types.CHAR);   // 결과를 어떤 형식으로 받을 것인가.
          
           cstmt.execute();
          
           int salary = cstmt.getInt(2);   // 결과를 받는다.
          
           System.out.println(salary);
           System.out.println("End");
          
           cstmt.close();
           conn.close();
           mgr.freeConnection(conn);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

    }

}


CallableStatement는 PreparedStatement를 상속받은 인터페이스로 DB에 저장된 Stored Procedure를 수행하는데 활용된다.
설정은 PreparedStatement와 동일하게 ?, ?, ? 로 설정을 하고 이후에 setXXX 메소드로 설정 할 수 있다.
실행한 결과를 받아 올때는 out 파라미터 등록 메소드인 registerOutParameter()로 등록을 해야만

실행 후에 getXXX 메소드로 결과를 추출할 수 있다.
conn.prepareCall(“{cal test1}”);
conn.prepareCall(“{call test2(?,?)}”);
conn.prepareCall(“{? = call test2(?,?)}”);

'프로그래밍 > DB' 카테고리의 다른 글

오라클 사용자 계정 추가 및 테이블 스페이스 설정  (0) 2007.11.27
[펌] mysql 명령어 모음  (0) 2007.11.27
[펌] PL/SQL 05  (0) 2007.11.27
[펌] PL/SQL 04  (0) 2007.11.27
[펌] PL/SQL 03  (0) 2007.11.27