DB2 中面临 "Row not found for MERGE" 错误
Facing "Row not found for MERGE" Error in DB2
我正在尝试使用 MERGE 语句更新 iSeries 或 AS400 上物理文件中的记录 运行 V7R1。
我遇到的问题是在测试 table 中尝试使用合并时,我收到一个 Row not found for MERGE. SQLSTATE=02000
非常类似于 的警告。
我的问题的主要区别在于,我首先创建了测试副本 table 以保留数据,然后使用合并进行更新。合并对使用 CPYF
创建的副本有效。当我对合并按预期工作感到满意时,我将其指向正确的测试文件并在执行时收到以下警告。
SQL State: 02000
Vendor Code: 100 Message: [SQL0100] Row not found for MERGE.
目标 table 是一个成员物理文件,上面有一个别名。例如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 中使用时确实会产生结果:
SELECT *
FROM DOUG.MYDATA901 TGT
JOIN DOUG.BUMYDATA SRC ON TGT.PREC = SRC.PREC;
为什么 MERGE 对复制的数据有效,但对我创建副本的来源 table 无效?
制作副本时,您只复制文件的一个成员...FROMMBR(F901)
要复制所有成员,您需要使用 FROMMBR(*ALL) TOMBR(*FROMMBR)
我不知道,也找不到任何文档说明 MERGE
对多成员文件的任何限制。我确实在 v7.1 SQL Reference for ALIAS
中找到了以下内容
An alias that refers to an individual partition of a table or member of a database file can only be used in a select statement, CREATE INDEX, DELETE, INSERT, MERGE, SELECT INTO, SET variable, UPDATE, or VALUES INTO statement.
所以看起来 ALIAS
应该有效,但是,该块周围的文档中有更改标记。 MERGE
是在 7.1 中添加的,因此更改标记可能来自最初的增强功能,或者 ALIAS
支持可能是稍后添加的。
我建议询问 IBM,但 7.1 不受支持。
您可以使用数据在 QTEMP 中创建别名文件的副本,并将您的更新合并到该文件中。然后使用 QSYS2.QCMDEXC 到 运行 CPYF 命令并替换您的物理文件成员中的数据。
我正在尝试使用 MERGE 语句更新 iSeries 或 AS400 上物理文件中的记录 运行 V7R1。
我遇到的问题是在测试 table 中尝试使用合并时,我收到一个 Row not found for MERGE. SQLSTATE=02000
非常类似于
我的问题的主要区别在于,我首先创建了测试副本 table 以保留数据,然后使用合并进行更新。合并对使用 CPYF
创建的副本有效。当我对合并按预期工作感到满意时,我将其指向正确的测试文件并在执行时收到以下警告。
SQL State: 02000
Vendor Code: 100 Message: [SQL0100] Row not found for MERGE.
目标 table 是一个成员物理文件,上面有一个别名。例如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 中使用时确实会产生结果:
SELECT *
FROM DOUG.MYDATA901 TGT
JOIN DOUG.BUMYDATA SRC ON TGT.PREC = SRC.PREC;
为什么 MERGE 对复制的数据有效,但对我创建副本的来源 table 无效?
制作副本时,您只复制文件的一个成员...FROMMBR(F901)
要复制所有成员,您需要使用 FROMMBR(*ALL) TOMBR(*FROMMBR)
我不知道,也找不到任何文档说明 MERGE
对多成员文件的任何限制。我确实在 v7.1 SQL Reference for ALIAS
An alias that refers to an individual partition of a table or member of a database file can only be used in a select statement, CREATE INDEX, DELETE, INSERT, MERGE, SELECT INTO, SET variable, UPDATE, or VALUES INTO statement.
所以看起来 ALIAS
应该有效,但是,该块周围的文档中有更改标记。 MERGE
是在 7.1 中添加的,因此更改标记可能来自最初的增强功能,或者 ALIAS
支持可能是稍后添加的。
我建议询问 IBM,但 7.1 不受支持。
您可以使用数据在 QTEMP 中创建别名文件的副本,并将您的更新合并到该文件中。然后使用 QSYS2.QCMDEXC 到 运行 CPYF 命令并替换您的物理文件成员中的数据。