oracle sql loop merge,Oracle之存储过程和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;
總結
以上是生活随笔為你收集整理的oracle sql loop merge,Oracle之存储过程和MERGE INTO语句的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 白盒测试中的六种覆盖方法及案例分析
- 下一篇: 从零搭建nginx服务器