close
常常有時候, 要更新資料之前, 總是要先判斷 Table 裡到底有沒有這筆資料的存在
若每次都來個 Select count('A') INTO v_cnt From Table ;
再來判斷 v_cnt 是否有大於零, 再來決定怎麼做的話, 總覺得太浪費時間了
雖然 debug 時, 這樣的判斷就變得很方便了, 可是若是想節省一點點時間的時候,
或許你可以嘗試下列這個做法....
以下為 Robert 的自測實例
若 Table A 裡有資料,則 Update;沒有則 Insert

--
--Table A : 要 Update / Insert 的 Table
--Table B : 要用來比較並取得相關資料的 Table (或 subQuery )
-- ON : 表你自訂條件, 用以判斷 Matched 與否
--
MERGE INTO TB_RWH110 A
USING ( SELECT AR_WARHS_CREATE_NO, UNIQUE_LOT_NO , PROD_CD, DEL_FLAG,
         (NORMAL_QTY + NORMAL_CORR_QTY )  AS GOOD_QTY
     FROM TB_IEM100
     WHERE PROD_WC_CD = 'M'
     AND PROD_DATE LIKE TO_CHAR(SYSDATE,'YYYYMM') || '%' ) B

ON ( /* 在這個條件下 */
  A.KEY = B.AR_WARHS_CREATE_NO AND
  A.IO_DATE LIKE TO_CHAR(SYSDATE,'YYYYMM') || '%'
)

/* 若 MATCHED 則 Update */
WHEN MATCHED THEN UPDATE SET A.LOT_NO = B.UNIQUE_LOT_NO ,
            A.PROD_CD = B.PROD_CD ,
            A.GOOD_QTY = B.GOOD_QTY,
            A.DEL_FLAG = B.DEL_FLAG

/* 若 NOT MATCHED 則 Insert */
WHEN NOT MATCHED THEN
INSERT VALUES (P_SEQ_NO, TO_CHAR(SYSDATE,'yyyymmdd'), 'M', B.AR_WARHS_CREATE_NO, B.UNIQUE_LOT_NO,
         B.PROD_CD, B.GOOD_QTY, 0, 'I', 'N', SYSDATE, 'ROBERT','A' );

 


     以上語法部分參考這個網站

  Merge into 詳細介紹

  MERGE語句是Oracle9i新增的語法,用來合併UPDATE和INSERT語句。

  通過MERGE語句,根據一張表或子查詢的連接條件對另外一張表進行查詢,

  連接條件匹配上的進行UPDATE,無法匹配的執行INSERT。

  這個語法僅需要一次全表掃瞄就完成了全部工作,執行效率要高於INSERT+UPDATE。

 

  簡單語法說明:

  MERGE [INTO [schema .] table [t_alias]

  USING [schema .] { table | view | subquery } [t_alias]

  ON ( condition )

  WHEN MATCHED THEN merge_update_clause

  WHEN NOT MATCHED THEN merge_insert_clause;

 

  詳細語法說明:

  MERGE INTO [your table-name] [rename your table here]

  USING ( [write your query here] )[rename your query-sql and using just like a table]

  ON ([conditional expression here] AND [...]...)

  WHEN MATHED THEN [here you can execute some update sql or something else ]

  WHEN NOT MATHED THEN [execute something else here ! ]

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 羅伯特 的頭像
    羅伯特

    Thinking in Robert

    羅伯特 發表在 痞客邦 留言(1) 人氣()