PL/SQL (프로시저, 함수, 트리거)

2025. 6. 11. 00:24·database

프로시저

  • 매개 변수를 사용할 수 있고 반복해서 사용할 수 있는 이름이 있는 PL/SQL 블록
  • 리턴값 없음!
  • 연속 실행 또는 구현이 복잡한 트랜잭션을 수행하는 PL/SQL 블록을 데이터베이스에 저장하기 위해 생성
  • 데이터베이스 내에서 미리 컴파일되어 저장되므로, 실행시간때 컴파일 해야 하는 SQL문보다 빠르게 실행
  • 매개변수: 블록 안에서의 변수와 똑같이 일시적으로 값을 저장하는 역할
    • IN
      • 호출 환경으로부터 프로시저로 값을 전달
      • 상수, 수식 또는 초기화된 변수 사용
    • OUT
      • 프로시저로부터 호출 환경으로 값을 전달
      • 초기화되지 않은 변수를 매개변수로 사용
      • 명시적으로 지정해야 함
CREATE or replace PROCEDURE select_ename(v_empno IN number) IS
 v_ename emp.ename%type;
BEGIN
 SELECT ename
 INTO   v_ename
 FROM emp
 WHERE empno= v_empno;
 DBMS_OUTPUT.PUT_LINE('이름 : ' || v_ename);
END;

 

함수

  • 매개 변수를 사용할 수 있고 반복해서 사용할 수 있는 이름이 있는 PL/SQL 블록
  • 리턴값 있음, IN 매개변수만 사용
  • 프로시저와의 차이점은 결과값을 return한다는 것과 IN 매개변수만 사용 가능하다는 것
CREATEor replace FUNCTION get_incsal (v_empno NUMBER, rate IN  NUMBER) RETURN NUMBER
IS
 	v_sal emp.sal%type;
BEGIN 
 	SELECT sal
 	INTO v_sal
 	FROM emp
 	WHERE empno = v_empno;
    
 	v_sal := v_sal * rate;
 	RETURN v_sal; 
END;

 

트리거

  • 데이터베이스에 특정한 변경이 가해졌을 때 이에 대응해서 자동으로 호출하는 일종의 프로시저
  • 데이터베이스 테이블에 갱신 DML문이 발생할 때 수행
  • INSERT, UPDATE, DELETE문의 사용에 사건을 정의할 수 있으며 이들을 실행할 때 정의된 트리거도 자동실행
  • 데이터베이스에 저장
  • 뷰에 대해서가 아니라 테이블에 관해서만 정의
  • 테이블 생성시 참조 무결성과 데이터 무결성 그 밖의 다른 제약조건으로 정의할 수 없는 복잡한 요구사항에 대한 제약조건을 생성할 수 있다.
  • 문장 트리거
    • 트리거 사건에 의해 단 한번 실행
    • 컬럼의 각 데이터행 제어 불가능
    • 컬럼의 데이터 값에 상관없이 변화가 일어남을 감지하여 실행되는 트리거
  • 행 트리거
    • 컬럼의 각각의 데이터행에 변화가 생길때마다 실행
    • 변화가 생긴 데이터행의 실제값 제어 가능
    • 데이터행의 실제값을 수정, 변경 또는 저장할 때 사용
CREATE or replace TRIGGER enable_emp
BEFORE
INSERT OR DELETE OR UPDATE
ON EMP

DECLARE  -- 변수를 선언할때DECLARE문사용
	disable_time EXCEPTION;
BEGIN
 	IF  (TO_CHAR(SYSDATE,'HH24:MI') >= ‘14:00' and TO_CHAR(SYSDATE,'HH24:MI') <= ‘24:00') THEN
 		RAISE disable_time;
 	END IF;
 	EXCEPTION
 		WHEN disable_time THEN 
			RAISE_APPLICATION_ERROR(-20500, '업무시간에만 사용 가능합니다.');
END;

 

CREATE or replace TRIGGER trigger_test
BEFORE  UPDATE ON dept
FOR EACH ROW      --행트리거

BEGIN
 DBMS_OUTPUT.PUT_LINE('변경 전 컬럼 값: ' || :old.dname);
 DBMS_OUTPUT.PUT_LINE('변경 후 컬럼 값: ' || :new.dname);
END;

'database' 카테고리의 다른 글

데이터베이스 프로그래밍 과제 / 최신 데이터베이스  (0) 2025.06.11
데이터베이스 성능 향상[Index]  (0) 2025.06.11
Transaction(트랜잭션)  (0) 2025.06.11
PL/SQL 커서(Cursor)와 예외처리  (0) 2025.06.11
PL/SQL [Oracle]  (0) 2025.06.10
'database' 카테고리의 다른 글
  • 데이터베이스 성능 향상[Index]
  • Transaction(트랜잭션)
  • PL/SQL 커서(Cursor)와 예외처리
  • PL/SQL [Oracle]
chanhuy
chanhuy
  • chanhuy
    차늬
    chanhuy
  • 전체
    오늘
    어제
    • 분류 전체보기 (34)
      • algorithm (9)
      • Python (2)
      • database (8)
      • csts (3)
      • Operating System (0)
      • 오픈소스SW (1)
      • Git & Github (4)
      • 프로젝트 회고 (3)
      • 정보처리기사 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    dynamic programming
    pl/sql
    시간복잡도
    greedy
    Git
    알고리즘
    COMMIT
    index
    프로젝트후기
    recursion
    backtracking
    Python
    오픈소스SW
    Reduction
    algorithm
    graph algorithms
    D&C
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
chanhuy
PL/SQL (프로시저, 함수, 트리거)
상단으로

티스토리툴바