ORACLE觸發器

有時候在與數據庫打交道時,要做很多業務邏輯判斷,比如說,要判斷某條數據在數據庫裏是否存在,存在了要更新,不存在纔可以執行添加操作,或者存在了,要更新某些字段等等,數據量小的時候我們可以一一判斷,但是一旦數據量大了,幾萬幾十萬甚至幾百萬,這......咳咳

最近就在做一個導入EXCEL的功能,需求和上面說的差不多,雖然用的是批處理,但從EXCEL中沒讀取一條數據還要到數據庫裏查詢一遍,有沒有纔可以添加到批處理的集合裏,才幾千條數據,竟然要5、6分鐘,<!--StartFragment --> ,想想,也學學觸發器,寫一個吧,每次添加的時候,讓數據庫自己做判斷,存在了,就替換掉原來的,否則就直接添加,代碼貼出來:

<!--StartFragment --> 

CREATE OR REPLACE TRIGGER INBOUND_TIME_BAND_TRIGGER BEFORE INSERT
 ON LANIC_INBOUND_TIME_BAND FOR EACH ROW
 DECLARE
  INTEGRITY_ERROR  EXCEPTION;
  COUNTSIZE           NUMBER(10);
  MONDAY                VARCHAR2(20);
  TUESDAY               VARCHAR2(20);
  WEDNESDAY         VARCHAR2(20);
  THURSDAY             VARCHAR2(20);
  FRIDAY                  VARCHAR2(20);
  SATURDAY             VARCHAR2(20);
  SUNDAY                VARCHAR2(20);
  ERRNO                  NUMBER(10);
  ERRMSG                VARCHAR2(200);
BEGIN
IF INSERTING THEN
  SELECT count(*) INTO COUNTSIZE
  FROM LANIC_INBOUND_TIME_BAND  M
  WHERE :NEW.DESTINATION=M.DESTINATION AND :NEW.TIMEBAND =M.TIMEBAND;
    IF (COUNTSIZE > 0) THEN
        SELECT
    M.MONDAY,
    M.TUESDAY,
    M.WEDNESDAY,
    M.THURSDAY,
    M.FRIDAY,
    M.SATURDAY,
    M.SUNDAY
     INTO MONDAY,THURSDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY
    FROM LANIC_INBOUND_TIME_BAND  M
        WHERE :NEW.DESTINATION=M.DESTINATION AND :NEW.TIMEBAND =M.TIMEBAND;
    
    UPDATE LANIC_INBOUND_TIME_BAND M
    SET
    M.MONDAY=MONDAY,
    M.TUESDAY=TUESDAY,
    M.WEDNESDAY=WEDNESDAY,
    M.THURSDAY=THURSDAY,
    M.FRIDAY=FRIDAY,
    M.SATURDAY=SATURDAY,
    M.SUNDAY=SUNDAY
    WHERE :NEW.DESTINATION=M.DESTINATION AND :NEW.TIMEBAND =M.TIMEBAND; 
    END IF;
END IF;
EXCEPTION
    WHEN INTEGRITY_ERROR THEN
        RAISE_APPLICATION_ERROR(ERRNO, ERRMSG);
END;

 

用到觸發器的參考一下吧,這個例子比較簡單。

發佈了18 篇原創文章 · 獲贊 70 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章