다연이네

[days06] 부서번호를 입력받아 해당 사원 정보 출력하기 본문

JDBC

[days06] 부서번호를 입력받아 해당 사원 정보 출력하기

 다연  2020. 11. 30. 17:53
반응형

1. 오라클 저장 프로시저 만들기

create or replace procedure up_selectemp --여러명의 사원이 나올 수 있음 => 커서 사용
(
    pdeptno in dept.deptno%type
    ,pCursor out  SYS_REFCURSOR -- out : 결과물을 커서에 담아서 출력용 용도로 쓰갰다
)
is
 vsql varchar2(1000); --vsql 동적쿼리
begin
 vsql := 'SELECT deptno, empno, ename, job, hiredate ';
 vsql := vsql||' from emp ';
 vsql := vsql||' where deptno = :pdeptno';
 
 --동적쿼리 실행, 얘가 실행되면 결과물이 커서에 담긴다
 open pCursor for vsql --동적쿼리를 쓸때는 open for문 쓰는 것 기억
        using pdeptno;
 --그럼 이 커서를 가지고 자바 단에서 출력
 --예전에는 loop~fetch문을 써서 여기서 출력했는데 이젠 이럴 일 없다
--exception
end;

2. 자바 클래스 만들기

package days06;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;

import com.util.DBConn;

import days02.EmpDTO;

public class Ex01 {

	public static void main(String[] args) {
	    
		
		//UP_SELECTEMP;
		System.out.print("> deptno input ? ");
		Scanner scanner = new Scanner(System.in);
		int  deptno = scanner.nextInt();
				//원래 int인데 String으로 날려도 전혀 상관 없음
				//오라클은 홑따옴표를 사용하기 때문 
		
		Connection con = null;
		CallableStatement cstmt= null;
		ResultSet rs= null;
		ArrayList<EmpDTO> list = null;
		
		String sql ="{ call UP_SELECTEMP( ? ,? ) }";
		
		con = DBConn.getConnection();
		try {
			cstmt = con.prepareCall(sql);
			// ? 
			cstmt.setInt(1, deptno);
			// ? OUT 출력용 매개변수 설정
			cstmt.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);
			
			// rs= cstmt.executeQuery(); 이게 아니라 두번째 파라미터 값인 커서로 돌려준다
			 cstmt.executeQuery();
			 rs = (ResultSet) cstmt.getObject(2); //다운캐스팅 작업 
			 
			 if(rs.next()) {
				 list= new ArrayList<EmpDTO>();
				 EmpDTO dto = null;
				 do {
					 dto = new EmpDTO( );
					 dto.setEMPNO(rs.getInt("empno"));
					 dto.setDEPTNO(deptno);
					 dto.setENAME(rs.getString("ename"));
                  			   dto.setJOB(rs.getString("job"));
					 dto.setHIREDATE(rs.getDate("hiredate"));
					 
					 list.add(dto);
				 }while(rs.next());
			 }//if
			 
			 
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				rs.close();
				cstmt.close();
				DBConn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			
		}//finally
		
		printEmpInfo(list);
				
	}//main

	private static void printEmpInfo(ArrayList<EmpDTO> list) {
		if(list == null) {
			System.out.println("사원이 존재하지 않습니다");
		}else {
			Iterator<EmpDTO> ir = list.iterator();
			while (ir.hasNext()) {
				EmpDTO dto =  ir.next();
				System.out.println(dto);	
			}
		}
		
	}//printEmpInfo
	
}//class

반응형
Comments