先说下需求,有一套表 触发器监听 这一套表的增删改,并记录操作到监听记录表中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;
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-03-10
  • 2022-12-23
  • 2021-11-04
  • 2022-12-23
猜你喜欢
  • 2018-06-18
  • 2022-02-03
  • 2021-07-19
  • 2021-09-27
  • 2021-11-10
  • 2022-12-23
相关资源
相似解决方案