Statement 객체 (SQL 명령을 현재 접속중인 DBMS 서버에 전달하여 실행하는 기능 제공)

woom·2022년 11월 2일
0

JDBC

목록 보기
2/4
post-thumbnail

💡 Java 프로그램 배포하는 방법

  • 자료파일로 만들어서 배포하면 실행 가능 (콘솔 프로그램은 실행 불가능,연결 프로그램 : java.exe )

    • 받는 사람도 JVM이 없으면 자바 프로그램 실행 불가
    • JRE(java runtime environment) : 자바 프로그램을 실행할수 있는 환경 제공
  1. 프로그램(실행파일) 배포 할 경우 (Runnable JAR file)
  • 프로젝트 마우스 오른쪽 버튼 클릭 → Export → Java폴더 → Runnable JAR file(실행할수있는 자료 파일) → next
    → Launch configuration에 프로그램 선택 → Export destination에 저장 경로 선택 → finish
  1. 클래스만 배포 할 경우 (JAR file)
  • 프로젝트 마우스 오른쪽 버튼 클릭 → Export → Java폴더 → JAR file → .... → finish

🌼 Statement 객체

  • Statement 객체 : SQL 명령을 현재 접속중인 DBMS 서버에 전달하여 실행하는 기능을 제공하는 객체

  • Connection.createStatement( ) : Statement 객체를 생성하여 반환하는 메소드

  • Statement.executeUpdate(String sql) : DML 명령 또는 DDL명령을 전달하여 실행하기 위한 메소드

    • 실행결과로 조작행의 갯수를 정수값(int)으로 반환
  • Statement.executeQuery(String sql) : SELECT 명령을 전달하여 실행하기 위한 메소드

    • 실행결과로 검색행이 저장된 ResultSet 객체 반환


💡 ResultSet 객체

  • 검색결과를 테이블 형식의 객체로 저장하여 표현한 객체

  • ResultSet 객체에 저장된 검색행을 행단위로 처리하기 위해 내부적인 커서 제공

    • ResultSet 커서는 최초 BOF(Before Of File) 영역에 위치
  • ResultSet.next() : ResultSet 커서를 다음행으로 이동하는 메소드 - boolean

    • false 반환 : ResultSet 커서 위치에 처리행이 없는 경우의 반환값 - EOF
    • true 반환 : ResultSet 커서 위치에 처리행이 있는 경우의 반환값
  • ResultSet.getXXX(int Index) 또는 ResultSet.getXXX(String Label) : ResultSet 커서가 위치한 처리행의 컬럼값을 반환하는 메소드

  • ResultSet.getRow() : ResultSet 커서가 위치한 처리행의 행번호(RowIndex)를 반환하는 메소드

  • ResultSet.getXXX(string columnLabel) : ResultSet 커서가 위치한 처리행의 컬럼값을 반환하는 메소드



📙 ResultSet 커서

  • Connection.createStatement(1. int resultSetType, 2. int resultSetConcurrency)
    • Statement 객체를 생성하여 반환하는 메소드
    • 매개변수에 전달되는 값에 따라 Statement 객체로 생성되는 ResultSet 객체의 사용방법을 다르게 설정
    • ResultSet 커서의 이동 방법 또는 ResultSet 커서가 위치한 처리행에 대한 조작 설정 가능

📌 1. resultSetType

: ResultSet 커서의 이동 관련 속성값(ResultSet 인터페이스의 상수)을 전달하여 설정

  • ResultSet.TYPE_FORWARD_ONLY : ResultSet 커서를 다음행으로만 이동 가능 (기본)
  • ResultSet.TYPE_SCROLL_INSENSITIVE : ResultSet 커서를 원하는 행으로 이동 가능
    (조작행 미반영 → 읽기전용 시 사용 )
  • ResultSet.TYPE_SCROLL_SENSITIVE : ResultSet 커서를 원하는 행으로 이동 가능
    (조작행 반영)

