다연이네

[days05] 저장 프로시저 (stored procedure)를 사용하는 CallableStatement 예제 본문

JDBC

[days05] 저장 프로시저 (stored procedure)를 사용하는 CallableStatement 예제

 다연  2020. 11. 29. 21:12
반응형

1. 부서를 추가하는 저장 프로시저 (INSERT)

  1) 오라클 - 프로시저 생성

create sequence seq_dept
increment by 10
start with 50
nocache;

create or  replace procedure up_insertdept
(
    pdname dept.dname%type
    ,ploc dept.loc%type
)
is
begin
    insert into dept values(seq_dept.nextval, pdname, ploc);
    commit; --커밋과 롤백 필수
--exception
end;

  2) 이클립스 - 클래스 생성

package days05;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;

import com.util.DBConn;


public class Ex04 {

	public static void main(String[] args) {
		//dept 테이블에 insert 하는 저장 프로시저 : up_insertdept
		//deptno 시퀀스 10
		//dname, loc 입력용 매개변수 선언
		
		// "{call 프로시저명(매개변수) }"
		String sql = "{ call up_insertdept(?, ?) }"; //이러면 프로시저를 사용하는 sql이 됨
		String dname = "QC";
		String loc = "SEOUL";
		
		Connection con = null;
		CallableStatement cstmt = null; //이 의미는 프로시저를 호출해서 사용하겠다는 의미가 내포된 것
		 con = DBConn.getConnection();
		 
		 
		 try {
			cstmt = con.prepareCall(sql);
			cstmt.setString(1, dname);
			cstmt.setString(2, loc);
			
			int rowCount = cstmt.executeUpdate();
			
			if(rowCount ==1) {
				System.out.println("> 부서 추가 완료!!!");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				cstmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		 
		 
		 DBConn.close();

	}//main

}//class

2. 부서 정보를 수정하는 저장 프로시저 (UPDATE)

  1) 오라클 - 프로시저 생성

create or replace procedure UP_UPDATEDEPT
(
    pdeptno dept.deptno%type
    , pdname dept.dname%type default null
    , ploc dept.loc%type default null
)
is
   vdname dept.dname%type;
   vloc      dept.loc%type;
begin
     select dname, loc  into vdname, vloc
     from dept
     where deptno = pdeptno;
     
     if( pdname is null ) then
         update dept
         set loc = ploc, dname = vdname
         where deptno = pdeptno;
     elsif ( ploc is null )then
         update dept
         set loc = vloc, dname = pdname
         where deptno = pdeptno;
     else
         update dept
         set loc = ploc, dname = pdname
         where deptno = pdeptno;
     end if;
     commit;
end;

  2) 이클립스 - 클래스 생성

package days05;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;

import com.util.DBConn;


/**
 * @author dayeon
 * @date 2020. 11. 27-오후 5:13:37
 * @subject
 * @content
 */

public class Ex05 {

	public static void main(String[] args) {
		//dept 테이블에 update 하는 저장 프로시저 : up_updatedept
		//deptno 시퀀스 10
		//dname, loc 입력용 매개변수 선언
		
		// "{call 프로시저명(매개변수) }"
		String sql = "{ call up_updatedept(pdeptno=>?, pdname=> ?) }"; //이러면 프로시저를 사용하는 sql이 됨
		
		int deptno = 60;
		
		String dname = "DEVELOPER";//DEVELOPER";
		//String loc = "POHANG";
		
		Connection con = null;
		CallableStatement cstmt = null; //이 의미는 프로시저를 호출해서 사용하겠다는 의미가 내포된 것
		 con = DBConn.getConnection();
		 
		 
		 try {
			cstmt = con.prepareCall(sql);
			// (?,?,?)
			cstmt.setInt(1, deptno);
			cstmt.setString(2, dname);
			//cstmt.setString(3, loc);
			
			int rowCount = cstmt.executeUpdate();
			
			if(rowCount ==1) {
				System.out.println("> 부서 수정 완료!!!");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				cstmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		 
		 
		 DBConn.close();

	}//main

}//class

3. 부서를 삭제하는 저장 프로시저 (DELETE)

  1) 오라클 - 프로시저 생성

create or replace procedure UP_DELETEDEPT
(
    pdeptno dept.deptno%type
)
is
begin
     delete from dept where deptno = pdeptno;
     commit;
end;

  2) 이클립스 - 클래스 생성

package days05;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;

import com.util.DBConn;

public class Ex06 {

	public static void main(String[] args) {
		// up_deletedept
		//deptno=60
		
		String sql = "{ call up_deletedept(pdeptno=>? )}";
		
		int deptno = 50;
		
		Connection con = null;
		CallableStatement cstmt = null;
		con = DBConn.getConnection();
		
		try {
			cstmt=con.prepareCall(sql);
			
			cstmt.setInt(1, deptno);
			
			int rowCount = cstmt.executeUpdate();
			
			if(rowCount==1) {
				System.out.println("> 부서 삭제 완료!!!");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				cstmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
		DBConn.close();
	}

}

반응형
Comments