쌍용교육센터 - 23~25일

개발자가 되고 싶어요 ㅣ 2024. 3. 22. 19:40

2024.03.20

패키지(Package)

패키지는 업무와 관련된 Stored ProcedureStored Function관리하고, 이를 패키지 단위로 배포할 때 사용된다. 패키지는 선언부와 본문으로 구분된다.

 

선언부 생성

CREATE OR REPLACE PACKAGE EMPLOYEE_PKG AS
    PROCEDURE PRINT_ENAME(P_EMPNO NUMBER);
    PROCEDURE PRINT_SAL(P_EMPNO NUMBER);
END EMPLOYEE_PKG;

 

본문 생성

CREATE OR REPLACE PACKAGE BODY EMPLOYEE_PKG AS
    PROCEDURE PRINT_ENAME(P_EMPNO NUMBER)
    IS
        E_NAME EMP.ENAME%TYPE;
    BEGIN
        SELECT ENAME
        INTO E_NAME
        FROM EMP
        WHERE EMPNO=P_EMPNO;
        DBMS_OUTPUT.PUT_LINE(E_NAME);
        EXCEPTION WHEN NO_DATA_FOUND
                  THEN DBMS_OUTPUT.PUT_LINE('INVALID EMPLOYEE NUMBER');
    END PRINT_ENAME;
    
    PROCEDURE PRINT_SAL(P_EMPNO NUMBER)
    IS
        E_SAL EMP.SAL%TYPE;
    BEGIN
        SELECT SAL
        INTO E_SAL
        FROM EMP
        WHERE EMPNO=P_EMPNO;
        DBMS_OUTPUT.PUT_LINE(E_SAL);
        EXCEPTION WHEN NO_DATA_FOUND
                  THEN DBMS_OUTPUT.PUT_LINE('INVALID EMPLOYEE NUMBER');
    END PRINT_SAL;
END EMPLOYEE_PKG;

 

트리거(Trigger)

트리거데이터의 변경(INSERT,DELETE,UPDATE)문이 실행될 때 자동으로 같이 실행되는 프로시저를 말한다. 오라클은 기본적으로 실행 전 BEFORE 과 실행 후 AFTER 트리거를 지원한다.

CREATE OR REPLACE TRIGGER PRINT_MESSAGE
AFTER INSERT ON DEPT
BEGIN
    DBMS_OUTPUT.PUT_LINE('DEPT 테이블에 정상적으로 데이터를 추가했습니다.');
END;

트리거를 생성한 후 DEPT 테이블에 데이터를 INSERT하면 등록된 트리거가 동작하면서 'DEPT 테이블에 정상적으로 데이터가 추가되었습니다.'를 출력한다.

FOR EACH ROW와 :NEW

CREATE OR REPLACE TRIGGER AFTERINSERTBOOK
    --FOR EACHH ROW는 매번 추가되는 행의 수만큼 TRIGGER가 발생한다.
AFTER INSERT ON BOOK FOR EACH ROW
BEGIN
    INSERT INTO BOOK_LOG
    -- :NEW.컬럼이름의 형식으로 추가, 수정할 때 해당 컬럼의 새로운 값을 저장한다.
    VALUES (:NEW.BOOKIDM:NEW.BOOKNAME,:NEW.PUBLISHER,:NEW.PRICE);
    DBMS_OUTPUT.PUT_LINE('삽입한 데이터를 BOOK_LOG 테이블에 백업했습니다.');
END;     

 

JDBC(Java Database Connectivity)

JDBC란 자바를 이용하여 데이터베이스에 접근하여 각종 SQL문을 수행할 수 있도록 제공하는 API를 말한다.

 

JDBC의 구조와 역할

JDBC는 크게 JDBC 인터페이스와 JDBC 드라이버로 구성되어 있다.

 

JDBC를 이용한 데이터베이스 연결 방법

1 단계 : 드라이버를 로드 한다.

2 단계 : Connection 객체를 생성한다.

3 단계 : Statement 객체를 생성한다.

4 단계 : SQL문에 결과물이 있다면 ResultSet 객체를 생성한다.

5 단계 : 모든 객체를 닫는다.

 

DDL문(Statement문)

//Conneciton: 오라클과 연동할 때 사용
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
//Statement: 오라클에 SQL문을 넘길 때 사용
import java.sql.Statement;

public class CreateTableMain {
	public static void main(String[] args) {
		String db_driver = "oracle.jdbc.OracleDriver";
		String db_url = "jdbc:oracle:thin:@localhost:1521:xe";
		String db_id = "user01";
		String db_password = "1234";
		
		Connection conn = null;
		Statement stmt = null;
		String sql = null;
		
		try {
			**//JDBC 수행 1단계 : 드라이버 로드**
			Class.forName(db_driver);
			**//JDBC 수행 2단계 : Connection 객체 생성(오라클 접속을 위한 인증)**
			conn = DriverManager.getConnection(db_url,db_id,db_password);
			
			System.out.println("test1 테이블 생성합니다.");
			/*
			 * 테이블을 생성하는 SQL문
			 * 접속한 계정에 테이블명이 중복되면 에러가 발생하기 때문에
			 * 동일 계정에서는 한 번만 수행해야 한다.
			 */
			sql = "CREATE TABLE test1 (id VARCHAR2(10),age NUMBER)";
			
			**//JDBC 수행 3단계 : Statement 객체 생성**
			stmt = conn.createStatement();
			
			**//JDBC 수행 4단계 : SQL문을 실행해서 DB에 테이블을 생성**
			stmt.executeUpdate(sql);
			
			System.out.println("테이블이 정상적으로 생성되었습니다.");
			
		} catch(SQLException e) {
			e.printStackTrace();
		} catch(ClassNotFoundException e) {
			e.printStackTrace();
		} finally{
			**//JDBC 수행 5단계 : 모든 객체를 닫는다.**
			 if(stmt!=null) { try { stmt.close(); } catch(SQLException e) { } }
			 if(conn!=null) { try { conn.close(); } catch(SQLException e) { } }
		}
	}
}

 

