先说下需求,有一套表 触发器监听 这一套表的增删改,并记录操作到监听记录表中City_cfjlb
触发器:
create or replace trigger Tri_city_scsbxxb_Change -- after delete or update or insert on city_scsbxxb -- for each row declare -- kid number; cfsj date; tableName VARCHAR2(50); sjId VARCHAR2(50); czlx VARCHAR2(50); begin tableName := 'city_scsbxxb'; -- sjId := 'city_scspxxid=' || :OLD.city_scspxxid; -- --select S_CITY_CFJLB.Nextval into kid from dual; select sysdate into cfsj from dual; CASE WHEN UPDATING THEN czlx := 'E'; WHEN INSERTING THEN sjId := 'city_scspxxid=' || :NEW.city_scspxxid; -- czlx := 'A'; WHEN DELETING THEN czlx := 'D'; END CASE; Copy_City_BZTOMY(tableName, czlx, cfsj, sjId); end Tri_city_scsbxxb_Change;
存储过程:
create or replace procedure Pro_Copy_City(Cfbmc in City_Cfjlb.Cfbmc%type, Cflx in City_Cfjlb.Cflx%type, Cfsj in City_Cfjlb.Cfsj%type, Cfsjid in City_Cfjlb.Cfsjid%type) as K_ID number := 0; v_sql varchar2(1000); v_sql2 varchar2(1000); begin if Cflx = 'E' then v_sql := 'select nvl(max(CITY_CFJLB.KID), 0) KID from CITY_CFJLB where CFBMC = ''' || Cfbmc || ''' and cflx = ''' || Cflx || ''' AND CFSJID = ''' || Cfsjid || ''' AND sfcl=0 and rownum = 1'; dbms_output.put_line(v_sql); EXECUTE IMMEDIATE v_sql INTO K_ID; end if; if Cflx = 'D' then v_sql2:=' DELETE FROM CITY_CFJLB city WHERE city.cfsjid ='''||Cfsjid||''' and city.cfbmc='''||Cfbmc||'''' ; dbms_output.put_line(v_sql2); EXECUTE IMMEDIATE v_sql2; end if; if K_ID > 0 then UPDATE CITY_CFJLB SET KID = s_CITY_CFJLB.Nextval, CITY_CFJLB.CFSJ = Cfsj where KID = K_ID; else INSERT INTO CITY_CFJLB city (city.KID, city.CFBMC, city.CFLX, city.CFSJ, city.CFSJID, SFCL) VALUES (s_CITY_CFJLB.Nextval, Cfbmc, Cflx, cfsj, Cfsjid, '0'); end if; end Copy_City_BZTOMY; --0表示未处理
存储过程包含异常处理
create or replace procedure pro_M_ProPriceHistory as spid NUMBER; hiscount number; v_sql1 varchar2(1000); v_sql2 varchar2(1000); v_sql3 varchar2(1000); new_MALLPRICE NUMBER(10,2) default 0; --最新官网价格 old_MALLPRICE NUMBER(10,2) default 0; --历史最新官网价 old_price NUMBER(10,2); --历史最新报价 begin FOR my_cur IN (select min(price) minprice,PRODUCTID from m_productquote where ISEFFECT=1 and QUOTESTATUS =1 group by PRODUCTID) LOOP spid:=my_cur.productid; --dbms_output.put_line(my_cur.productid); --my_cur.productid --查询出该商品最新的官网价。 v_sql1:='select MALLPRICE from m_productinfo where PRODUCTID= ''' || my_cur.productid || ''''; --查询出最新历史官网价、与售价 v_sql2:='select MALLPRICE,PRICE from M_ProPriceHistory where PRICEHISTORYID =(select max(PRICEHISTORYID) from M_ProPriceHistory where PRODUCTID= ''' || my_cur.productid || ''' group by PRODUCTID)'; v_sql3:='select count(1) hiscount from M_ProPriceHistory where PRODUCTID= ''' || my_cur.productid || ''''; begin EXECUTE IMMEDIATE v_sql1 INTO new_MALLPRICE; EXECUTE IMMEDIATE v_sql3 into hiscount; --保证有数据 if hiscount>0 then EXECUTE IMMEDIATE v_sql2 INTO old_MALLPRICE,old_price; end if; EXCEPTION WHEN NO_DATA_FOUND then dbms_output.put_line(spid); end; if new_MALLPRICE <>old_MALLPRICE or my_cur.minprice<> old_price then --dbms_output.put_line(22); insert into M_ProPriceHistory his(his.pricehistoryid,his.productid,his.price,his.mallprice,his.syntime)values(s_M_ProPriceHistory.Nextval,my_cur.productid,my_cur.minprice,new_MALLPRICE,sysdate); end if; END LOOP; COMMIT; EXCEPTION WHEN OTHERS THEN dbms_output.put_line(spid); rollback; end pro_M_ProPriceHistory;