-- 20203206222 唐权威 CREATEOR REPLACE TRIGGER BEFORE_DML AFTER INSERTORUPDATEORDELETEON SCOTT.EMP DECLARE CURSOR EMP_CUR IS SELECT EMPNO, SAL FROM SCOTT.EMP WHERE DEPTNO=10; EMP_SAL SCOTT.EMP.SAL%TYPE; EMP_EMPNO SCOTT.EMP.EMPNO%TYPE; DML_TYPE VARCHAR2(10); BEGIN IF INSERTING THEN DML_TYPE:='INSERT'; ELSIF UPDATING THEN DML_TYPE:='UPDATE'; ELSE DML_TYPE:='DELETE'; END IF; OPEN EMP_CUR; FETCH EMP_CUR INTO EMP_EMPNO, EMP_SAL; WHILE NOT EMP_CUR%NOTFOUND LOOP DBMS_OUTPUT.PUT_LINE('BEFORE ' ||DML_TYPE ||', THE SAL OF ' ||TO_CHAR(EMP_EMPNO) ||' IS' ||TO_CHAR(EMP_SAL)); FETCH EMP_CUR INTO EMP_EMPNO, EMP_SAL; END LOOP; CLOSE EMP_CUR; DBMS_OUTPUT.PUT_LINE('THEN BEGIN TO INSERT'); END BEFORE_DML; /
-- 20203206222 唐权威 DECLARE CURSOR SAL_CUR IS SELECT EMPNO, SAL FROM SCOTT.EMP WHERE DEPTNO=10; EMP_SAL SCOTT.EMP.SAL%TYPE; EMP_EMPNO SCOTT.EMP.EMPNO%TYPE; BEGIN INSERTINTO SCOTT.EMP VALUES( 8001, 'JACK', 'CLERK', 7788, SYSDATE, 8000, 1000, 10 ); OPEN SAL_CUR; FETCH SAL_CUR INTO EMP_EMPNO, EMP_SAL; WHILE SAL_CUR%FOUND LOOP DBMS_OUTPUT.PUT_LINE('AFTER INSERT, THE SAL OF ' ||TO_CHAR(EMP_EMPNO) ||' IS' ||TO_CHAR(EMP_SAL)); FETCH SAL_CUR INTO EMP_EMPNO, EMP_SAL; END LOOP; CLOSE SAL_CUR; END;
-- 20203206222 唐权威 CREATEOR REPLACE TRIGGER INSTEAD_DML INSTEAD OF INSERTORUPDATEORDELETEON SCOTT.EMP_DEPT FOREACHROW BEGIN IF INSERTING THEN DBMS_OUTPUT.PUT_LINE(TO_CHAR(:NEW.DEPTNO) ||TO_CHAR(:NEW.DEPTLOC)); INSERTINTO SCOTT.DEPT( DEPTNO, LOC ) VALUES( :NEW.DEPTNO, :NEW.DEPTLOC ); --Insert into SCOTT.emp(empno,deptno) values(:new.empno,:new.deptno); ELSIF UPDATING THEN UPDATE SCOTT.DEPT SET DEPTNO=:NEW.DEPTNO WHERE DEPTNO=:OLD.DEPTNO; UPDATE SCOTT.DEPT SET LOC=:NEW.DEPTLOC WHERE DEPTNO=:OLD.DEPTNO; UPDATE SCOTT.EMP SET EMPNO=:NEW.EMPNO WHERE EMPNO=:OLD.EMPNO AND DEPTNO=:OLD.DEPTNO; UPDATE SCOTT.EMP SET DEPTNO=:NEW.DEPTNO WHERE EMPNO=:OLD.EMPNO AND DEPTNO=:OLD.DEPTNO; ELSE DBMS_OUTPUT.PUT_LINE('DELETE IS IGNORED'); END IF; END INSTEAD_DML; /
\DELETE
1 2 3
select*from all_triggers where TRIGGER_NAME='INSTEAD_DML';
-- 20203206222 唐权威 CREATEOR REPLACE TRIGGER INSTEAD_DML INSTEAD OF INSERTORUPDATEORDELETEON SCOTT.EMP_DEPT REFERENCINGNEWAS NEW_EMP_DEPT FOREACHROW BEGIN IF INSERTING THEN DBMS_OUTPUT.PUT_LINE(TO_CHAR(:NEW_EMP_DEPT.DEPTNO) ||TO_CHAR(:NEW_EMP_DEPT.DEPTLOC)); INSERTINTO SCOTT.DEPT( DEPTNO, LOC ) VALUES( :NEW_EMP_DEPT.DEPTNO, :NEW_EMP_DEPT.DEPTLOC ); --Insert into SCOTT.emp(empno,deptno) values(:NEW_EMP_DEPT.empno,:NEW_EMP_DEPT.deptno); ELSIF UPDATING THEN UPDATE SCOTT.DEPT SET DEPTNO=:NEW_EMP_DEPT.DEPTNO WHERE DEPTNO=:OLD.DEPTNO; UPDATE SCOTT.DEPT SET LOC=:NEW_EMP_DEPT.DEPTLOC WHERE DEPTNO=:OLD.DEPTNO; UPDATE SCOTT.EMP SET EMPNO=:NEW_EMP_DEPT.EMPNO WHERE EMPNO=:OLD.EMPNO AND DEPTNO=:OLD.DEPTNO; UPDATE SCOTT.EMP SET DEPTNO=:NEW_EMP_DEPT.DEPTNO WHERE EMPNO=:OLD.EMPNO AND DEPTNO=:OLD.DEPTNO; ELSE DBMS_OUTPUT.PUT_LINE('DELETE IS IGNORED'); END IF; END INSTEAD_DML;
CREATEOR REPLACE TRIGGER WHEN_TEST BEFORE UPDATEON SCOTT.EMP FOREACHROWWHEN (OLD.DEPTNO=10) BEGIN DBMS_OUTPUT.PUT_LINE('THE UPDATE EXECUTED ONLY WHEN THE DEPTNO=10'); END WHEN_TEST;