一、MERGE INTO語(yǔ)句
1、merge into語(yǔ)句的功能:我們操作數(shù)據(jù)庫(kù)的時(shí)候,有時(shí)候會(huì)遇到insert或者Update這種需求。我們操縱代碼時(shí)至少需要寫(xiě)一個(gè)插入語(yǔ)句和更新語(yǔ)句并且還得單獨(dú)寫(xiě)方法效驗(yàn)數(shù)據(jù)是否存在,這種操作完全可以用merge into語(yǔ)句代替,不僅省時(shí)省力而且條理更清晰,一個(gè)SQL語(yǔ)句直接完成插入,如果有相同主鍵進(jìn)行更新操作。
使用場(chǎng)景:判斷B表和A表是否滿(mǎn)足ON中條件,如果滿(mǎn)足則用B表去更新A表,如果不滿(mǎn)足,則將B表數(shù)據(jù)插入A表或者更多的操作。
2、具體SQL:下邊sql是我在工作中最常使用的,功能是對(duì)接口表(表B)中通過(guò)批次ID查到的合同進(jìn)行對(duì)正式表(表A)插入和更新。除此之外,還可以根據(jù)你的想實(shí)現(xiàn)功能進(jìn)行各種條件更新和插入。只update或者只insert,帶條件的update或帶條件的insert,全插入insert實(shí)現(xiàn),帶delete的update(覺(jué)得可以用3來(lái)實(shí)現(xiàn))
MERGE INTO后是更新的表,USING是對(duì)接口表進(jìn)行篩選,(如果有重復(fù)數(shù)據(jù),僅選取一行插入,用ORDER BY控制)。ON中是具體的條件(表中標(biāo)識(shí)字段,字段編碼)滿(mǎn)足執(zhí)行WHEN MATCHED THEN下的語(yǔ)句
不滿(mǎn)足則執(zhí)行WHEN NOT MATCHED THEN后語(yǔ)句:
MERGE INTO TableA A
USING(
(SELECT L.*,
ROW_NUMBER()OVER(PARTITION BY T.FLEX_VALUE ORDER BY 1)AS RN
FROM TABLEB L
WHERE T.BATCH_ID=#{batchId})L
AND L.RN=1)B
ON(A.FLEX_VALUE=B.FLEX_VALUE)
WHEN MATCHED THEN
UPDATE
A.FLEX_VALUE_SET_NAME=B.FLEX_VALUE_SET_NAME,
A.VALIDATION_TYPE=B.VALIDATION_TYPE,
WHEN NOT MATCHED THEN
INSERT(
A.FLEX_VALUE_SET_NAME=B.FLEX_VALUE_SET_NAME,
A.VALIDATION_TYPE=B.VALIDATION_TYPE)
二、Oracle的存儲(chǔ)過(guò)程
1、定義:存儲(chǔ)過(guò)程(Stored Procedure):就是一組用于完成特定數(shù)據(jù)庫(kù)功能的SQL語(yǔ)句集,該SQL語(yǔ)句集經(jīng)過(guò),編譯后存儲(chǔ)在數(shù)據(jù)庫(kù)系統(tǒng)中。在使用時(shí)候,用戶(hù)通過(guò)指定已經(jīng)定義的存儲(chǔ)過(guò)程名字并給出相應(yīng)的存儲(chǔ)過(guò)程參數(shù),來(lái)調(diào)用并執(zhí)行它,從而完成一個(gè)或一系列的數(shù)據(jù)庫(kù)操作。
2、創(chuàng)建:Oracle存儲(chǔ)過(guò)程包含三部分:過(guò)程聲明,執(zhí)行過(guò)程部分,存儲(chǔ)過(guò)程異常。
我在工作中常用的一個(gè)存儲(chǔ)過(guò)程結(jié)構(gòu)如下:
--存儲(chǔ)過(guò)程校驗(yàn)信息,三個(gè)入?yún)?,一個(gè)輸入批次。輸出分別是錯(cuò)誤編碼,和錯(cuò)誤信息。
PROCEDURE VALIDATE_ARCHIVE_ITF(P_BATCHID IN VARCHAR2,
P_FLAG OUT NUMBER,
P_MSG OUT VARCHAR2)IS
CURSOR CMS_ARCHIVE_ITF(BATCHID VARCHAR2)IS
SELECT ROWID,
CONTRACT_NO,
ARCHIVE_STUTAS,
ERROR_INFO,
ARC_TIME
FROM CMS_ARCHIVE_IFT CAI
WHERE CAI.BATCH_ID=BATCHID;
L_ERROR_MSG VARCHAR2(255);--定義變量錯(cuò)誤信息
L_TENANT_ID VARCHAR2(255);--定義變量租戶(hù)ID
L_CONTRACT_SERIAL_NO VARCHAR2(255);--定義變量
BEGIN
FOR RET IN CMS_ARCHIVE_ITF(P_BATCHID)LOOP
L_ERROR_MSG:=NULL;--給傳入三個(gè)參數(shù)賦默認(rèn)值
P_FLAG:=1;
P_MSG:=NULL;
--對(duì)輸入字段非空效驗(yàn)
IF(RET.ARC_TIME IS NULL OR RET.ARC_TIME='')THEN
L_ERROR_MSG:=L_ERROR_MSG||'LAST_UPDATE_DATE不能為空;';
END IF;
--判斷非空校驗(yàn)是否成功,不成功繼續(xù)繼續(xù)下一個(gè)。如果有錯(cuò)誤更新接口表
IF L_ERROR_MSG IS NOT NULL THEN
P_FLAG:=-99;
UPDATE CMS_ARCHIVE_IFT
SET ERROR_CODE='01',ERROR_MSG=L_ERROR_MSG
WHERE ROWID=RET.ROWID;
CONTINUE;
END IF;
--如果成功通過(guò)條件效驗(yàn)
IF P_FLAG=1 THEN
BEGIN
INSERT INTO CMS_ARCHIVE_INFO
(TENANT_ID,
CONTRACT_ID,
ARCHIVE_ID)
VALUES
(RET.TENANT_ID,
(SELECT CONTRACT_ID
FROM CMS_CONTRACT_INFO
WHERE CONTRACT_NO=RET.CONTRACT_NO),
SYS_GUID())
EXCEPTION--異常信息
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SUBSTR(SQLERRM,1,200));
P_FLAG:=-99;
P_MSG:=SUBSTR(SQLERRM,1,200);
END;
END IF;
END LOOP;
END;