📌 2. resultSetConcurrency

: ResultSet 커서 위치의 처리행의 조작 관련 속성값(ResultSet 인터페이스의 상수)을 전달하여 설정

  • 1) ResultSet.CONCUR_READ_ONLY : ResultSet 커서 위치의 처리행에 대한 조작 불가능 (기본)
  • 2) ResultSet.CONCUR_UPDATABLE : ResultSet 커서 위치의 처리행에 대한 조작 가능

💡 1). ResultSet.CONCUR_READ_ONLY

  • ResultSet.first() : ResultSet 커서를 첫번째 행으로 이동하는 메소드
  • ResultSet.last() : ResultSet 커서를 마지막 행으로 이동하는 메소드
  • ResultSet.absolute(int rowIndex) : ResultSet 커서를 원하는 위치의 행으로 이동하는 메소드
  • ResultSet.beforeFirst() : ResultSet 커서를 BOF(Before Of File) 영역으로 이동하는 메소드
  • ResultSet.afterLast() : ResultSet 커서를 EOF(End Of File) 영역으로 이동하는 메소드
  • ResultSet.previous() : ResultSet 커서를 이전행으로 이동하는 메소드

💡 2). ResultSet.CONCUR_UPDATABLE

  • ResultSet 커서가 위치한 처리행에 대한 조작이 가능한 경우 SELECT 명령의 검색대상으로 * 사용 불가능
  • ResultSet.updateXXX(String columnLabel, XXX columnValue) : ResultSet 커서가 위치한 처리행의 컬럼값을 변경하는 메소드
    • ex. rs.updateString("name", "임걱정"); : 이름을 임걱정으로 바꾸겠다.
    • ResultSet.updateRow() : 변경행을 ResultSet 객체에 적용하는 메소드
      (실제 테이블 행의 컬럼값도 변경 처리)
  • ResultSet.moveToInsertRow() : ResultSet 커서가 위치에 새로운 행을 삽입하는 메소드
    • 삽입행 다음에 존재하는 기존행은 자동으로 다음행으로 이동
    • ResultSet.insertRow() : 삽입행을 ResultSet 객체에 적용하는 메소드
      (실제 테이블의 행에 대한 삽입 처리)
  • ResultSet.deleteRow() : ResultSet 커서가 위치한 처리행을 삭제하는 메소드 (실제 테이블 삭제 처리)

🐣 예제 - 커서이동/행 조작

public class ResultSetCursorApp {
	public static void main(String[] args) throws SQLException {
		Connection con=ConnectionFactory.getConnection();
		
		Statement stmt=con.createStatement();
		
		String sql="select * from student order by no";
        
        ResultSet rs=stmt.executeQuery(sql);
		//SELECT 명령을 전달하여 실행하고 검색결과를 ResultSet 객체로 반환하는 메소드
		// → ResultSet 객체는 내부적으로 커서(Cursor)를 사용하여 행단위로 처리
		// → ResultSet 커서는 다음행으로만 이동 가능하며 커서 위치의 행에 대한 조작 불가능
        
		while(rs.next()) {
            //rs.getRow : ResultSet 커서가 위치한 처리행의 행번호를 반환
			//rs.getXXX(columnLabel) : ResultSet 커서가 위치한 처리행의 컬럼값을 반환
			System.out.println(rs.getRow()+"행 : 학번 = "
					+rs.getInt("no")+", 이름 = "+rs.getString("name"));
		}
		ConnectionFactory.close(con, stmt, rs);
		System.out.println("=================================================");
        
		con=ConnectionFactory.getConnection();
		
		stmt=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
        ResultSet.CONCUR_READ_ONLY);
		
		sql="select * from student order by no";
		//ResultSet 커서는 ResultSet 객체의 BOF(Before Of File)영역에 위치
		rs=stmt.executeQuery(sql);
		
