Oracle PL/SQL Tutorial/Trigger/Deleting

Материал из SQL эксперт
Перейти к: навигация, поиск

if ( updating or deleting ), if ( inserting or updating )

   <source lang="sql">

SQL> SQL> CREATE TABLE EMP(

 2      EMPNO NUMBER(4) NOT NULL,
 3      ENAME VARCHAR2(10),
 4      JOB VARCHAR2(9),
 5      MGR NUMBER(4),
 6      HIREDATE DATE,
 7      SAL NUMBER(7, 2),
 8      COMM NUMBER(7, 2),
 9      DEPTNO NUMBER(2)
10  );

SQL> SQL> INSERT INTO EMP VALUES(7369, "SMITH", "CLERK", 7902,TO_DATE("17-DEC-1980", "DD-MON-YYYY"), 800, NULL, 20); SQL> INSERT INTO EMP VALUES(7499, "ALLEN", "SALESMAN", 7698,TO_DATE("20-FEB-1981", "DD-MON-YYYY"), 1600, 300, 30); SQL> INSERT INTO EMP VALUES(7521, "WARD", "SALESMAN", 7698,TO_DATE("22-FEB-1981", "DD-MON-YYYY"), 1250, 500, 30); SQL> INSERT INTO EMP VALUES(7566, "JONES", "MANAGER", 7839,TO_DATE("2-APR-1981", "DD-MON-YYYY"), 2975, NULL, 20); SQL> INSERT INTO EMP VALUES(7654, "MARTIN", "SALESMAN", 7698,TO_DATE("28-SEP-1981", "DD-MON-YYYY"), 1250, 1400, 30); SQL> INSERT INTO EMP VALUES(7698, "BLAKE", "MANAGER", 7839,TO_DATE("1-MAY-1981", "DD-MON-YYYY"), 2850, NULL, 30); SQL> INSERT INTO EMP VALUES(7782, "CLARK", "MANAGER", 7839,TO_DATE("9-JUN-1981", "DD-MON-YYYY"), 2450, NULL, 10); SQL> INSERT INTO EMP VALUES(7788, "SCOTT", "ANALYST", 7566,TO_DATE("09-DEC-1982", "DD-MON-YYYY"), 3000, NULL, 20); SQL> INSERT INTO EMP VALUES(7839, "KING", "PRESIDENT", NULL,TO_DATE("17-NOV-1981", "DD-MON-YYYY"), 5000, NULL, 10); SQL> INSERT INTO EMP VALUES(7844, "TURNER", "SALESMAN", 7698,TO_DATE("8-SEP-1981", "DD-MON-YYYY"), 1500, 0, 30); SQL> INSERT INTO EMP VALUES(7876, "ADAMS", "CLERK", 7788,TO_DATE("12-JAN-1983", "DD-MON-YYYY"), 1100, NULL, 20); SQL> INSERT INTO EMP VALUES(7900, "JAMES", "CLERK", 7698,TO_DATE("3-DEC-1981", "DD-MON-YYYY"), 950, NULL, 30); SQL> INSERT INTO EMP VALUES(7902, "FORD", "ANALYST", 7566,TO_DATE("3-DEC-1981", "DD-MON-YYYY"), 3000, NULL, 20); SQL> INSERT INTO EMP VALUES(7934, "MILLER", "CLERK", 7782,TO_DATE("23-JAN-1982", "DD-MON-YYYY"), 1300, NULL, 10); SQL> SQL> CREATE TABLE DEPT(

 2      DEPTNO NUMBER(2),
 3      DNAME VARCHAR2(14),
 4      LOC VARCHAR2(13)
 5  );

SQL> SQL> INSERT INTO DEPT VALUES (10, "ACCOUNTING", "NEW YORK"); SQL> INSERT INTO DEPT VALUES (20, "RESEARCH", "DALLAS"); SQL> INSERT INTO DEPT VALUES (30, "SALES", "CHICAGO"); SQL> INSERT INTO DEPT VALUES (40, "OPERATIONS", "BOSTON"); SQL> SQL> SQL> alter table dept

 2  add emp_count number
 3  constraint must_be_between_3_8
 4  check(emp_count between 3 and 8 OR emp_count = 0)
 5  deferrable initially deferred;

SQL> SQL> update dept set emp_count = (select count(*) from emp where emp.deptno = dept.deptno )

 2  /

SQL> SQL> alter table dept

 2  modify emp_count NOT NULL;

