日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle sql loop merge,Oracle之存储过程和MERGE INTO语句

發布時間:2025/3/11 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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语句的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。