一、MERGE INTO語句 1、merge into語句的功能:我們操作資料庫的時候,有時候會遇到insert或者Update這種需求。我們操縱代碼時至少需要寫一個插入語句和更新語句並且還得單獨寫方法效驗數據是否存在,這種操作完全可以用merge into語句代替,不僅省時省力而且條理更清晰,一個 ...
一、MERGE INTO語句
1、merge into語句的功能:我們操作資料庫的時候,有時候會遇到insert或者Update這種需求。我們操縱代碼時至少需要寫一個插入語句和更新語句並且還得單獨寫方法效驗數據是否存在,這種操作完全可以用merge into語句代替,不僅省時省力而且條理更清晰,一個SQL語句直接完成插入,如果有相同主鍵進行更新操作。
使用場景:判斷B表和A表是否滿足ON中條件,如果滿足則用B表去更新A表,如果不滿足,則將B表數據插入A表或者更多的操作。
2、具體SQL:下邊sql是我在工作中最常使用的,功能是對介面表(表B)中通過批次ID查到的合同進行對正式表(表A)插入和更新。除此之外,還可以根據你的想實現功能進行各種條件更新和插入。只update或者只insert,帶條件的update或帶條件的insert,全插入insert實現,帶delete的update(覺得可以用3來實現)
MERGE INTO後是更新的表,USING是對介面表進行篩選,(如果有重覆數據,僅選取一行插入,用ORDER BY 控制)。ON中是具體的條件(表中標識欄位,欄位編碼)滿足執行 WHEN MATCHED THEN 下的語句
不滿足則執行WHEN NOT MATCHED THEN 後語句:
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的存儲過程
1、定義:存儲過程(Stored Procedure):就是一組用於完成特定資料庫功能的SQL語句集,該SQL語句集經過,編譯後存儲在資料庫系統中。在使用時候,用戶通過指定已經定義的存儲過程名字並給出相應的存儲過程參數,來調用並執行它,從而完成一個或一系列的資料庫操作。
2、創建:Oracle存儲過程包含三部分:過程聲明,執行過程部分,存儲過程異常。
我在工作中常用的一個存儲過程結構如下:
--存儲過程校驗信息,三個入參,一個輸入批次。輸出分別是錯誤編碼,和錯誤信息。
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); --定義變數錯誤信息
L_TENANT_ID VARCHAR2(255);--定義變數租戶ID
L_CONTRACT_SERIAL_NO VARCHAR2(255);--定義變數
BEGIN
FOR RET IN CMS_ARCHIVE_ITF(P_BATCHID) LOOP
L_ERROR_MSG := NULL;--給傳入三個參數賦預設值
P_FLAG := 1;
P_MSG := NULL;
--對輸入欄位非空效驗
IF (RET.ARC_TIME IS NULL OR RET.ARC_TIME = '') THEN
L_ERROR_MSG := L_ERROR_MSG || 'LAST_UPDATE_DATE不能為空;';
END IF;
--判斷非空校驗是否成功,不成功繼續繼續下一個。如果有錯誤更新介面表
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;
--如果成功通過條件效驗
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;