본문 바로가기

Programming/[DB]

[DB] 서브프로그램(프로시저, 패키지, 트리거)

프로시저

프로시저와 함수는 문법이나 특징이 거의 비슷하다

차이점은 함수는 return을 하지만 프로시저는 그렇지 않다

 

프로시저란 지정된 특정 처리를 실행하는 서브 프로그램의 한 유형으로 단독으로 실행되거나 다른 프로시저나 다른 틀 또는 다른 환경등에서 호출되어 실행 됩니다. 처음 생성 후 컴파일 할 때 오브젝트로서 데이터베이스 내에에 저장되며 이후로 반복적으로 호출되어 실행 될 때 별도의 컴파일 없이 생성된 코드로 바로 실행할 수 있습니다

 

경우에 따라서는 우리가 만든 pl/sql을 저장해 놓고 필요한 경우 호출하여 사용할 수 있다

 

<기본형식>

CREATE OR REPLACE PROCEDURE [생성할 프로시저명]

(매개변수(PARAMETER)1 [MODE] 데이터 타입

)

IS

로컬변수 선언 / 생략가능

BEGIN

실행문장(STATEMENT)1;

END;

/

 

패키지

사저적 의미 : 꾸러미

관련있는 함수나 프로시저를 봐 효율적으로 관리하기 위해 패키지 단위로 배포할 때 유용하다

훨씬 업무가 간결하고 편해지는 효과

 

구조

선언부 + 몸체부

선언부 : 패키지에 사용될 함수나 프로시저, 변수 등 정의를 선언하는 부분

몸체부 : 실체

 

패키지 선언부에서 선언되지 않더라도, 패키지 몸체부에서 사용될 수는 있지만 권장사항이 아니다

코드의 가독성을 위해서라도 선언부에서 선언한 후 몸체부에서 사용하길 바람

 

<기본형식>

 

주의사항

OR REPLACE : 생성하고자 하는 패키지가 기존에 동일명으로 존재할 경우, 기존의 내용을 현재의 내용으로 수정하는 옵션입니다. 이 옵션은 해당 패키지를 삭제한 후 재생성합니다

패키지이름 : 생성하고자 하는 스키마 내에서는 유일한 이름이어야 한다. 패키지 선언부와 패키지 몸체부의 패키지명은 동일해야 한다는 점도 꼭 기억

PROCEDURE 프로시저이름 : 변수, 상수, 명시적 커서, 사용자 정의 예외, PRAGMA등을 선언 모두 PUBLIC

SUBPROGRAM BODIES : 이 부분이 실제 작동할 서브 프로그램을 기록하는 부분

 

패키지 실행 : EXEC 패키지이름, 프로시저 이름

패키지는 여러 환경에서 호출 되어 실행가능

패키지에 대한 실행 권한을 가진 사용자만 실행 시킬 수 있다

 

변경

만약 생성된 패키지의 선언부가 변경되었다면 무조건 패키지 몸체부는 다시 재생성해야하며, 패키지를 참조하는 서브프로그램들도 재번역해야하니다

그러나 반대로 패키지 몸체부만 변경되는 경우라면 패키지 선언부와 다른 관련 서브 프로그램에 영향을 주지 않고 몸체부만 재생성하면 됩니다

 

삭제

DROP PACKAGE 패키지명;

* 패키지를 삭제할 때에는 패키지 선언부와 패키지 몸체부를 모두 삭제할 수도 있고 패키지 몸체부만 삭제할 수도 있습니다

 

트리거

사전적 의미 : 방아쇠 -> 일련의 사건등을 유발하는 계기

특정 이벤트가 발생할 때마다 자동으로 실행되는 PL/SQL BLOCK

개발자가 호출하여 사용할 수 없다

DB 내에 오브젝트로 저장되어 관리

가장 많이 사용되는 TRIGGER의 유형으로는 DML TRIGGER

 

특징

TRIGGER를 생성하려면 권한이 필요하다

RIGGER를 이루는 BODY부분에 TCL명령은 포함될 수 없다

TRIGGER에대한 정보는 USER_OBJECTS, USER_RIGGERS, USER_ERRORS DICTIONARY 를 조회하면 알 수 있다

 

<기본형식>

 

 

BEFORE TRIGGER

테이블에서 DML 이벤트를 TRIGGER하기 전 TRIGGER 본문 실행

AFTER TRIGGER

테이블에서 DML 이벤트를 TRIGGER한 후 TRIGGER본문 실행

INSTEAD OF TRIGGER

TRIGGER문 대신 TRIGGER 본문 실행, 다른 방법으로 수정 불가능한 뷰에 사용

 

단순DML TRIGGER 유형

문장 TRIGGER

영향을 받는 행이 전혀 없더라도 TRIGGER가 한번은 실행

행TRIGGER

테이블이 TRIGGER 이벤트의 영향을 받을 때마다 실행

FOR EACH ROW

OLD : TRIGGER가 처리한 레코드의 원래 값 저장

NEW : 새 값을 포함

 
 

 

'Programming > [DB]' 카테고리의 다른 글

[DB] SQL DEVELOPER 설치  (0) 2018.04.23
[DB] 보안  (0) 2018.04.23
[DB] INDEX & 동의어 & 시퀀스  (0) 2018.04.20
[DB] 스키마 & 파티션  (0) 2018.04.20
[DB] VIEW  (0) 2018.04.20