Сохранить первичный ключ из оператора слияния db2 в скрипте Php - PullRequest
0 голосов
/ 24 января 2019

У меня есть php-скрипт, в котором я установил параметры, которые я затем использую в 2 операторах слияния для db2.

Проблема заключается в том, что в моем первом операторе слияния мне нужно получить и использовать первичный ключзатронутой строки (если слияние выполнило обновление, захватите идентификатор обновленной строки. Если это сделало вставку, захватите вновь созданный идентификатор), потому что мне нужно использовать идентификатор / первичный ключ во втором слиянии (либо вставка, либо обновлениестрока, в которой он уже есть)

Мои два оператора слияния:

/*products table*/
MERGE INTO products AS P
    USING(VALUES(

        :GROUP,
        :DTL12,
        :DTL13,
        :CUSTNM,
        :SELLINGN,
        :COUNT_PLMN_1,
        :LAST_DATE

        )
    )

AS S(GROUP,DTL12,DTL13,CUSTNM,SELLINGN,COUNT_PLMN_1,LAST_DATE)
ON s.GROUP = p.GROUP and s.DTL12 = p.DTL12 and s.DTL13 = p.DTL13 and s.CUSTNM = p.CUSTNM 

WHEN MATCHED
    THEN UPDATE SET LAST_DATE = s.LAST_DATE

WHEN NOT MATCHED
    THEN INSERT VALUES (s.GROUP,s.DTL12,s.DTL13,s.CUSTNM,s.SELLINGN,s.COUNT_PLMN_1,s.LAST_DATE)



/*ORDERS Table*/
MERGE INTO ORDERS AS PO
    USING(VALUES(

        /*need foreign key, which is id from products table*/
        :QUANTITY,
        :LAST_DATE,
        :INVOICE_NUMBER
    ))

AS S(PRODUCT_ID,quantity_ordered,LAST_DATE,invoice_number)
ON s.PRODUCT_ID = po.id

WHEN MATCHED
    THEN UPDATE SET LAST_DATE = s.LAST_DATE, quantity_ordered = s.quantity_ordered, invoice_number = s.invoice_number

WHEN NOT MATCHED
    THEN INSERT VALUES (s.PRODUCT_ID, s.quantity_ordered, s.LAST_DATE, s.invoice_number)

Как я могу правильно обработать это в php-скрипте?

1 Ответ

0 голосов
/ 24 января 2019

Вы не можете сделать select из merge в db2 для luw. Чтобы получить уязвимый идентификатор (вставленный или обновленный) в Product, вы можете использовать следующий запрос:

with s (GROUP, DTL12, DTL13, CUSTNM, SELLINGN, COUNT_PLMN_1, LAST_DATE) as (VALUES
  (:GROUP, :DTL12, :DTL13, :CUSTNM, :SELLINGN, :COUNT_PLMN_1, :LAST_DATE)
) 
, u as (
select id 
from new table (
update products p
set (last_date)=(
select s.last_date 
from s
where s.GROUP = p.GROUP and s.DTL12 = p.DTL12 and s.DTL13 = p.DTL13 and s.CUSTNM = p.CUSTNM
)
where exists (
select s.last_date 
from s
where s.GROUP = p.GROUP and s.DTL12 = p.DTL12 and s.DTL13 = p.DTL13 and s.CUSTNM = p.CUSTNM
)
)
)
, i as (
select id
from new table(
insert into products (GROUP, DTL12, DTL13, CUSTNM, SELLINGN, COUNT_PLMN_1, LAST_DATE)
select GROUP, DTL12, DTL13, CUSTNM, SELLINGN, COUNT_PLMN_1, LAST_DATE
from s
where not exists (
select 1
from products p
where s.GROUP = p.GROUP and s.DTL12 = p.DTL12 and s.DTL13 = p.DTL13 and s.CUSTNM = p.CUSTNM
)
)
)
select id 
from table (values coalesce((select id from u), (select id from i))) t(id);

Вот 2 оператора изменения данных для Products - Update (если соответствующая строка существует) и Insert (если соответствующая строка не существует). Select из обоих операторов изменения данных извлекает ID затронутые (сгенерированные после Insert или обновленные), и возвращается один из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...