我正在尝试使用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可以用于复制的数据,但不能用于创建副本的源表呢?
答案 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命令并替换您的物理文件成员中的数据。