2024.03.20
패키지(Package)
패키지는 업무와 관련된 Stored Procedure 및 Stored 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 |