вставить или обновить, используя если существует, используя логику слияния oracle sql - PullRequest
0 голосов
/ 08 мая 2020

я получаю данные из серверной части системы транзакций 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 Numeri c Overflow

, поэтому я использовал следующее, чтобы PDI считал его как Bignumber 37

CAST (product_interval_strt AS number (37,0)) INTERVAL_START, CAST (product_interval_strt Номер AS (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, есть ли обновление, не существует, вставьте, но я не был уверен, что мне нужно использовать только приведенный ниже

мне нужно приготовить си Оператор слияния mple, если значение существует, обновить или вставить

исправьте меня, если приведенный ниже скелет / структура верна

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 [,...]);

Ответы [ 2 ]

0 голосов
/ 08 мая 2020
when matched then  
     update tgt --> Incorrect syntax
        set tgt.column1 = src.column1 [,...]
when not matched then 
     insert into tgt --> Incorrect syntax

Ваш синтаксис неверен для оператора MERGE. Имя целевой таблицы уже упоминается в синтаксисе MERGE INTO, нет необходимости снова указывать имя таблицы в предложениях 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 .....);
0 голосов
/ 08 мая 2020

Попробуйте это

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 .....);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...