		//ResultSet.first() : ResultSet 커서를 첫번째 행으로 이동하는 메소드
		rs.first();
		System.out.println(rs.getRow()+"행 : 학번 = "+rs.getInt("no")+
        ", 이름 = "+rs.getString("name"));

		//ResultSet.last() : ResultSet 커서를 마지막 행으로 이동하는 메소드
		rs.last();
		System.out.println(rs.getRow()+"행 : 학번 = "+rs.getInt("no")+
        ", 이름 = "+rs.getString("name"));
		
		//ResultSet.absolute(int rowIndex) : ResultSet 커서를 원하는 위치의 행으로 이동
		rs.absolute(2);
		System.out.println(rs.getRow()+"행 : 학번 = "+rs.getInt("no")+
        ", 이름 = "+rs.getString("name"));
		System.out.println("=================================================");
		//ResultSet.beforeFirst() : ResultSet 커서를 BOF(Before Of File) 영역으로 이동
		rs.beforeFirst();
		while(rs.next()) {
			System.out.println(rs.getRow()+"행 : 학번 = "+rs.getInt("no")+
            ", 이름 = "+rs.getString("name"));
		}
		System.out.println("=================================================");
		//ResultSet.afterLast() : ResultSet 커서를 EOF(End Of File) 영역으로 이동
		rs.afterLast();
		//ResultSet.previous() : ResultSet 커서를 이전행으로 이동하는 메소드
		while(rs.previous()) {
			System.out.println(rs.getRow()+"행 : 학번 = "+rs.getInt("no")+
            ", 이름 = "+rs.getString("name"));
		}

		ConnectionFactory.close(con, stmt, rs);
		System.out.println("=================================================");
		con=ConnectionFactory.getConnection();
		
		stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
        ResultSet.CONCUR_UPDATABLE);
		
        
		sql="select no,name,phone,address,birthday from student order by no";
		rs=stmt.executeQuery(sql);

		rs.absolute(2);
		
		//ResultSet.updateXXX(String columnLabel, XXX columnValue)
		// → ResultSet 커서가 위치한 처리행의 컬럼값을 변경하는 메소드
		// → XXX : Java 자료형
		rs.updateString("name", "임걱정");
		
		//ResultSet.updateRow() : 변경행을 ResultSet 객체에 적용하는 메소드  
		// → 실제 테이블의 행에 대한 컬럼값 변경 처리
		rs.updateRow();
		
		
		rs.absolute(3);
		
		//ResultSet.moveToInsertRow() : ResultSet 커서 위치에 새로운 행을 삽입하는 메소드
		// → 삽입행 다음에 존재하는 기존행은 자동으로 다음행으로 이동
		rs.moveToInsertRow();
		
		//삽입행의 컬럼값 변경
		rs.updateInt("no", 4000);
		rs.updateString("name", "일지매");
		rs.updateString("phone", "010-1321-2411");
		rs.updateString("address", "부산시 사하구");
		rs.updateString("birthday", "2000-12-31");
		
		//ResultSet.insertRow() : 삽입행을 ResultSet 객체에 적용하는 메소드  
		// → 실제 테이블의 행에 대한 삽입 처리
		rs.insertRow();
		 

		
		rs.absolute(4);
		//ResultSet.deleteRow() : ResultSet 커서가 위치한 처리행을 삭제하여 
        //ResultSet 객체에 적용하는 메소드 → 실제 테이블의 행에 대한 삭제 처리
		rs.deleteRow();
		
		
		ConnectionFactory.close(con, stmt, rs);
		System.out.println("=================================================");
	}
}








