在DB2中面临“找不到合并行”错误

时间:2019-11-28 03:19:22

标签: sql db2 ibm-midrange db2-400

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

我遇到的问题是,当尝试在测试表上使用合并时,我收到Row not found for MERGE. SQLSTATE=02000警告,与depth first search非常相似。

我的问题的主要区别在于,我首先创建了一个测试表副本来保留数据,然后使用合并来更新。合并对用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 个答案:

答案 0 :(得分:1)

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

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

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

中找到了以下内容
  

引用表的单个分区或数据库文件成员的别名只能在select语句,CREATE INDEX,DELETE,INSERT,MERGE,SELECT INTO,SET变量,UPDATE或VALUES INTO语句中使用

因此ALIAS似乎应该起作用,但是该文档周围的文档中有更改标记。 MERGE是在7.1处添加的,因此更改标记可能来自最初的增强功能,或者也许稍后添加了ALIAS支持。

我建议您咨询IBM,但7.1不受支持。

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