- 커서(Cursor)란?
하나의 레코드가 아닌 다중의 레코드로 구성된 작업 영역에서 SQL 문을 실행하고 그 과정에서 발생한 정보를 저장하기 위해 커서를 사용한다. 커서는 암시적 커서와 명시적 커서로 구분되는데 암시적 커서는 모든 SQL 문에서 존재한다. 하지만 암시적 커서는 오직 하나의 행만 출력하게 되므로 다중 행에 대한 처리가 필요한 경우엔 명시적으로 커서를 정의(=선언)해 주어야 한다.
▶ 형식 및 구조
CREATE [OR REPLACE] (TRIGGER or PROCEDURE or ...)
DECLARE
CURSOR 커서명
IS
SELECT 컬럼명
FROM 테이블명;
BEGIN
OPEN 커서명;
/*
수헹해야 힐 기능 구현
*/
CLOSE 커서명;
END;
-- 커서는 꼭 OPEN 후에 CLOSE 해주어야 한다.
- 트리거(Trigger)란?
INSERT, UPDATE, DELETE 작업이 일어날 때 자동적으로 실행되는 객체이며 Trigger 내에서는 COMMIT 과 ROLLBACK 문법을 사용할 수 없다.
오라클 DBMS의 경우 실행 전 Before Trigger 와 실행 후 After Trigger 를 지원한다. 이들은 각각 Before Statement Trigger / Before Row Trigger 로, After Statement Trigger / After Row Trigger 로 구분된다.
- AFTER STATEMENT TRIGGER : DML 수행 후에 실행 (ex.떠든 사람 떠든 후 칠판에 이름 적기)
- AFTER ROW TRIGGER : DML 수행 후에 실행 (ex.출고 데이터 삽입 시 재고, 판매 테이블에 적절한 데이터 각각 업데이트)
- BEFORE STATEMENT TRIGGER : DML 수행 전에 실행 (ex.INSERT 하기 전에... 일단 작업이 가능한 상황인가요~?)
- BEFORE ROW TRIGGER : DML 수행 전에 실행(ex.INSERT 하기 전에... 관련 참조키 있으면 일단 다 지워주세요ㅜ)
▶ 형식 및 구조
CREATE [OR REPLACE] TRIGGER 트리거명
[BEFORE | AFTER]
이벤트1 [OR 이벤트2 [OR 이벤트3]] ON 테이블명
[FOR EACH ROW [WHEN TRIGGER 조건]]
[DECLARE]
-- 선언구문;
BEGIN
-- 실행 구문;
END;
▶ EACH ROW 트리거에서만 사용 가능한 표현(STATEMENT X)
:OLD.컬럼명 - DML 문 수행 전의 자료
:NEW.컬럼명 - DML 문 수행 후의 자료
▶ 프로시저 vs 트리거
프로시저와 트리거를 공부하며 어떤 기능은 프로시저가 적합한지, 어떤 기능은 트리거가 적합한지 혼란스러웠다. 정확한 해답을 아직 찾지 못 했지만 우선 트리거보다는 프로시저를 사용하는 것이 더 라이트하고
프로시저 -> 사용 유무를 컨트롤 할 수 있다.
트리거 -> 사용 유무를 커트롤 할 수 없다.
라는 점만 기억하자.
- 패키지(Package)란?
관계되는 타입, 프로그램 객체, 서브 프로그램(Procedure, Function 등)을 논리적으로 묶어 놓은 것이다. 패키지는 서로 유사한 업무에 사용되는 여러 프로시저와 함수를 하나의 패키지로 만들어 관리함으로써 향후 유지보수가 편리하고 전체 프로그램을 모듈화 할 수 있다는 장점이 있다.
패키지는 명세부(Package Specification)와 몸체(Package Body)로 구성되어 있다. 명세 부분에는 Type, Constraint, Variable, Exception, Cursor, Subprogram 이 선언되고 몸체 부분에는 이들의 실제 내용이 존재한다.
호출 방법은 패키지명.프로시저명 과 같은 형식의 참조를 이용해야 한다.
▶ 형식 및 구조(명세부)
CREATE [OR REPLACE] PACKAGE 패키지명
IS
전역변수 선언;
커서 선언;
예외 선언;
함수 선언;
프로시저 선언;
:
END 패키지명;
CREATE OR REPLACE PACKAGE MEMBER_PACK
IS
FUNCTION FN_GENDER(SSN VARCHAR2)
RETURN VARCHAR2;
END MEMBER_PACK;
▶ 형식 및 구조(몸체부)
CREATE [OR REPLACE] PACKAGE BODY 패키지명
IS
FUNCTION 함수명[(인수, ...)]
RETURN 자료형
IS
변수 선언;
BEGIN
함수 몸체 구정 코드;
RETURN 값;
END;
RPDOCEDURE 프로시저명[(인수, ...)]
IS
변수 선언;
BEGIN
프로시저 몸체 구성 코드;
END;
END 패키지명;
CREATE OR REPLACE PACKAGE BODY MEMBER_PACK
IS
FUNCTION FN_GENDER(SSN VARCHAR2)
RETURN VARCHAR2
IS
RESULT VARCHAR2(20);
BEGIN
IF(SUBSTR(SSN,8,1) IN ('1', '3'))
THEN RESULT := '남자';
ELSIF(SUBSTR(SSN,8,1) IN ('2', '4'))
THEN RESULT := '여자';
ELSE
RESULT := '확인불가';
END IF;
RETURN RESULT;
END;
END MEMBER_PACK;
-- 호출 방법
~~~ MEMBER_PACK.FN_GENDER(SSN);
'Study📚 > Oracle' 카테고리의 다른 글
Oracle - 프로시저(Procedure), 함수(Function) (0) | 2023.11.19 |
---|---|
Oracle - PL/SQL, IF문, CASE문, 반복문 (0) | 2023.11.19 |
Oracle - 문자열 함수 (0) | 2023.11.05 |
Oracle - INSERT, UPDATE, DELETE, ORDER BY 절 (0) | 2023.11.05 |
Oracle - 허얼마나 남았나... (0) | 2023.10.29 |