트리거를 이용한 문제
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;
'프로젝트 > 데이터베이스' 카테고리의 다른 글
From DUAL 이란? (0) | 2022.12.06 |
---|---|
[MS-SQL] "where 1 = 1 "을 왜 쓰는 걸까? (0) | 2022.12.06 |
[ORACLE] 트리거 사용 예시 (0) | 2022.09.28 |
[ORACLE] 프로시저 기본 사용 예시 (2) | 2022.09.27 |
[ORACLE] 오라클 데이터 복구 방법(TIMESTAMP) (2) | 2022.09.27 |