如何在 Informix 中打开和读取文件

Posted

技术标签:

【中文标题】如何在 Informix 中打开和读取文件【英文标题】:How to open and read a file in Informix 【发布时间】:2013-12-18 16:32:09 【问题描述】:

我需要编写一个存储过程,它从包含员工记录(多行)的文本文件中读取输入,并将这些值与员工表中的值进行比较,如果有任何修改,则编辑员工表中的行。我正在使用连接类型为 Informix 的 DB Visualizer 工具。由于我是 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 表中获取特定记录。现在,检查其他字段并在必要时进行修改。例如,如果 emp 表中 emp 111 的名字是“fname1”而不是“fname”,我需要更新它。顺便说一句,它来自我不是从外部表中读取的文本文件。

【问题讨论】:

欢迎来到 Stack Overflow。请尽快阅读About 页面。我们将需要更多信息才能提供更多帮助。例如,文本文件中有什么?需要与存储在数据库中某个表的 TEXT 或 CLOB 列中的数据进行比较的单个数据块?或者为一个表中的多行卸载数据,需要将其加载到数据库中以便可以将结果表与另一个表进行比较?或者完全是别的什么?您使用的是哪个版本的 Informix,在哪个系统上?可以选择哪些编程语言?等等。 请将您的 cmets 编辑到问题中;您可以在那里获得完整的格式选项,这将使每个人都更容易阅读。 【参考方案1】:

假设您使用的是最新版本的 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(但为什么?)。总的来说,您的数据库应该被记录下来。您可以将 COMMIT 放在 DROP 之后;如果你有一个 MODE ANSI 数据库,你可能需要在 DROP 之后再次提交。

IDS 12.10 Information Centre CREATE EXTERNAL TABLE MERGE

鉴于现在问题中的额外信息,我比以往任何时候都更加确信使用 CREATE EXTERNAL TABLE 将磁盘上的文件指定为数据源,而 MERGE 语句正是您所需要的。 CREATE EXTERNAL TABLE 语句允许 IDS 将文件视为一个表。 MERGE 语句会自动(无需您进行编程)执行诸如“更新名字,因为它不同”之类的事情。

如果你愿意,你可以用另一种方式来做——做我的客人。您使用的是 Informix 4GL (I4GL) 还是其他语言? I4GL 是一个必须购买的单独产品,它创建了针对数据库运行的编译程序。我不知道 DB Visualizer 如何适合该系统。如果您使用 I4GL,您可以创建临时表,然后(可能)将数据加载到其中,然后进行匹配工作。或者您可以在 SQL ... END SQL 块中使用 CREATE EXTERNAL TABLE 和 MERGE。

我相信你也会感到困惑;您对 Informix 不是很熟悉,并且不太确定您拥有什么以及正在使用什么。 I4GL 根本不使用 JDBC;它构建在 Informix ESQL/C 之上。使用普通的 ESQL/C 是另一种选择,但仅适用于像我这样的受虐狂(他一直在使用它)。即便如此,我仍然希望使用 CREATE EXTERNAL TABLE 和 MERGE。

【讨论】:

谢谢。让我给你解释清楚。我没有使用 Informix 工具。我使用 DB Visualizer 和连接类型 informix 和 JDBC Informix 驱动程序。所以,我假设我应该用 Informix 语言(另一种语言,如 SQL、Oracle)编写脚本。现在,我的要求不是从外部表中读取,而是从文本文件中逐行读取记录,将字段与现有表中的字段进行比较。首先,我想先打开文件并使用“OPEN FILE fd1 FROM "C:\sample.txt" OPTIONS (READ, FORMAT = "CSV")" 但它给了我一个错误。你能告诉我如何打开一个文本文件plz。 MERGE 命令可以为您“进行编辑”。请在问题中澄清您的问题(但请发表评论让我知道您已经这样做了)。我不清楚 DB Visualizer 是什么。我不知道您认为哪种语言有 OPEN FILE 命令;看起来可能几乎是 Informix-4GL,但我怀疑不是。原始 Informix 服务器没有 OPEN FILE 语句(请参阅信息中心的手册)。目前,你我之间完全脱节——我们没有共同的理解。我仍然认为 CREATE EXTERNAL TABLE 和 MERGE 是个好主意,但一些示例数据可能会有所帮助。 对不起。我是***的新手,不知道所有规则。是的。 open 语句来自 Informix 4GL。我不知道 4GL 和原始 Informix 之间的区别。场景是:我在“C:\sample.txt”中有一个文本文件,数据为 111 222 fname lname 3456 谢谢,约翰。我认为创建一个 Ext 表是个好主意。我尝试使用 DROP TABLE IF EXISTS mergeable_data;创建外部表 mergeable_data( column1 VARCHAR(15) ) 使用 ( DATAFILES ('DISK:\C:\sample.txt'), FORMAT 'DELIMITED', DELUXE );它确实创建了表,但是当我从 mergeable_data 中选择 * 时,它给了我 [错误代码:-26154,SQL 状态:IX000] 无法打开文件:(file, errno)=(\C\sample.txt,2) .你知道可能是什么问题吗?? 我也试过 LOAD FROM 'c:\sample.txt' INSERT INTO test_table ;但它给了我一个语法错误

以上是关于如何在 Informix 中打开和读取文件的主要内容,如果未能解决你的问题,请参考以下文章

如何优化打开和读取多次相同文件的python脚本?

怎么在51单片机中读取文件 如何在Keil C51使用fopen函数 也就是如何在C51中编写 能打开文件程序

使用 Python 在 AWS Glue 中打开和读取文件

如何批量读取csv格式的文件名及文件内容到新的Excel中?

用c语言如何读取和保存jpg图片文件?

如何在 Android 中读取/打开 PPT 文件?