我正在尝试使用MERGE语句来更新运行V7R1的iSeries或AS400上物理文件中的记录。
[我遇到的问题是尝试在测试表上使用合并时,收到与Row not found for MERGE. SQLSTATE=02000
非常相似的this question on SO警告。
我的问题的主要区别是,我首先创建了一个测试表副本来保存数据,然后使用合并来更新。合并对用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只能用于复制的数据,但不能用于我从中创建副本的源表?
复制时,您仅复制文件的单个成员... 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不在支持范围内。