프로젝트/데이터베이스

트리거를 이용한 실습문제(1번)

쿠키담임선생님 2022. 9. 29. 16:58

트리거를 이용한 문제

  1. EMP 테이블에 데이터가 입력되면 EMP_OLD 테이블이 있다면 이 테이블에 INSERT

    없다면 EMP_OLD 테이블을 만들고 이 테이블에 INSERT 하는 행 레벨 트리거를 작성하시오.

    (입력되는 SAL 값이 3000보다 큰 경우에만 트리거가 동작하도록)

   CREATE OR REPLACE TRIGGER homework_trigger
    AFTER INSERT
       ON EMP
      FOR EACH ROW
     WHEN (new.sal > 3000) /*트리거 작동 조건*/
   DECLARE
           is_tbl varchar2(20) := null;
           v_sql1 varchar2(500);
           v_sql2 varchar2(1000);
           v_sql3 varchar2(1000);
    BEGIN
        BEGIN
           SELECT table_name 
             INTO is_tbl
             FROM tabs
            WHERE table_name = 'EMP_OLD';
        EXCEPTION
             WHEN no_data_found
             THEN
               create_emp_old(); /*EMP_OLD 테이블 생성 프로시저임(프로시저는 아래정의)*/
       END;

       /*초기에는 테이블이 없어서 문법오류 발생
       따라서 동적 쿼리로 생성한다.*/
       v_sql3 := 'insert into emp_old (EMPNO, ENAME, JOB, MGR, HIREDATE, 
                   SAL, COMM, DEPTNO)'
                   || 'VALUES'
                   || '(:1, :2, :3, :4, :5, :6, :7, :8)';
       EXECUTE IMMEDIATE v_sql3 
         USING :new.EMPNO, :new.ENAME, :new.JOB, :new.MGR, :new.HIREDATE, :new.SAL
                     , :new.COMM, :new.DEPTNO;
   END;

위 쿼리에서 사용하는 프로시저 create_emp_old();

   CREATE OR REPLACE PROCEDURE create_emp_old
   IS
       PRAGMA AUTONOMOUS_TRANSACTION;
       v_sql1 varchar2(500);
   begin
       v_sql1 := 'create table emp_old(
                   ||'EMPNO NUMBER(4,0),'
                   ||'ENAME VARCHAR2(10),'
                   ||'JOB VARCHAR2(9)')'; /*이후는 생략*/

       EXECUTE IMMEDIATE v_sql1;
   EXCEPTION
       WHEN OTHERS THEN
           DBMS_OUTPUT.PUT_LINE(sqlcode||':'||sqlerrm);
   end create_emp_old;