在Php脚本中存储db2 merge语句中的主键

在Php脚本中存储db2 merge语句中的主键,php,db2,Php,Db2,我有一个php脚本,其中设置了参数,然后在db2的两个合并语句中使用这些参数 问题是,在我的第一个merge语句中,我需要获取并使用受影响行的主键(如果merge执行了更新,则获取更新行的ID。如果它执行了insert,则获取新创建的ID),因为我需要在第二个merge中使用ID/主键(插入或更新已经拥有它的行) 我的两个合并语句: /*products table*/ MERGE INTO products AS P USING(VALUES( :GROUP,

我有一个php脚本,其中设置了参数,然后在db2的两个合并语句中使用这些参数

问题是,在我的第一个merge语句中,我需要获取并使用受影响行的主键(如果merge执行了更新,则获取更新行的ID。如果它执行了insert,则获取新创建的ID),因为我需要在第二个merge中使用ID/主键(插入或更新已经拥有它的行)

我的两个合并语句:

/*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脚本中正确处理此问题

在DB2forLUW中,您无法从
merge
执行
select
。要在
产品中获取受影响的id(插入或更新),可以使用以下查询:

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);

以下是针对
产品
-
更新
(如果对应行存在)和
插入
(如果对应行不存在)的两条数据更改语句
Select
从两个数据更改语句中检索受影响的
ID
(在
Insert
或更新时生成),并返回其中一个。

在db2 for luw中,您无法执行
Select
from
merge
。要在
产品中获取受影响的id(插入或更新),可以使用以下查询:

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);

以下是针对
产品
-
更新
(如果对应行存在)和
插入
(如果对应行不存在)的两条数据更改语句<代码>从两个数据更改语句中选择
检索受影响的
ID
(在
插入时生成或更新),并返回其中一个。

组、DTL12、DTL13、CUSTNM
-这是
产品
表中的唯一键吗?如果不是,那么如果第一次合并在给定的输入值上更新了多行,
Orders
表的逻辑是什么,对于该唯一组合,products表中只有一行,因此插入或更新了一行isil,但这也发生在while循环中,因此对于每一行结果,product merge tl会创建或更新一行isilrow@MarkBarinstein为了消除混淆:这四列/值使每一行都是唯一的,但它们也有作为主键的ID列。但是在循环中,每次合并将一次执行一个
组、DTL12、DTL13、CUSTNM
-这是
产品
表中的唯一键吗?如果不是,那么如果第一次合并在给定的输入值上更新了多行,
Orders
表的逻辑是什么,对于该唯一组合,products表中只有一行,因此插入或更新了一行isil,但这也发生在while循环中,因此对于每一行结果,product merge tl会创建或更新一行isilrow@MarkBarinstein为了消除混淆:这四列/值使每一行都是唯一的,但它们也有作为主键的ID列。但在循环中,每次合并都会一次完成一个