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
반응형