1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | /* Procedure : insert, delete, update IN, OUT Function : select RETURN Trigger : 촉발시키다, 스스로 발생하다. callback : 자동호출 자동 호출 함수 old(이전값), new(새값) insert X O delete O X update O O */ SET SERVEROUTPUT ON CREATE OR REPLACE TRIGGER trigger_test --어떤 구문을 발생시키기전에 발생시켜라 BEFORE UPDATE ON departments --FOR문이 반복하며 ROW를 검사 FOR EACH ROW BEGIN --OLD, NEW를 사용할때는 :를 붙여줘야한다. DBMS_OUTPUT.PUT_LINE('변경전 컬럼의 값: ' || :OLD.department_name); DBMS_OUTPUT.PUT_LINE('변경후 컬럼의 값: ' || :NEW.department_name); END; / UPDATE departments SET department_name = '정보기술부' WHERE department_id = 60; ROLLBACK; -- ROW를 추가하는데 항상 평균 급여를 확인 CREATE OR REPLACE TRIGGER sum_trigger BEFORE INSERT OR UPDATE ON employees FOR EACH ROW DECLARE avg_sal NUMBER; BEGIN SELECT ROUND(AVG(salary), 3) INTO avg_sal FROM employees; -- NEW, OLD 키워드가 아니라 :를 넣지 않아도 된다. DBMS_OUTPUT.PUT_LINE('급여 평균: '|| avg_sal); END; SELECT ROUND(AVG(salary), 3) FROM employees; INSERT INTO employees(employee_id, last_name, hire_date, department_id, job_id, salary, email) VALUES(501, 'Tiger', sysdate, 60, 'IT_PROG', 10000, 'Tiger@naver.com'); -- 사원번호를 수정하지 못하게 할 경우 CREATE OR REPLACE TRIGGER emp_trigger BEFORE UPDATE OR DELETE OR INSERT ON EMPLOYEES FOR EACH ROW BEGIN --업데이트가 됬을때 IF UPDATING THEN --사장의 번호를 못바꾸게 만든다 IF :OLD.employee_id = '100' THEN RAISE_APPLICATION_ERROR(-20001, '이 번호를 수정할 수 없습니다.'); END IF; END IF; END; / --오류 발생 UPDATE employees SET salary = 2500 WHERE employee_id = 100; --INSERT 막기 CREATE OR REPLACE TRIGGER nodata_trigger AFTER INSERT ON employees BEGIN RAISE_APPLICATION_ERROR(-20001, '데이터의 입력을 시도하였습니다'); ROLLBACK; END; / INSERT INTO employees(employee_id, last_name, hire_date, department_id, job_id, salary, email) VALUES(502, 'Tiger', sysdate, 60, 'IT_PROG', 10000, 'Tiger11@naver.com'); | cs |
'Oracle > PL' 카테고리의 다른 글
PL 응용문제 (프로시져, 함수) (0) | 2019.12.21 |
---|---|
PL function(함수) (0) | 2019.12.20 |
PL Procedure 프로시져, Cursor 커서 (0) | 2019.12.20 |
PL 기초 활용 (0) | 2019.12.19 |