面对 DB2 中的“未找到合并的行”错误

Posted

技术标签:

【中文标题】面对 DB2 中的“未找到合并的行”错误【英文标题】:Facing "Row not found for MERGE" Error in DB2 【发布时间】:2019-11-28 03:19:22 【问题描述】:

我正在尝试使用 MERGE 语句来更新运行 V7R1 的 iSeries 或 AS400 上的物理文件中的记录。

我遇到的问题是,当我尝试在测试表上使用合并时,我收到了一个与 this question on SO 非常相似的 Row not found for MERGE. SQLSTATE=02000 警告。

我的问题的主要区别在于,我首先创建了测试表的副本以保留数据,然后使用合并进行更新。合并对使用CPYF 创建的副本起作用。当我对合并按预期工作感到满意时,我将其指向正确的测试文件,并在执行时收到以下警告。

SQL State: 02000
Vendor Code: 100 Message: [SQL0100] Row not found for MERGE.

目标表是一个成员物理文件,上面有一个别名。例如,DOUG/MYDATA(F901),为了创建别名,我运行了以下命令:

CREATE ALIAS DOUG.MYDATA901 FOR DOUG.MYDATA(F901);

未更新的查询如下:

MERGE INTO DOUG.MYDATA901 TGT USING DOUG.TEST01 SRC
    ON TGT.PREC = SRC.PREC
WHEN MATCHED THEN
    UPDATE SET TGT.PQDS = TGT.PQDS - SRC.TTL_DIST;

但是,当我复制要更新的文件时,合并工作...

CPYF FROMFILE(DOUG/MYDATA) TOFILE(DOUG/BUMYDATA) FROMMBR(F901) MBROPT(*REPLACE) CRTFILE(*YES) OUTFMT(*CHAR)

合并代码产生修改后的记录:

MERGE INTO DOUG.BUMYDATA TGT USING DOUG.TEST01 SRC
    ON TGT.PREC = SRC.PREC
WHEN MATCHED THEN
    UPDATE SET TGT.PQDS = TGT.PQDS - SRC.TTL_DIST;

我验证了在带有内部连接的选择中使用源和副本时,确实会产生结果:

SELECT *
FROM DOUG.MYDATA901 TGT
JOIN DOUG.BUMYDATA SRC ON TGT.PREC = SRC.PREC;

为什么 MERGE 对复制的数据有效,但对我创建副本的源表无效?

【问题讨论】:

【参考方案1】:

当您制作副本时,您只复制文件的一个成员...FROMMBR(F901)

要复制所有成员,您需要使用FROMMBR(*ALL) TOMBR(*FROMMBR)

我不知道,也找不到任何文档,MERGE 对多成员文件的任何限制。我确实在v7.1 SQL Reference for ALIAS

中找到了以下内容

引用表的单个分区或数据库文件成员的别名只能用于 select 语句、CREATE INDEX、DELETE、INSERT、MERGE、SELECT INTO、SET variable、UPDATE 或 VALUES INTO 语句.

所以看起来ALIAS 应该可以工作,但是,该块周围的文档中有更改标记。 MERGE 是在 7.1 中添加的,因此更改标记可能来自最初的增强功能,或者可能是稍后添加了 ALIAS 支持。

我建议询问 IBM,但 7.1 不支持。

您可以使用数据在 QTEMP 中创建别名文件的副本,并将更新合并到该文件中。然后使用 QSYS2.QCMDEXC 运行 CPYF 命令并替换物理文件成员中的数据。

【讨论】:

以上是关于面对 DB2 中的“未找到合并的行”错误的主要内容,如果未能解决你的问题,请参考以下文章

将 DB2 中的 2 个 Select Queries 合并为一个 Result

字符串中的“→”导致错误“在 SQL/XML 表达式中发现非法 XML 字符 001A”(DB2)

在 DB2 中进行合并时值不兼容

db2 merge update

在 db2 中合并两个 select 语句的结果

DB2查询合并2个十进制列并找到最大值