我需要编写一个存储过程,该文件从包含员工记录(多行)的文本文件中读取输入,并将这些值与employee表中的值进行比较,如果有任何修改,则编辑employee表中的行。我使用连接类型为DB Visualizer的工具作为Informix。由于我是Informix的新手,我不知道如何开始。
场景是:
我有一个Employee表,其中包含字段emp_no,dept_no,fname,lname,crp_id,sal,hours等。 我在'C:\ sample.txt'中有一个带有数据
的文本文件111 222 fname lname 3456
112 223 fname2 lname2 3457..
我需要读取文本文件的第一行,获取emp_no(111)并从emp表中获取特定记录。现在,检查其他字段并在必要时进行修改。对于Ex,如果emp表中emp 111的名字是'fname1'而不是'fname',我需要更新它。而顺便说一句,它来自我正在阅读的文本文件而不是外部表。
答案 0 :(得分:3)
假设您使用的是最新版本的Informix(12.10或11.70),那么您可能应该将文件映射到外部表,然后使用MERGE命令合并更新和插入(可能删除)从外部表到新表。从理论上讲,这是大约5个SQL命令:
BEGIN WORK;
CREATE EXTERNAL TABLE mergeable_data (...) ...;
MERGE ... YourMainTable ... FROM mergeable_data
ON MATCH UPDATE ...
ON NO MATCH INSERT ...; -- Check the syntax; I'm inventing on the fly!
COMMIT WORK;
DROP TABLE mergeable_data;
如果您有一个未记录的数据库(但为什么?),则不需要BEGIN和COMMIT。总的来说,应该记录您的数据库。您可以在DROP之后放置COMMIT;如果你有一个MODE ANSI数据库,你可能需要在DROP之后另一个COMMIT。
鉴于现在问题中的额外信息,我比以往任何时候都更加确信使用CREATE EXTERNAL TABLE指定您在磁盘上获得的文件作为数据源,而MERGE语句正是您所需要的。 CREATE EXTERNAL TABLE语句允许IDS将文件视为表。自动MERGE语句(不需要编程)会执行“更新名字,因为它不同”等内容。
如果你愿意,你可以用另一种方式做到 - 做我的客人。您使用的是Informix 4GL(I4GL)还是其他语言? I4GL是必须购买的单独产品,并创建针对数据库运行的编译程序。我不知道DB Visualizer如何适应该系统。如果您使用的是I4GL,则可以创建临时表,然后(可能)将数据加载到其中,然后进行匹配工作。或者你可以在SQL中使用CREATE EXTERNAL TABLE和MERGE ... END SQL blocks。
我确信你也会感到困惑;你对Informix并不十分熟悉,你不确定自己拥有什么以及使用的是什么。 I4GL根本不使用JDBC;它建立在Informix ESQL / C之上。使用普通的ESQL / C是另一种选择,但仅适用于像我这样的masochists(他们一直用它来做æons)。即便如此,我仍然希望使用CREATE EXTERNAL TABLE和MERGE。