📌 Statement 객체의 장단점

  • Statement 객체 : 현재 접속중인 DBMS 서버에 SQL 명령을 전달하여 실행하기 위한 기능을 제공하는 객체

  • 장점 : 하나의 Statement 객체를 이용하여 다수의 SQL 명령을 전달하여 실행 가능

  • 단점 :

  1. SQL 명령의 Java 변수값을 포함할 경우 문자열 결합 기능 사용
    • 문자열 결합을 이용할 경우 가독성 및 유지보수의 효율성 감소
  2. InSQL 해킹 기술(값 대신 부분적인 SQL 명령을 포함시키는 기술)에 취약
    (ex. 'or '1'='1 이라는 항상 참인 명령을 전달했을경우 모든 값이 검색됨)

🐣 예제

public class StatementApp {
	public static void main(String[] args) throws Exception {
		
		//키보드로 학생정보를 입력받아 STUDENT 테이블에 삽입하고 
        //STUDENT 테이블에 저장된 모든 학생정보를 검색하여 출력하는 JDBC 프로그램 작성
		
		//키보드로 학생정보를 입력받기 위한 입력스트림 생성
		BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
		
		//키보드로 학생정보를 입력받아 저장
		System.out.println("<<학생정보 입력>>");
		System.out.print("학번 입력 >> ");
		int no=Integer.parseInt(in.readLine());
        //키보드로 입력한 값을 integer 클래스의 정수값으로 형변환하여 no에저장 
		System.out.print("이름 입력 >> ");
		String name=in.readLine();
		System.out.print("전화번호 입력 >> ");
		String phone=in.readLine();
		System.out.print("주소 입력 >> ");
		String address=in.readLine();
		System.out.print("생년월일 입력 >> ");
		String birthday=in.readLine();
		System.out.println("====================================================");
        
		//입력된 학생정보를 STUDENT 테이블의 행으로 삽입 처리
		Connection con=ConnectionFactory.getConnection();
		Statement stmt=con.createStatement();
		
		String sql1="insert into student values("+no+",'"+name+"','"+phone+"',
        '"+address+"','"+birthday+"')";
        //자바 변수 "no"를 +를 이용해 결합, 오라클 문자값은 ' ' 안에 있어야 함
        //변수"name" 을 +를 이용해 결합 후 오라클 문자로 표시하기 위해 ' ' 안에 넣어줌
		int rows=stmt.executeUpdate(sql1);
		
		System.out.println("[결과]"+rows+"명의 학생정보를 삽입 하였습니다.");
		System.out.println("=====================================================");
        
		//STUDENT 테이블에 저장된 모든 학생정보를 검색하여 출력
		String sql2="select * from student order by no";
		ResultSet rs=stmt.executeQuery(sql2);
		System.out.println("<<학생정보 출력>>");
		while(rs.next()) {
			System.out.println("학번 = "+rs.getInt("no")+",
            이름 = "+rs.getString("name"));
		}
		ConnectionFactory.close(con, stmt, rs);
		System.out.println("=====================================================");
		
		
		//키보드로 이름을 입력받아 STUDENT 테이블에 저장된 학생정보 중 해당 이름의 학생정보를
		//검색하여 출력하는 JDBC 프로그램 작성
		
		//키보드로 학생정보를 입력받기 위한 입력스트림 생성
		BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
				
		//키보드로 이름을 입력받아 저장
		System.out.println("<<학생정보 검색>>");
		System.out.print("이름 입력 >> ");
		String name=in.readLine();
		System.out.println("=====================================================");
		//STUDENT 테이블에 저장된 학생정보 중 해당 이름의 학생정보를 검색하여 출력
		Connection con=ConnectionFactory.getConnection();
		
		Statement stmt=con.createStatement();
		
		String sql="select * from student where name='"+name+"' order by no";
		ResultSet rs=stmt.executeQuery(sql);
        
		System.out.println("<<검색결과>>");
		if(rs.next()) {
			do {
				System.out.println("학번 = "+rs.getInt("no")+",
                이름 = "+rs.getString("name"));
			} while(rs.next());
		} else {
			System.out.println("검색된 학생정보가 없습니다.");
		}
		
		ConnectionFactory.close(con, stmt, rs);
		System.out.println("=====================================================");
	}
}






🌼 PreparedStatement 객체

  • PreparedStatement 객체 : 현재 접속중인 DBMS 서버에 SQL 명령을 전달하여 실행하기 위한 기능을 제공하는 객체
  • Connection.prepareStatement(String sql) : Connection 객체로부터 SQL 명령이 저장된 PreparedStatement 객체를 반환하는 메소드

    • 이미 sql명령을 저장하고 있어서 추가로 sql 명령을 전달할 필요 없음
  • PreparedStatement 객체에 저장된 SQL 명령에서는 ?(InParameter) 기호 사용

    • InParameter : Java 변수값을 제공받아 SQL 명령의 문자값으로 표현하기 위한 기능
    • 반드시 모든 InParameter에 Java 변수값을 전달받아야 완전한 SQL 명령 완성
  • PreparedStatement.setXXX(int parameterIndex, XXX value)
    : PreparedStatement 객체에 저장된 SQL 명령의 InParameter에 Java 변수값을 전달하는 메소드

    • XXX : Java 자료형, parameterIndex : InParameter의 위치값(첨자)으로 1부터 1씩 증가되는 정수값
    • 반드시 setXXX() 메소드를 호출하여 모든 InParameter에 Java 변수값을 전달

📌 PreparedStatement 장단점

  • 장점 : InParameter를 사용하여 값을 전달받아 SQL 명령 작성
    • InParameter를 사용하므로 가독성 및 유지보수의 효율성 증가
    • InSQL 해킹 기술 무효화 - 사용자 입력값은 SQL 명령에서 무조건 문자값으로 처리
  • 단점 : 하나의 PreparedStatement 객체는 저장된 하나의 SQL 명령만 전달하여 실행 가능

🐣 예제

public class PreparedStatementApp {
	public static void main(String[] args) throws Exception {
		
		//키보드로 학생정보를 입력받아 STUDENT 테이블에 삽입하고 STUDENT 테이블에 저장된 모든
		//학생정보를 검색하여 출력하는 JDBC 프로그램 작성
		
		//키보드로 학생정보를 입력받기 위한 입력스트림 생성
		BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
		
		//키보드로 학생정보를 입력받아 저장
		System.out.println("<<학생정보 입력>>");
		System.out.print("학번 입력 >> ");
		int no=Integer.parseInt(in.readLine());
		System.out.print("이름 입력 >> ");
		String name=in.readLine();
		System.out.print("전화번호 입력 >> ");
		String phone=in.readLine();
		System.out.print("주소 입력 >> ");
		String address=in.readLine();
		System.out.print("생년월일 입력 >> ");
		String birthday=in.readLine();
		System.out.println("=====================================================");
		//입력된 학생정보를 STUDENT 테이블의 행으로 삽입 처리
		Connection con=ConnectionFactory.getConnection();
		
		String sql1="insert into student values(?,?,?,?,?)";
		PreparedStatement pstmt=con.prepareStatement(sql1);
		pstmt.setInt(1, no);
		pstmt.setString(2, name);
		pstmt.setString(3, phone);
		pstmt.setString(4, address);
		pstmt.setString(5, birthday);
		
		//PreparedStatement.executeUpdate() 
        //: DML 명령 또는 DDL 명령을 전달하여 실행하는 메소드
		// => 조작행의 갯수를 정수값으로 반환
		int rows=pstmt.executeUpdate();
		
		System.out.println("[결과]"+rows+"명의 학생정보를 삽입 하였습니다.");
        ptstmt.colose();
		System.out.println("====================================================");
        
		//STUDENT 테이블에 저장된 모든 학생정보를 검색하여 출력
		String sql2="select * from student order by no";
		pstmt=con.prepareStatement(sql2);
		
		//PreparedStatement.executeQuery() : SELECT 명령을 전달하여 실행하는 메소드
		// => 모든 검색행이 저장된 ResultSet 객체 반환
		ResultSet rs=pstmt.executeQuery();
		
		System.out.println("<<학생정보 출력>>");
		while(rs.next()) {
			System.out.println("학번="+rs.getInt("no")+",이름="+rs.getString("name"));
		}
		ConnectionFactory.close(con, pstmt, rs);
		System.out.println("====================================================");
		
		//키보드로 이름을 입력받아 STUDENT 테이블에 저장된 학생정보 중 해당 이름의 학생정보를
		//검색하여 출력하는 JDBC 프로그램 작성
		
		//키보드로 학생정보를 입력받기 위한 입력스트림 생성
		BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
				
		//키보드로 이름을 입력받아 저장
		System.out.println("<<학생정보 검색>>");
		System.out.print("이름 입력 >> ");
		String name=in.readLine();
		System.out.println("====================================================");
        
		//STUDENT 테이블에 저장된 학생정보 중 해당 이름의 학생정보를 검색하여 출력
		Connection con=ConnectionFactory.getConnection();
		
		String sql="select * from student where name=? order by no";
		PreparedStatement pstmt=con.prepareStatement(sql);
		pstmt.setString(1, name);
		
		ResultSet rs=pstmt.executeQuery();
		
		System.out.println("<<검색결과>>");
		if(rs.next()) {
			do {
				System.out.println("학번="+rs.getInt("no")+",이름="+rs.getString("name"));
			} while(rs.next());
		} else {
			System.out.println("검색된 학생정보가 없습니다.");
		}
		
		ConnectionFactory.close(con, pstmt, rs);
		System.out.println("====================================================");
	}
}







📙 Batch (일괄처리)

