1. 저장 서브프로그램
: 여러 번 사용할 목적으로 이름을 지정하여 오라클에 저장해 두는 PL/SQL프로그램
○ 익명블록과 저장 서브 프로그램의 차이
※ 익명블록: 한 번 실해한 뒤 다시 실행하려면 다시 작성해야하는 PL/SQL블록
익명 블록 | 저장 서브 프로그램 | |
이름 | 이름 없음 | 이름 지정 |
오라클 저장 | 저장할 수 없음 | 저장함 |
컴파일 | 실행할 때마다 컴파일 | 저장할 때 한 번 컴파일 |
공유 | 공유할 수 없음 | 공유하여 사용 가능 |
다른 응용 프로그램에서의 호출 가능 여부 | 호출할 수 없음 | 호출 가능 |
○ 저장 서브프로그램 구현 방식
서브 프로그램 | 용도 |
저장 프로시저 (stored procedure) |
일반적으로 특정 처리 작업 수행을 위한 서브프로그램으로 SQL문에서는 사용할 수 없음 |
저장 함수 (stored function) |
일반적으로 특정 연산을 거친 결과 값을 반환하는 서브프로그램으로 SQL문에서 사용할 수 있음 |
패키지(package) | 저장 서브프로그램을 그룹화하는 데 사용 |
트리거(trigger) | 특정 상황(이벤트)이 발생할 때 자동으로 연달아 수행할 기능을 구현하는 데 사용 |
2. 프로시저
- 파라미터를 사용하지 않는 프로시저
: 작업 수행에 별다은 입력 데이터가 필요하지 않을 경우 파라미터를 사용하지 않는 프로시저 사용
○ 프로시저 생성하기
CREATE [OR REPLACE] PROCEDURE 프로시저 이름 IS | AS 선언부 BEGIN 실행부 EXCEPTION 예외 처리부 END[프로시저 이름]; |
[OR REPLACE] : 저장한 프로시저 이름을 가진 프로시저가 이미 존재하는 경우 현재 작성한 내용으로 대체(생략가능 옵션) |
프로시저 이름: 저장할 프로시저 고유의 이름 지정/같은 스키마 내에서 중복 불가 |
IS | AS: 선언부를시작하기 위해 IS또는AS키워드 사용, 선언부가 존재하지 않더라도 반드시 명시,DECLARE 키워드는 사용x |
EXCEPTION: 예외 처리부는 생략 가능 |
END[프로시저 이름]; : 프로시저 생성의 종료를 뜻하며 프로시저 이름은 생략 가능 |
○ SQL*PLUS로 프로시저 생성하기
생성한 프로시저는 SQL*PLUS에서 바로 사용하거나 다른 PL/SQL블록에서 실행가능
EXECUTE 프로시저 이름; |
○ PL/SQL블록에서 프로세저 실행하기
BEGIN 프로시저 이름; END; |
○ 익명 블록에서 프로시저 실행하기
○ 프로시저 내용 확인하기 - USER_SOURCE 데이터 사전에서 조회
USER_SOURCE의 열 | 설명 |
NAME | 서브 프로그램(생성 객체) 이름 |
TYPE | 서브 프로그램 종류(PROCEDURE, FUNCTION) 등 |
LINE | 서브 프로그램에 작성한 줄 번호 |
TEXT | 서브 프로그램에 작성한 소스 코드 |
○ 프로시저 삭제하기
- 파라미터를 사용하는 프로시저
CREATE [OR REPLACE] PROCEDURE 프로시저 이름 [(파라미터 이름1[modes] 자료형 [:=|DEFAULT 기본값], 파라미터 이름2[modes] 자료형 [:=|DEFAULT 기본값], ... 파라미터 이름N[modes] 자료형[:=|DEFAULT 기본값] )] IS | AS 선언부 BEGIN 실행부 EXCEPTION 예외 처리부 END[프로시저 이름]; |
[OR REPLACE] : 지정한 프로시저 이름을 가진 프로시저가 이미 존재하는 경우에 현재 작성한 내용으로 대체합니다. 즉 덮어쓴다는 뜻이며 생략 가능한 옵션입니다. |
프로시저 이름 : 저장할 프로시저의 고유 이름을 지정/ 같은 스키마 내에서 중복될 수 없음 |
[(파라미터 이름1[modes] 자료형 [:=|DEFAULT 기본값], : 실행에 필요한 파라미터를 정의, 파라미터는 쉼표(,)로 구분하여 여러 개 지정할 수 있음/ 기본값과 모드는 생략가능, 자료형은 자릿수 지정 및 NOT NULL 제약 조건 사용이 불가능 |
IS | AS : 선언부를 시작하기 위해 IS 또는 AS키워드를 사용. 선언부가 존재하지 않더라도 명시, DECLARE키워드는 사용X |
EXCEPTION : 예외 처리부는 생략 가능 |
END[프로시저 이름]; : 프로시저 생성 종료를 뜻하며 프로시저 이름은 생략 가능 |
○ 파라미터 지정할 때 사용하는 모드
파라미터 모드 | 설명 |
IN | 지정하지 않으면 기본값으로 프로시저를 호출할 때 값을 입력받음 |
OUT | 호출할 때 값을 반환 |
IN OUT | 호출할 때 값을 입력받은 후 실행 결과 값을 반환 |
○ IN 모드 파라미터
프로시저 실행에 필요한 값을 직접 입력받는 형식의 파라미터를 지정할 때 IN을 사용, 기본값이라 생략가능
파라미터에 값을 지정하는 방식 | |
종류 | 설명 |
위치 지정 | 지정한 파라미터 순서대로 값을 지정하는 방식 |
이름 지정 | => 연산자로 파라미터 이름을 명시하여 값을 지정하는 방식 |
혼합 지정 | 일부 파라미터는 순서대로 값만 지정하고 일부 파라미터는 =>연산자로 값을 지정하는방식 |
○ OUT 모드 파라미터: 프로시저 실행 후 호출한 프로그램으로 값을 반환
○ IN OUT모드 파라미터 : 값을 입력받을 때와 프로시저 수행 후 결과 값 반활할 때 사용
- 프로시저 오류 정보 확인하기
SHOW ERRORS는 줄여서 SHOW ERR로 쓸 수도 있음/ 특정 프로그램의 오류 정보를 확인하고 싶은 경우 아래의 질의로 실행 |
SHOW ERR 프로그램 종류 프로그램 이름; |
○ USER_ERRORS로 오류 확인하기
3. 함수
○ 프로시저와 함수의 차이점
특징 | 프로시저 | 함수 |
실행 | EXECUTE명령어 또는 다른 PL/SQL 서브프로그램 내에서 호출하여 실행 | 변수를 사용한 EXECUTE 명령어 또는 다른PL/SQL 서브프로그램에서 호출하여 실행하거나 SQL문에서 직접 실행 가능 |
파라미터 지정 | 필요에 따라 지정하지 않을 수도 있고 여러 개 지정할 수도 있으며 IN, OUT, IN OUT 세 가지 모드를 사용할 수 있음 | 프로시저와 같게 지정하지 않을 수도 있고 여러 개 지정할 수 있지만 IN모드(또는 생략)만 사용 |
값의 반환 | 실행 후 값의 반환이 없을 수도 있고 OUT, IN OUT 모드의 파라미터 수에 따라 여러 개 값을 반환할 수 있음 | 반드시 하나의 값을 반환해야 하며 값의 반화는 프로시저와 달리 OUT, IN OUT모드의 파라미터를 사용하는 것이 아니라 RETURN절과 RETURN문을 통해 반환 |
- 함수 생성하기
CREATE [OR REPLACE] FUNCTION 함수 이름 [(파라미터 이름1 [IN] 자료형1, 파라미터 이름2 [IN] 자료형2, ... 파라미터 이름N [IN] 자료형N )] RETURN 자료형 IS | AS 선언부 BEGIN 실행부 RETURN (반환 값); EXCEPTION 예외 처리부 END[함수 이름]; |
[(파라미터 이름1 [IN] 자료형1, : 함수 실행에 사용할 입력 값이 필요하면 파라미터를 지정, 파라미터 지정은 생략 가능하며 필요에 따라 여러 개 정의가능, 프로시저와 달리 IN모드만 지정, :=, DEFAULT 옵션으로 기본값 지정가능 |
RETURN 자료형: 함수의 실행 후 반환 값의 자료형을 정의 |
RETURN (반환 값);: 함수의 반환 값을 지정 |
- 함수 실행하기
○ PL/SQL로 함수 실행하기
○ SQL문에서 함수 실행하기
- 함수 삭제하기
4. 패키지
: 업무나 기능 면에서 연관성이 높은 프로시저, 함수 등 여러 개의 PL/SQL서브프로그램을 하나의 논리 그룹으로 묶어 통합 관리하는 데 사용하는 객체
장점 | 설명 |
모듈성 | 서브프로그램을 포함한 여러 PL/SQL 구성 요소를 모듈화할 수 있음. 모듈성은 잘 묶어 둔다는 뜻으로 프로그램의 이해를 쉽게 하고 패키지 사아의 상호 작용을 더 간편하고 명료하게 해 주는 역할, 즉PL/SQL로 제작한 프로그램의 사용 및 관리에 큰 도움 |
쉬운 응용 프로그램 설계 | 패키지에 포함할 서브프로그램은 완벽하게 완성되지 않아도 정의 가능 이 때문에 전체 소스 코드를 다 작성하기 전에 미리 패키지에 저장할 서브프로그램을 지정할 수 있으므로 설계가 수월해짐 |
정보 은닉 | 제작 방식에 따라 패키지에 포함하는 서브프로그램의 외부 노출 여부 또는 접근 여부를 지정할 수 있음. 즉 서브 프로그램을 사용할 때 보안 강화됨 |
기능성 향상 | 패키지 내부에는 서브프로그램 외에 변수,커서,예외 등도 각 세션이 유지되는 동안 선언해서 공용(public)으로 사용할 수 있음. 예를 들어 특정 커서 데이터는 세션이 종료되기 전까지 보존되므로 여러 서브프로그램에서 사용할 수 있음 |
성능 향상 | 패키지를 사용할 때 패키지에 포함한 모든 서브 프로그램이 메모리에 한 번에 로딩되는데 메모리에 로딩된 후의 호출은 디스크 I/O를 일으키지 않으므로 성능이 향상됨 |
- 패키지 구조와 생성: 패키지는 명세, 본문으로 나누어 제작함
○ 패키지 명세 : 변수, 상수, 예외, 커서 그리고 PL/SQL 서브프로그램을 선언하는 용도로 작성
CREATE [OR REPLACE] PACKAGE 패키지 이름 IS | AS 서브프로그램을 포함한 다양한 객체 선언 END [패키지 이름]; |
○ 패키지 본문 : 패키지 명세에서 선언한 서브프로그램 코드작성, 본문이름과 명세이름은 같게 지정해야 함
CREATE [OR REPLACE] PACKAGE BODY 패키지 이름 IS | AS 패키지 명세에서 선언한 서브 프로그램을 포함한 여러 객체를 정의 경우에 따라 패키지 명세에 존재하지 않는 객체 및 서브프로그램도 정의가능 END[ 패키지 이름]; |
○ 서브 프로그램 오버로드 : 서브프로그램 이름은 중복될 수 없으나 같은 패키지에서 사용하는 파라미터의 개수, 자료형, 순서가 다를경우에 한해서만 이름이 같은 서브프로그램을 정의하는 것
CREATE [OR REPLACE] PACKAGE 패키지이름 IS | AS 서브프로그램 종류 서브프로그램 이름(파라미터 정의); 서브프로그램 종류 서브프로그램 이름(개수나 자료형, 순서가 다른 파라미터 정의); END [패키지 이름]; |
- 패키지 사용하기
패키지 이름.객체 이름; |
- 패키지 삭제하기
패키지 명세와 본문을 한 번에 삭제하기 DROP PACKAGE 패키지 이름; |
패키지의 본문만을 삭제 DROP PACKAGE BODY 패키지 이름; |
5. 트리거
데이터베이스 안의 특정 상황이나 동작, 이벤트가 발생할 경우 자동으로 실행되는 기능을 정의하는 PL/SQL 서브 프로그램
○ 트리거의 장점
1. 데이터가 연관된 여러 작업을 수행하기 위해 여러 PL/SQL문 또는 서브프로그램을 일일이 실행해야 하는 번거로움을 줄일 수 있음. 2. 제약 조건만으로 구현이 어렵거나 불가능한 좀 더 복잡한 데이터 규칙을 정할 수 있어 수준높은 데이터 정의 가능 3. 데이터 변경과 관련된 일련의 정보를 기록해 둘 수 있어 여러 사용자가 공유하는데이터 보안성과 안정성 그리고 문제가 발생했을 때 대처 능력을 높일 수 있음 |
○ 트리거 동작을 지정할 수 있는 수준
- 데이터 조작어(DML): INSERT, UPDATE, DELETE - 데이터 정의어(DDL): CREATE, ALTER, DROP - 데이터베이스 동작: SERVERERROR, LOGON, LOGOFF, STARTUP, SHUTDOWN |
○ 트리거가 발생할 수 있는 이벤트 종류에 따른 구분
종류 | 설명 |
DML 트리거 | INSERT, UPDATE, DELETE와 같은 DML명령어를 기점으로 동작 |
DDL 트리거 | CREATE, ALTER, DROP과 같은 DDL 명령어를 기점으로 동작 |
INSTEAD OF 트리거 | 뷰에 사용하는 DML명령어를 기점으로 동작 |
시스템(system)트리거 | 데이터베이스나 스키마 이벤트로 동작 |
단순(simple) 트리거 | 다음 각 시점에 동작함 - 트리거를 작동시킬 문장이 실행되기 전 - 트리거를 작동시킬 문장이 실행된 후 - 트리거를 작동시킬 문장이 행에 영향을 미치기 전 - 트리거를 작동시킬 문장이 행에 영향을 준 후 |
복합(compound)트리거 | 단순 트리거의 여러 시점에 동작 |
- DML트리거(사용빈도가 가장 높음)
CREATE [OR REPLACE] TRIGGER 트리거 이름--트리거 이름을명시하고 트리거 생성, 갱신하려면 OR REPLACE 키워드 사용 BEFORE | AFTER--트리거가 작동할 타이밍 지정, BEFORE은 실행되기 전 AFTER은 실행된 후 작동하게 됨 INSERT | UPDATE | DELETE ON 테이블 이름--지정한 테이블에 트리거가 작동할 DML명령어 작성 여러 종류 지정 OR로 구분 REFERENCING OLD AS old | New AS new--DML로 변경되는 행의 변경 전 값과 변경 후 값 참조할 때 사용(생략 가능) FOR EACH ROW WHEN 조건식 --트리거를 실행하는 DML문장에 한 번만 실행할 지 영향받는 행별로 실행할 지 지정, 생략하는 경우 DML명령어 실행될 때 한 번만 실행, 생략하지 않는 경우 DML명령어에 영향받는 행별로 트리거를 작동하되 WHEN을 사용하면 DML영향받는 행 중 트리거를 작동시킬 행을 조건식으로 지정가능 FOLLOWS 트리거 이름2, 트리거 이름 3... ENABLE | DISABLE DECLARE 선언부 BEGIN 실행부 EXCEPTION 예외 처리부 END; |
- DML 트리거의 제작 및 사용(BEFORE)
- DML 트리거의 제작 및 사용(AFTER)
- 트리거 관리
○ 트리거 정보 조회: USER_TRIGGERS 데이터 사전 조회
- 트리거 변경
ALTER TRIGGER 트리거 이름 ENABLE | DISABLE; (특정 트리거 활성화 비활성화 옵션) |
특정 테이블과 관련된 모든 트리거의 상태 활성화 ALTER TABLE 테이블 이름 ENABLE ALL TRIGGERS; |
특정 테이블과 관련된 모든 트리거의 상태 비활성화 ALTER TABLE 테이블 이름 DISABLE ALL TRIGGERS; |
- 트리거 삭제
DROP TRIGGER 트리거 이름; |
'공부 > 데이터베이스' 카테고리의 다른 글
[오라클로 배우는 데이터베이스 입문] 18. 연습문제 (0) | 2022.04.11 |
---|---|
[오라클로 배우는 데이터베이스 입문] 18. 특정 열을 선택하여 처리하는 커서 (0) | 2022.04.10 |
[오라클로 배우는 데이터베이스 입문] 17. 연습문제 (0) | 2022.04.07 |
[오라클로 배우는 데이터베이스 입문] 17. 레코드와 컬렉션 (0) | 2022.04.07 |
[오라클로 배우는 데이터베이스 입문] 16. 연습문제 (0) | 2022.04.07 |