oracle中序列、触发器、刷数据

/ 数据库 / 2 条评论 / 1441浏览

序列

create sequence SEQ_CREATE_ID   --序列名称
minvalue 1                      --最小值
maxvalue 999999999999999        --最大值
start with 1                    --起始值
increment by 1                  --增量
cache 20;                       --高速缓存大小
--触发器中直接使用
 insert into tab_modify(id,bill_code,modifier,TYPE)
 values(SEQ_CREATE_ID.nextval,:new.order_bill,v_modifier,'insert');
 
--先查询出来再使用
SELECT SEQ_CREATE_ID.nextval AS ID from dual

触发器

  SELECT modifier
    INTO v_modifier
  FROM DUAL
CREATE OR REPLACE TRIGGER TRG_CREATE_ORDER_XCX
  AFTER INSERT OR DELETE OR UPDATE OF ORDER_BILL, BILL_CODE ON TAB_ORDER
  FOR EACH ROW

DECLARE
  /**
  *   如果是微信/小程序下单,将单号记录到微信订单专用表 tab_order_wechat
  *   since 20210511 by wj
  *   create 2021-05-11 16:57:09
  */
BEGIN
  IF INSERTING THEN
    IF NVL(:NEW.OPEN_ID, '*') <> '*' AND NVL(:NEW.DATA_FROM, '*') = '微信' THEN
      INSERT INTO TAB_ORDER_WECHAT
        (ORDER_BILL, OPEN_ID, CREATE_DATE, BILL_CODE)
      VALUES
        (:NEW.ORDER_BILL, :NEW.OPEN_ID, :NEW.CREATE_DATE, :NEW.BILL_CODE);
    END IF;
  END IF;
  IF UPDATING THEN
    IF NVL(:NEW.OPEN_ID, '*') <> '*' AND NVL(:NEW.DATA_FROM, '*') = '微信' THEN
      UPDATE TAB_ORDER_WECHAT
         SET BILL_CODE = :NEW.BILL_CODE, 
				     OPEN_ID = :NEW.OPEN_ID
       WHERE ORDER_BILL = :NEW.ORDER_BILL;
    END IF;
  END IF;
  IF DELETEING THEN
    IF NVL(:NEW.OPEN_ID, '*') <> '*' AND NVL(:NEW.DATA_FROM, '*') = '微信' THEN
    --此处去删除订单主表中的数据
    ...
    END IF;
  END IF;
END TRG_CREATE_ORDER_XCX;
SELECT /*+index(T,TAB_ORDER_P)*/
 T.*
  FROM TAB_ORDER T
 WHERE T.ORDER_BILL IN (SELECT /*+index(w,TAB_ORDER_WECHAT_I)*/
                         W.ORDER_BILL
                          FROM TAB_ORDER_WECHAT W
                         WHERE W.CREATE_DATE > SYSDATE - 180
                           AND W.OPEN_ID = ?)
 ORDER BY CREATE_DATE DESC
create or replace trigger trg_modify_order
after insert or delete or update of  order_bill(此处可以针对指定字段变更触发,以逗号隔开) for each row
declare
   /**
   *   自动产生修改记录触发器脚本 version 1.0.0
   *   since 20210829 by wj
   *   create 2021-08-29 11:08:09
   */
   v_modifier               varchar2(30); --修改人
   v_modifier_code          varchar2(20); --修改人编码
begin
    --修改人变量赋值(假设dual表里有单条数据)
    SELECT modifier
     INTO v_modifier
    FROM DUAL
      
   if inserting then
     --插入到指定日志表(类型为insert,插入状态下只有新值没有旧值)
     insert into tab_modify(id,bill_code,modifier,TYPE)
     values(seq_modify.nextval,:new.order_bill,v_modifier,'insert');
   end if;

   if updating then
     --插入到指定日志表(类型为update,此处是判断bill_code字段值变更了)
     if nvl(:old.bill_code,'!@#')<>nvl(:new.bill_code,'!@#') then
       insert into tab_modify(id,旧值,新值,TYPE)
       values(seq_modify.nextval,:old.bill_code,:new.bill_code,'update');
     end if;
   end if;

   if deleting then
     --插入到指定日志表(类型为delete,删除状态下只有旧值没有新值)
     insert into tab_modify(id,旧值,新值,TYPE)
     values(seq_modify.nextval,:old.bill_code,'','update');
   end if;
end trg_modify_order;

刷表数据

DECLARE
  V_COUNT      NUMBER;
BEGIN
  FOR PERDATA IN (SELECT * FROM TAB_WX_ADDRESS X WHERE X.BL_TYPE IS NULL) LOOP
    SELECT COUNT(1)
      INTO V_COUNT
      FROM TAB_ORDER T
     WHERE NVL(T.DATA_FROM, '*') = '微信'
       AND T.ACCEPT_MAN_MOBILE = PERDATA.REMARK;
    IF V_COUNT > 0 THEN
      -- dbms_output.put_line('guid='|| perData.guid||',  phone='||perData.user_phone||', 匹配='||v_count);
      UPDATE TAB_WX_ADDRESS T
         SET T.BL_TYPE = 1
       WHERE T.GUID = PERDATA.GUID;
      COMMIT;
    END IF;
  END LOOP;
END;