有時候在與數據庫打交道時,要做很多業務邏輯判斷,比如說,要判斷某條數據在數據庫裏是否存在,存在了要更新,不存在纔可以執行添加操作,或者存在了,要更新某些字段等等,數據量小的時候我們可以一一判斷,但是一旦數據量大了,幾萬幾十萬甚至幾百萬,這......咳咳
最近就在做一個導入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;
用到觸發器的參考一下吧,這個例子比較簡單。