2.5 Oracle之存儲過程和MERGE INTO語句

1、MERGE INTO語句

  一、merge into語句的功能:咱們操做數據庫的時候,有時候會遇到insert或者Update這種需求。咱們操縱代碼時至少須要寫一個插入語句和更新語句而且還得單獨寫方法效驗數據是否存在,這種操做徹底能夠用merge into語句代替,不只省時省力並且條理更清晰,一個SQL語句直接完成插入,若是有相同主鍵進行更新操做。sql

使用場景:判斷B表和A表是否知足ON中條件,若是知足則用B表去更新A表,若是不知足,則將B表數據插入A表或者更多的操做。數據庫

  二、具體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)

2、ORACLE的存儲過程

  一、定義:存儲過程(Stored Procedure):就是一組用於完成特定數據庫功能的SQL語句集,該SQL語句集通過,編譯後存儲在數據庫系統中。在使用時候,用戶經過指定已經定義的存儲過程名字並給出相應的存儲過程參數,來調用並執行它,從而完成一個或一系列的數據庫操做。spa

  二、建立: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;date

  --對輸入字段非空效驗  
  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;方法

相關文章
相關標籤/搜索