自己写的第一个triger

简化前: 
sql 代码
  1. Create Or Replace Trigger tr_cust_order   
  2. AFTER  UPDATE  
  3. ON te_cust_order   
  4. FOR EACH ROW   
  5. WHEN (NEW.status=6)   
  6. DECLARE    
  7.    exhok NUMBER;   
  8.    exhid NUMBER;   
  9.    regok NUMBER;   
  10.    seqexh NUMBER;   
  11.    sql_stat varchar2(200);   
  12. BEGIN  
  13.      
  14. --判断是否为展览订单             
  15. DECLARE    
  16.     CURSOR emp_cursor IS  
  17.         SELECT service_item_id FROM te_cust_order    
  18.     WHERE service_item_id IN  
  19.     (SELECT t.id FROM te_cust_service_item t WHERE t.service_type_id IN (2,3,4) );   
  20.     emp_record emp_cursor%ROWTYPE;   
  21. BEGIN  
  22.     OPEN emp_cursor;   
  23.     LOOP   
  24.         FETCH emp_cursor INTO emp_record;   
  25.         exit when emp_cursor%NOTFOUND;   
  26.     if emp_record.service_item_id = :old.SERVICE_ITEM_ID then  
  27.            exhok := 1;     
  28.     end if;     
  29.     END LOOP;   
  30.     CLOSE emp_cursor;   
  31. END;   
  32.   
  33. if exhok != 1 then     
  34. return;   
  35. end if;   
  36.   
  37. --取得展览ID   
  38. exhid := 0;   
  39. DECLARE    
  40.     CURSOR exh_cursor IS  
  41.         SELECT exh_id FROM te_exh_order    
  42.     WHERE order_no = :new.order_no;   
  43.     exh_record exh_cursor%ROWTYPE;   
  44. BEGIN  
  45.     OPEN exh_cursor;   
  46.     LOOP   
  47.         FETCH exh_cursor INTO exh_record;   
  48.         exit when exh_cursor%NOTFOUND;   
  49.     exhid := exh_record.exh_id ;   
  50.     END LOOP;   
  51.     CLOSE exh_cursor;   
  52. END;   
  53.   
  54. if exhid < 1 then     
  55. return;   
  56. end if;   
  57.   
  58. --判断是否已经报名了   
  59. regok := 0;   
  60. SELECT count(*) INTO regok FROM teexhibitiontomember    
  61.  WHERE EXHIBITIONID =  exhid and CUSTOMERNO = :new.CUSTOMER_NO;   
  62. if regok >0 then     
  63. return;   
  64. end if;   
  65.   
  66. --增加报名记录   
  67. select teexhibitionmemberseq.nextval into seqexh    
  68. from teexhibitiontomember t where rownum = 1;   
  69.   
  70. sql_stat := 'insert into teexhibitiontomember(ID,MEMBERID,EXHIBITIONID,CUSTOMERNO) values ('   
  71.           || seqexh || ',0,' ||exhid||','''|| :new.CUSTOMER_NO||''')';   
  72.              
  73. execute immediate sql_stat;   
  74.   
  75.   
  76. END tr_cust_order;   
 
简化后:
sql 代码
  1. /*==============================================================*/   
  2. /* Trigger: tr_cust_order                               */   
  3. /*==============================================================*/   
  4.   
  5. Create Or Replace Trigger tr_cust_order   
  6.   AFTER UPDATE ON te_cust_order   
  7.   FOR EACH ROW   
  8.   WHEN (NEW.status = 6)   
  9. DECLARE  
  10.   exhid    NUMBER;   
  11.   regok    NUMBER;   
  12.   seqexh   NUMBER;   
  13.   sql_stat varchar2(200);   
  14. BEGIN  
  15.   
  16.   --取得展览ID   
  17.   SELECT exh_id   
  18.     into exhid   
  19.     FROM te_exh_order   
  20.    WHERE order_no = :new.order_no;   
  21.   
  22.   if exhid < 1 then  
  23.     return;   
  24.   end if;   
  25.   
  26.   --判断是否已经报名了   
  27.   regok := 0;   
  28.   SELECT count(*)   
  29.     INTO regok   
  30.     FROM teexhibitiontomember   
  31.    WHERE EXHIBITIONID = exhid   
  32.      and CUSTOMERNO = :new.CUSTOMER_NO;   
  33.   if regok > 0 then  
  34.     return;   
  35.   end if;   
  36.   
  37.   --增加报名记录   
  38.   select teexhibitionmemberseq.nextval into seqexh from dual;   
  39.   
  40.   sql_stat := 'insert into teexhibitiontomember(ID,MEMBERID,EXHIBITIONID,CUSTOMERNO) values (' ||   
  41.               seqexh || ',0,' || exhid || ',''' || :new.CUSTOMER_NO ||   
  42.               ''')';   
  43.   
  44.   execute immediate sql_stat;   
  45.   
  46. END tr_cust_order;   

你可能感兴趣的:(sql)