Oracle之存儲(chǔ)過(guò)程和MERGE INTO語(yǔ)句

Smileing
存儲(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ù)操作。

一、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;

THEEND

最新評(píng)論(評(píng)論僅代表用戶(hù)觀(guān)點(diǎn))

更多
暫無(wú)評(píng)論