面对 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