  • JDBC 프로그램에서 하나의 PreparedStatement 객체를 사용하여 다수의 행을 삽입,변경,삭제 처리를 하기 위해 일괄처리(Batch)영역에 SQL 명령을 저장하여 한번에 전달하여 실행 기능 제공

  • PreparedStatement.addBatch() : PreparedStatement 객체에 이용하여 SQL 명령을 일괄처리 영역에 추가하는 메소드

  • PreparedStatement.executeBatch() : 일괄처리 영역에 저장된 SQL 명령을 전달하여 실행하는 메소드 (조작행의 갯수을 int 배열로 반환)

🐣 예제

public class AddBatchApp {
	public static void main(String[] args) throws Exception {
		Connection con=ConnectionFactory.getConnection();
		
		String sql="insert into student values(?,?,?,?,?)";
		PreparedStatement pstmt=con.prepareStatement(sql);
		
		pstmt.setInt(1, 4000);
		pstmt.setString(2, "일지매");
		pstmt.setString(3, "010-2317-9741");
		pstmt.setString(4, "서울시 종로구");
		pstmt.setString(5, "1999-08-15");
		//PreparedStatement.addBatch() 
        // : PreparedStatement 객체에 이용하여 SQL 명령을 일괄처리 영역에 추가하는 메소드
		pstmt.addBatch();
		
		pstmt.setInt(1, 5000);
		pstmt.setString(2, "장길산");
		pstmt.setString(3, "010-4879-6765");
		pstmt.setString(4, "서울시 도봉구");
		pstmt.setString(5, "1997-05-05");
		pstmt.addBatch();
		
		//PreparedStatement.executeBatch() 
        // : 일괄처리 영역에 저장된 SQL 명령을 전달하여 실행하는 메소드
		// => 조작행의 갯수을 int 배열로 반환
		int[] result=pstmt.executeBatch();
		
		System.out.println("[메세지]"+result.length+"개의 행을 삽입 하였습니다.");
		
		ConnectionFactory.close(con, pstmt);
	}
}








🌼 CallableStatement 객체