SQL> SQL> create trigger emp_dept_cnt_trigger

 2  after insert or update or delete on emp
 3  for each row
 4  begin
 5      if ( updating and :old.deptno = :new.deptno )
 6      then
 7          return;
 8      end if;
 9      if ( inserting or updating )
10      then
11          update dept set emp_count = emp_count+1
12           where deptno = :new.deptno;
13      end if;
14      if ( updating or deleting )
15      then
16          update dept set emp_count = emp_count-1
17           where deptno = :old.deptno;
18      end if;
19  end;
20  /

SQL> SQL> drop table emp; SQL> drop table dept; SQL></source>


Is a Deleting action or an updating action

   <source lang="sql">

SQL> SQL> CREATE TABLE s_item

 2  (order_id          NUMBER(7),
 3   item_id           NUMBER(7),
 4   product_id        NUMBER(7),
 5   price             NUMBER(11, 2),
 6   quantity          NUMBER(9),
 7   quantity_shipped  NUMBER(9));

Table created. SQL> SQL> INSERT INTO s_item VALUES (100, 1, 10011, 135, 500, 500); 1 row created. SQL> INSERT INTO s_item VALUES (100, 2, 10013, 380, 400, 400); 1 row created. SQL> INSERT INTO s_item VALUES (100, 3, 10021, 14, 500, 500); 1 row created. SQL> INSERT INTO s_item VALUES (100, 5, 30326, 582, 600, 600); 1 row created. SQL> INSERT INTO s_item VALUES (100, 7, 41010, 8, 250, 250); 1 row created. SQL> INSERT INTO s_item VALUES (100, 6, 30433, 20, 450, 450); 1 row created. SQL> INSERT INTO s_item VALUES (100, 4, 10023, 36, 400, 400); 1 row created. SQL> INSERT INTO s_item VALUES (101, 1, 30421, 16, 15, 15); 1 row created. SQL> INSERT INTO s_item VALUES (101, 3, 41010, 8, 20, 20); 1 row created. SQL> INSERT INTO s_item VALUES (101, 5, 50169, 4.29, 40, 40); 1 row created. SQL> INSERT INTO s_item VALUES (101, 6, 50417, 80, 27, 27); 1 row created. SQL> INSERT INTO s_item VALUES (101, 7, 50530, 45, 50, 50); 1 row created. SQL> INSERT INTO s_item VALUES (101, 4, 41100, 45, 35, 35); 1 row created. SQL> SQL> SQL> CREATE TABLE s_item_log

 2   (order_id          NUMBER(7),
 3    item_id           NUMBER(7),
 4    product_id        NUMBER(7),
 5    price             NUMBER(11, 2),
 6    quantity          NUMBER(9),
 7    quantity_shipped  NUMBER(9),
 8    log_type          VARCHAR2(1),
 9    log_user          VARCHAR2(30),
10    log_date          DATE);

Table created. SQL> SQL> SQL> SQL> CREATE OR REPLACE TRIGGER bud_item

 2  BEFORE UPDATE OR DELETE
 3  ON s_item
 4  REFERENCING OLD AS OLD NEW AS NEW
 5  FOR EACH ROW
 6  BEGIN
 7     IF (UPDATING) THEN
 8        INSERT INTO s_item_log (ORDER_ID, ITEM_ID, PRODUCT_ID,
 9           PRICE, QUANTITY, QUANTITY_SHIPPED,
10           LOG_TYPE, LOG_USER, LOG_DATE )
11        VALUES ( :OLD.ORDER_ID, :OLD.ITEM_ID, :OLD.PRODUCT_ID,
12           :OLD.PRICE, :OLD.QUANTITY, :OLD.QUANTITY_SHIPPED,
13           "U", USER, SYSDATE );
14     ELSIF (DELETING) THEN
15        INSERT INTO s_item_log ( ORDER_ID, ITEM_ID, PRODUCT_ID,
16           PRICE, QUANTITY, QUANTITY_SHIPPED,
17           LOG_TYPE, LOG_USER, LOG_DATE )
18        VALUES ( :OLD.ORDER_ID, :OLD.ITEM_ID, :OLD.PRODUCT_ID,
19           :OLD.PRICE, :OLD.QUANTITY, :OLD.QUANTITY_SHIPPED,
20           "D", USER, SYSDATE );
21     END IF;
22  END;
23  /

Trigger created. SQL> SQL> SQL> drop table s_item; Table dropped. SQL> SQL> drop table s_item_log; Table dropped.</source>