µ±Ç°Î»ÖãºÊ×Ò³ > Oracle - °Ñ´¥·¢Æ÷¿´Í¸
AFTER DELETE ON emp
REFERENCING OLD AS old_emp FOR EACH ROW DECLARE I NUMBER; BEGIN
DBMS_OUTPUT.PUT_LINE(''ÕýÔÚÖ´ÐÐtrig2_delete ´¥·¢Æ÷¡''); SELECT emp_count INTO I
FROM dept_summary WHERE deptno = :old_emp.deptno; IF I >1 THEN
UPDATE dept_summary
SET sal_sum=sal_sum - :old_emp.sal, Emp_count=emp_count - 1
WHERE deptno = :old_emp.deptno; ELSE
DELETE FROM dept_summary WHERE deptno = :old_emp.deptno; END IF; END;' );
INSERT INTO dept(deptno, dname, loc) VALUES(90, 'demo_dept', 'none_loc'); INSERT INTO emp(ename, deptno, empno, sal) VALUES(USER, 90, 9999, 3000);
INSERT INTO emp(ename, deptno, empno, sal) VALUES(USER, 90, 9998, 2000); DBMS_OUTPUT.PUT_LINE('²åÈëºó'); Disp_dept_summary();
UPDATE emp SET sal = sal*1.1 WHERE deptno=90; DBMS_OUTPUT.PUT_LINE('Ð޸ĺó'); Disp_dept_summary();
DELETE FROM emp WHERE deptno=90; DELETE FROM dept WHERE deptno=90; DBMS_OUTPUT.PUT_LINE('ɾ³ýºó'); Disp_dept_summary();
DBMS_UTILITY.EXEC_DDL_STATEMENT('DROP TRIGGER trig2_update'); DBMS_UTILITY.EXEC_DDL_STATEMENT('DROP TRIGGER trig2_insert'); DBMS_UTILITY.EXEC_DDL_STATEMENT('DROP TRIGGER trig2_delete'); EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM); END;
Àý3£ºÀûÓÃORACLEÌṩµÄÌõ¼þν´ÊINSERTING¡¢UPDATINGºÍDELETING´´½¨ÓëÀý2¾ßÓÐÏàͬ¹¦ÄܵĴ¥·¢Æ÷¡£
BEGIN
DBMS_OUTPUT.PUT_LINE('²åÈëǰ'); Disp_dept_summary();
DBMS_UTILITY.EXEC_DDL_STATEMENT( 'CREATE OR REPLACE TRIGGER trig2
AFTER INSERT OR DELETE OR UPDATE OF sal ON emp
REFERENCING OLD AS old_emp NEW AS new_emp FOR EACH ROW DECLARE I NUMBER; BEGIN
IF UPDATING AND :old_emp.sal != :new_emp.sal THEN DBMS_OUTPUT.PUT_LINE(''ÕýÔÚÖ´ÐÐtrig2 ´¥·¢Æ÷¡'');
DBMS_OUTPUT.PUT_LINE(''sal ¾ÉÖµ£º''|| :old_emp.sal); DBMS_OUTPUT.PUT_LINE(''sal ÐÂÖµ£º''|| :new_emp.sal); UPDATE dept_summary
SET sal_sum=sal_sum + :new_emp.sal - :old_emp.sal WHERE deptno = :new_emp.deptno; ELSIF INSERTING THEN
DBMS_OUTPUT.PUT_LINE(''ÕýÔÚÖ´ÐÐtrig2´¥·¢Æ÷¡''); SELECT COUNT(*) INTO I FROM dept_summary
WHERE deptno = :new_emp.deptno; IF I > 0 THEN
UPDATE dept_summary SET sal_sum=sal_sum+:new_emp.sal, Emp_count=emp_count+1 WHERE deptno = :new_emp.deptno; ELSE
INSERT INTO dept_summary
VALUES (:new_emp.deptno, :new_emp.sal, 1); END IF; ELSE
DBMS_OUTPUT.PUT_LINE(''ÕýÔÚÖ´ÐÐtrig2´¥·¢Æ÷¡''); SELECT emp_count INTO I
FROM dept_summary WHERE deptno = :old_emp.deptno;
IF I > 1 THEN
UPDATE dept_summary
SET sal_sum=sal_sum - :old_emp.sal, Emp_count=emp_count - 1
WHERE deptno = :old_emp.deptno; ELSE
DELETE FROM dept_summary WHERE deptno = :old_emp.deptno; END IF; END IF; END;' );
INSERT INTO dept(deptno, dname, loc) VALUES(90, 'demo_dept', 'none_loc'); INSERT INTO emp(ename, deptno, empno, sal) VALUES(USER, 90, 9999, 3000);
INSERT INTO emp(ename, deptno, empno, sal) VALUES(USER, 90, 9998, 2000); DBMS_OUTPUT.PUT_LINE('²åÈëºó'); Disp_dept_summary();
UPDATE emp SET sal = sal*1.1 WHERE deptno=90; DBMS_OUTPUT.PUT_LINE('Ð޸ĺó'); Disp_dept_summary();
DELETE FROM emp WHERE deptno=90; DELETE FROM dept WHERE deptno=90; DBMS_OUTPUT.PUT_LINE('ɾ³ýºó'); Disp_dept_summary();
DBMS_UTILITY.EXEC_DDL_STATEMENT('DROP TRIGGER trig2'); EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM); END;
Àý4£º´´½¨INSTEAD OF ´¥·¢Æ÷¡£Ê×ÏÈ´´½¨Ò»¸öÊÓͼmyview, ÓÉÓÚ¸ÃÊÓͼÊǸ´ºÏ²éѯËù²úÉúµÄÊÓͼ£¬ËùÒÔ²»ÄÜÖ´ÐÐDMLÓï¾ä¡£¸ù¾ÝÓû§¶ÔÊÓͼËù²åÈëµÄÊý¾ÝÅжÏÐèÒª½«Êý¾Ý²åÈëµ½ÄĸöÊÓͼ»ù±íÖУ¬È»ºó¶Ô¸Ã»ù±íÖ´ÐвåÈë²Ù×÷¡£
DECLARE
No NUMBER;
Name VARCHAR2(20); BEGIN
DBMS_UTILITY.EXEC_DDL_STATEMENT(' CREATE OR REPLACE VIEW myview AS
SELECT empno, ename, ''E'' type FROM emp UNION
SELECT dept.deptno, dname, ''D'' FROM dept ');
-- ´´½¨INSTEAD OF ´¥·¢Æ÷trigger3; DBMS_UTILITY.EXEC_DDL_STATEMENT(' CREATE OR REPLACE TRIGGER trig3 INSTEAD OF INSERT ON myview REFERENCING NEW n FOR EACH ROW DECLARE
Rows INTEGER; BEGIN
DBMS_OUTPUT.PUT_LINE(''ÕýÔÚÖ´ÐÐtrig3´¥·¢Æ÷¡''); IF :n.type = ''D'' THEN SELECT COUNT(*) INTO rows
FROM dept WHERE deptno = :n.empno; IF rows = 0 THEN
DBMS_OUTPUT.PUT_LINE(''Ïòdept±íÖвåÈëÊý¾Ý¡''); INSERT INTO dept(deptno, dname, loc) VALUES (:n.empno, :n.ename, ''none¡¯¡¯); ELSE
DBMS_OUTPUT.PUT_LINE(''±àºÅΪ''|| :n.empno|| ''µÄ²¿ÃÅÒÑ´æÔÚ£¬²åÈë²Ù×÷ʧ°Ü£¡''); END IF; ELSE
SELECT COUNT(*) INTO rows
FROM emp WHERE empno = :n.empno; IF rows = 0 THEN
DBMS_OUTPUT.PUT_LINE('¡¯Ïòemp±íÖвåÈëÊý¾Ý¡¡¯¡¯); INSERT INTO emp(empno, ename) VALUES(:n.empno, :n.ename); ELSE
DBMS_OUTPUT.PUT_LINE(''±àºÅΪ''|| :n.empno|| ''µÄÈËÔ±ÒÑ´æÔÚ£¬²åÈë²Ù×÷ʧ°Ü!''); END IF; END IF; END; ');
¹²·ÖÏí92ƪÏà¹ØÎĵµ