  • Connection.prepareCall(String sql) : 저장 프로시저를 호출하는 명령을 전달하여 실행하기 위한 CallableStatement 객체를 반환하는 메소드

    • 저장 프로시저를 호출하는 명령 : {call 저장프로시저명(?,?,...)}
  • 저장 프로시저에서 사용한 InParameter에는 반드시 setXXX() 메소드로 값을 전달하거나 registerOutParameter() 메소드를 이용하여 값을 제공받아 사용

  • CallableStatement.setXXX(int parameterIndex, XXX value)
    : 저장 프로시저의 IN 모드의 매개변수에 Java 변수값을 전달하기 위한 메소드

  • CallableStatement.registerOutParameter(int parameterIndex, int sqlType)
    : 저장 프로시저의 OUT 모드의 매개변수에 저장된 값을 제공받기 위한 메소드

    • sqlType : SQL 자료형 - Types 클래스의 상수(Constant) 사용
  • CallableStatement.execute() : 저장 프로시저 호출 명령을 전달하여 실행하는 메소드

  • CallableStatement.getXXX(int parameterIndex)
    : 저장 프로시저의 OUT 모드의 매개변수로 제공받은 값을 반환하는 메소드




🐣 예제

//키보드로 학번을 입력받아 STUDENT 테이블에 저장된 학생정보 중 해당 학번의 학생정보를 삭제하는
//JDBC 프로그램 작성 (저장 프로시저를 호출하여 학생정보 삭제 처리)
public class CallableStatementApp {
	public static void main(String[] args) throws Exception {
		//키보드로 학번을 입력받기 위한 입력스트림 생성
		BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
		
		System.out.println("<<학생정보 삭제>>");
		System.out.print("학번 입력 >> ");
		int no=Integer.parseInt(in.readLine());
		System.out.println("================================================");
		Connection con=ConnectionFactory.getConnection();
		
		/* oracle 서버에 학생정보를 삭제하는 저장 프로시저 생성
		CREATE OR REPLACE PROCEDURE DELETE_STUDENT
			(VNO IN STUDENT.NO%TYPE, VNAME OUT STUDENT.NAME%TYPE) IS
		BEGIN 
		    SELECT NAME INTO VNAME FROM STUDENT WHERE NO=VNO;
		    IF SQL%FOUND THEN 
		    	DELETE FROM STUDENT WHERE NO=VNO;
		        COMMIT;
		    END IF;    
		EXCEPTION
		    WHEN OTHERS THEN
		        VNAME := NULL;
		END;
		/ 
		*/
	
		String sql="{call delete_student(?,?)}";//저장프로시저 호출
		CallableStatement cstmt=con.prepareCall(sql);
		//CallableStatement.setXXX(int parameterIndex, XXX value)
		// => 저장 프로시저의 IN 모드의 매개변수에 Java 변수값을 전달하기 위한 메소드
		cstmt.setInt(1, no);
        
		//CallableStatement.registerOutParameter(int parameterIndex, int sqlType)
		// => 저장 프로시저의 OUT 모드의 매개변수에 저장된 값을 제공받기 위한 메소드
		// => sqlType : SQL 자료형 - Types 클래스의 상수(Constant) 사용 
		cstmt.registerOutParameter(2, Types.NVARCHAR);
		
		//CallableStatement.execute() : 저장 프로시저 호출 명령을 전달하여 실행하는 메소드
		cstmt.execute();
		
		//CallableStatement.getXXX(int parameterIndex) 
		// => 저장 프로시저의 OUT 모드의 매개변수로 제공받은 값을 반환하는 메소드
		String name=cstmt.getString(2);
		if(name==null) {
			System.out.println("[메세지]해당 학번의 학생정보를 찾을 수 없습니다.");
		} else {
			System.out.println("[메세지]"+name+"님을 삭제 하였습니다.");
		}
		
		ConnectionFactory.close(con, cstmt);
	}
}






profile
Study Log 📂

0개의 댓글