簡體   English   中英

如果存在,則使用合並 oracle sql 邏輯插入或更新

[英]insert or update using if exists using merge oracle sql logic

我正在從事務系統后端 oracle db 獲取數據,這是我的源和目標也是一對一的同一張表

我需要編寫一個合並語句來檢查基於新值的插入或更新

源交易表

create table product 
(
product_id pk VARCHAR2(3 BYTE),
product_nm VARCHAR2(100 CHAR),
product_cd VARCHAR2(10 CHAR),
product_dec VARCHAR2(500 CHAR),
insert_ts date,
update_ts date,
version NUMBER(38,0),
product_interval_strt NUMBER(38,0),- these are some numeric values
product_interval_end NUMBER(38,0) - these are some numeric values
)

由於 etl (PDI) 拋出錯誤

無法從數據庫結果集中獲取值“Integer(38)”,索引 11 數值溢出

所以我使用了以下內容,以便 PDI 將其讀取為 Bignumber 37

CAST (product_interval_strt AS number(37,0)) INTERVAL_START, CAST (product_interval_strt AS number(37,0)) product_interval_end

目標事務表

create table product_stg 
(
product_id pk VARCHAR2(3 BYTE),
product_nm VARCHAR2(100 CHAR),
product_cd VARCHAR2(10 CHAR),
product_dec VARCHAR2(500 CHAR),
insert_ts date,
update_ts date,
version NUMBER(38,0),
product_interval_strt NUMBER(38,0),- these are some numeric values
product_interval_end NUMBER(38,0) - these are some numeric values
)

所以我使用了以下內容,以便 PDI 將其讀取為 Bignumber 37

CAST (product_interval_strt AS number(37,0)) INTERVAL_START ,
CAST (product_interval_strt AS number(37,0)) product_interval_end

所以我需要准備一個合並 sql 語句來檢查 product_id 是否存在做更新不存在做插入,但我不確定我只需要使用下面

如果值存在更新或插入,我需要准備一個簡單的合並語句

如果以下骨架/結構正確,請糾正我

merge into MY_TABLE tgt
using (select [expressions]
         from dual ) src
   on (src.key_condition = tgt.key_condition)
when matched then 
     update tgt
        set tgt.column1 = src.column1 [,...]
when not matched then 
     insert into tgt
        ([list of columns])
     values
        (src.column1 [,...]);

嘗試這個

MERGE INTO product TGT
   USING (SELECT product_id
,product_nm
,product_cd
,product_dec
,insert_ts
,update_ts
,version
,CAST (product_interval_strt AS number(37,0)) INTERVAL_START 
,CAST (product_interval_strt AS number(37,0)) product_interval_end
FROM product_stg 
) SRC
   ON (SRC.product_id = TGT.product_id)
   WHEN MATCHED THEN UPDATE SET TGT.product_nm=SRC.product_nm ......)
   WHEN NOT MATCHED THEN INSERT (TGT.product_id, TGT.product_nm .....)
     VALUES (SRC.product_id, SRC.product_nm .....);
when matched then  
     update tgt --> Incorrect syntax
        set tgt.column1 = src.column1 [,...]
when not matched then 
     insert into tgt --> Incorrect syntax

MERGE語句的語法不正確。 目標表名在MERGE INTO語法中已經提到,不需要在UPDATEINSERT子句中再次指定表名。 update 和 insert 子句的正確語法是:

WHEN MATCHED THEN 
    UPDATE SET TGT.product_nm = SRC.product_nm
WHEN NOT MATCHED THEN 
    INSERT (TGT.product_id, TGT.product_nm .....)
    VALUES (SRC.product_id, SRC.product_nm .....);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM