我正在努力完成能够刷新数据库环境的第一步。
首先,我将环境 1 中的表导出到名为 Test1 的 csv 文件。
OUTPUT TO VALUE("X:\Test\Test1.csv").
FOR EACH Test1 NO-LOCK:
EXPORT DELIMITER ',' Test1.
END.
OUTPUT CLOSE
然后我将此文件导入到环境 2,其中不知道 test1 中的所有记录是否都存在于环境 2 中。也不知道顺序是否相同(这是以下功能受限的地方)
INPUT FROM "X:\Test\Test1.csv".
FOR EACH Test12:
IMPORT DELIMITER ',' Test1.
END.
因此,我需要能够查看环境 2 中的现有记录是否存在于从环境 1 导出的文件 Test1 中,并通过调整环境 2 中的这些记录来应用更改/更新。
不幸的是,我无法更具体地提供姓名和日期,因为这是机密
我尝试使用显示的脚本在 notepadd++ 中编辑导出文件 Test1,删除一条仍然运行良好的记录。然而,当我还通过删除记录删除了留下的空白规则时,所有内容都向上移动了一行,它提到entryID(第一列)已经存在。这意味着它存在于文件的另一行中(这是我删除记录之前的下面的行。)。
我认为你的根本问题是你不应该在导入块中使用 FOR EACH 。
您可能想要做的是使用 REPEAT 块来导入数据。
类似:
REPEAT:
CREATE tableName.
IMPORT DELIMITER "," tableName.
END.
可能进入临时表记录,并将导入的记录与现有表进行比较,如果存在差异则决定是否更新现有记录。
DEFINE TEMP-TABLE tt_tableName LIKE tableName.
CREATE tt_tableName.
REPEAT:
IMPORT DELIMITER "," tt_tableName.
FIND tableName EXCLUSIVE-LOCK WHERE tableName.id = tt_tableName.id NO-ERROR. /* The "id" field is just something that I made up - use whatever the real table has for a UNIQUE key in the WHERE clause */
IF AVAILABLE( tableName ) THEN
DO:
/* do whatever is appropriate to merge the data */
END.
END.
注意:此方法不会检测“test”中缺少的记录以及应从“test12”中删除的记录,除非您的“适当的”合并逻辑可能在字段中使用“魔术”值来指示应删除记录.
如果您只是将现有的“test12”数据替换为“test”,那么您应该首先删除“test12”数据。对于小桌子,你可以合理地做到这一点:
FOR EACH tableName exclusive-lock:
DELETE tableName.
END.
对于大桌子来说可能会变得非常痛苦。对于那些您最好将大表放入专用存储区域并使用“proutil -C truncate area”。
(上面的代码都是伪代码,没有经过测试,只是概述一下大概的做法。)