DML문(Statement문)

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class SelectMain {
	public static void main(String[] args) {
		String db_driver = "oracle.jdbc.OracleDriver";
		String db_url = "jdbc:oracle:thin:@localhost:1521:xe";
		String db_id = "user01";
		String db_password = "1234";
		
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		String sql = null;
		
		try {
			**//JDBC 수행 1단계 : 드라이버 로드**
			Class.forName(db_driver);
			**//JDBC 수행 2단계 : Connection 객체 생성(오라클 접속을 위한 인증)**
			conn = DriverManager.getConnection(db_url,db_id,db_password);
			sql = "SELECT * FROM TEST1";
			**//JDBC 수행 3단계 : Statement 객체 생성**
			stmt = conn.createStatement();
			**//JDBC 수행 4단계 : SQL문을 실행해서 테이블로부터 레코드(행)을 전달받아서 결과집합을 만들고 ResultSet 객체에 담아서 반환**
			rs = stmt.executeQuery(sql);
			
			System.out.println("ID\\t나이");
			//ResultSet에 보관된 결과집합에 접근해서
			//행단위로 데이터를 추출
			while(rs.next()) {
				//컬럼명을 통해서 데이터를 반환
				/*
				System.out.print(rs.getString("id"));
				System.out.print("\\t");
				System.out.println(rs.getInt("age"));
				*/
				//컬럼 인덱스를 통해서 데이터를 반환
				System.out.print(rs.getString(1)); //id
				System.out.print("\\t");
				System.out.println(rs.getString(2)); //age
			}
		} catch(SQLException e) {
			e.printStackTrace();
		} catch(ClassNotFoundException e) {
			e.printStackTrace();
		} **//JDBC 수행 5단계 : 모든 객체를 닫는다.**
			 if(stmt!=null) { try { stmt.close(); } catch(SQLException e) { } }
			 if(conn!=null) { try { conn.close(); } catch(SQLException e) { } }
		}
	}
}

 

자주 사용하며 겹치는 내용(객체 생성, 자원 정리)들을 따로 DBUtil이라는 클래스를 만들어 작성해두고 사용하면 코드 재사용성이 높아진다.

private : 외부에서의 데이터 접근을 막기 위해 사용

final : 내부에서의 데이터 변경을 막기 위해 사용

public class DBUtil {
	//crtl + shift + x -> 선택 영역 대문자
	//crtl + shift + y -> 선택 영역 소문자
	private static final String DB_DRIVER = "oracle.jdbc.OracleDriver";
	private static final String DB_URL = "jdbc:oracle:thin:@localhost:1521:xe";
	private static final String DB_ID = "user01";
	private static final String DB_PASSWORD = "1234";
	
	//Connection 객체를 생성해서 반환
	public static Connection getConnection() throws ClassNotFoundException, SQLException{
		//JDBC 수행 1단계 : 드라이버 로드
		Class.forName(DB_DRIVER);
		//JDBC 수행 2단계 : Connection 객체 생성
		Connection conn = DriverManager.getConnection(DB_URL,DB_ID,DB_PASSWORD);
		return conn;
	}
	//자원정리
	public static void executeClose(ResultSet rs, PreparedStatement pstmt, Connection conn) {
		if(rs!=null)try {rs.close();}catch(SQLException e) {}
		if(pstmt!=null)try {pstmt.close();}catch(SQLException e) {}
		if(conn!=null)try {conn.close();}catch(SQLException e) {}
	}
	public static void executeClose(CallableStatement cstmt,Connection conn) {
		if(cstmt!=null)try {cstmt.close();}catch(SQLException e) {}
		if(conn!=null)try {conn.close();}catch(SQLException e) {}
	}
}

 

DDL문(PreparedStatement문)

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import kr.util.DBUtil;

public class SelectMain {
	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql = null;
		try {
			//1,2단계
			conn =DBUtil.getConnection();
			//SQL문 작성
			sql = "SELECT * FROM TEST2 ORDER BY REG_DATE DESC";
			
			//3단계
			// statement는 createStatement해서 나중에 sql을 전달하고
			// preparedStatement는 prepareStatement해서 즉각 sql을 전달한다.
			pstmt = conn.prepareStatement(sql);
			
			//4단계 : SQL문을 실행해서 테이블에 반영하고 결과집합을 ResultSet에 담아서 반환
			rs = pstmt.executeQuery();
			System.out.println("id\\tname\\tage\\treg_date");
			while(rs.next()) {
				System.out.print(rs.getString("id")+"\\t");
				System.out.print(rs.getString("name")+"\\t");
				System.out.print(rs.getInt("age")+"\\t");
				// YYYY-MM-DD
//				System.out.print(rs.getDate("reg_date")+"\\n");
				// YYYY-MM-DD hh:mm:ss
				System.out.print(rs.getString("reg_date")+"\\n");
			}
			
			
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			//자원 정리
			DBUtil.executeClose(rs, pstmt, conn);
		}
	}
}

'IT 국비 교육' 카테고리의 다른 글

쌍용교육센터 - 27일  (1) 2024.03.26
쌍용교육센터 - 26일  (1) 2024.03.25
쌍용교육센터 - 22일  (0) 2024.03.19
쌍용교육센터 - 21일  (3) 2024.03.18
쌍용교육센터 - 20일  (2) 2024.03.15