从 Informix 批量导入到 Oracle

发布于 2024-08-13 04:34:36 字数 170 浏览 4 评论 0原文

我们需要从 Informix SE 数据库中提取一些表,截断 Oracle 10g 上的表,然后用 Informix 数据填充它们。

批量导入有用吗?数据类型会冲突吗?

我想使用一个简单的 Java 可执行文件,我们可以每天安排它。 Java程序可以调用批量导入吗?您可以提供一个例子吗?谢谢。

We need to pull some tables from an Informix SE database, truncate tables on Oracle 10g, and then populate them with the Informix data.

Does a bulk import work? Will data types clash?

I'd like to use a simple Java executable that we can schedule daily. Can a Java program call the bulk import? Is there an example you can provide? Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

╰ゝ天使的微笑 2024-08-20 04:34:36

有趣的场景!

有几个问题需要担心:

  • Oracle 的批量导入期望数据采用什么格式?
  • DATE 和 DATETIME 值的正确格式是什么?

务实地(基于 Informix 而不是 Oracle 的经验),我不会在批量加载之前截断表,而是将数据批量加载到新创建的表中(一个相对耗时的过程),然后安排用旧表替换旧表。新的。根据最快的操作,我要么执行一系列操作:

  • 将旧表重命名为垃圾表
  • ,将新表重命名为旧表

,然后执行一系列“删除垃圾表”操作,或者执行以下操作:

  • 删除旧表
  • 重命名新表到旧表

如果以这种方式完成操作,与“截断表”然后“加载表”相比,表的“停机时间”会最小化。

Oracle 与 SE 类似 - 它的 DDL 语句是非事务性的(与 IDS 不同,在 IDS 中,您可以使用事务来删除表、创建新表,然后回滚整套操作)。

如何导出数据?

这取决于 Oracle 加载器的灵活性。如果它们能够适应 Informix 的标准输出格式(例如 UNLOAD 格式),那么卸载操作就很简单了。您可能需要设置 DBDATE 环境变量以确保 Oracle 能够识别日期值。我可以相信 'DBDATE="Y4MD-"' 很可能会被接受; 是 2009 年 12 月 2 日的 SQL 标准 2009-12-02 表示法。

默认的 UNLOAD 格式可以概括为“用反斜杠转义嵌入式换行符、反斜杠和管道符号的管道分隔字段”:

abc|123|2009-12-02|a\|b\\c\
d||

这 是一条包含字符串、数字、日期和另一个字符串(包含 'a'、'|'、'b'、'\'、'c'、换行符和 'd')和 null 字段的记录。从字符串中删除尾随空白;空但非空字符字段在卸载文件中只有一个空格。

如果 Oracle 不能轻易地处理这个问题,那么请考虑 Perl + DBI + DBD::Informix + DBD::Oracle 是否可以作为一个可以使用的工具集 - 这允许您连接到 Oracle 和 Informix (SE) 数据库,并且在它们之间传输数据。

或者,您需要研究 SE 的替代卸载器。除非您使用 Windows,否则可能值得研究的一个程序是 SQLCMD(公平警告 :作者的偏见正在蔓延)。它具有一组相当强大的输出格式选项,并且可能可以创建 Oracle 可接受的文本格式(例如 CSV)。

最后的后备方案是让工具为所选数据生成 INSERT 语句。我认为这作为 SQLCMD 的补充可能很有用,但目前还没有。因此,您必须使用:

SELECT 'INSERT INTO Target(Col1, Col2) VALUES (' ||
       Col1 || ', ''' || Col2 || ''');'
  FROM Source

这会生成一个简单的 INSERT 语句。这样做的问题是,如果 Col2 (字符串)本身包含引号(并且换行符也可能在接收端引起问题),那么它就不健壮。您必须评估这是否可以接受。

Interesting scenario!

There are several issues to worry about:

  • What format does Oracle's bulk import expect the data to be in?
  • What is the correct format for the DATE and DATETIME values?

Pragmatically (and based on experience with Informix rather than Oracle), rather than truncate the tables before bulk loading, I would bulk load the data into newly created tables (a relatively time-consuming process), then arrange to replace the old tables with the new. Depending on what works quickest, I'd either do a sequence of operations:

  • Rename old table to junk table
  • Rename new table to old table

followed by a sequence of 'drop junk table' operations, or I'd do:

  • Drop old table
  • Rename new table to old table

If the operations are done this way, the 'down time' for the tables is minimized, compared with 'truncate table' followed by 'load table'.

Oracle is like SE - its DDL statements are non-transactional (unlike IDS where you can have a transaction that drops a table, creates a new one, and then rolls back the whole set of operations).

How to export the data?

This depends on how flexible the Oracle loaders are. If they can adapt to Informix's standard output formats (for example, the UNLOAD format), then the unloading operations are trivial. You might need to set the DBDATE environment variable to ensure that date values are recognized by Oracle. I could believe that 'DBDATE="Y4MD-"' is likely to be accepted; that is the SQL standard 2009-12-02 notation for 2nd December 2009.

The default UNLOAD format can be summarized as 'pipe-delimited fields with backslash escaping embedded newlines, backslash and pipe symbols':

abc|123|2009-12-02|a\|b\\c\
d||

This is one record with a character string, a number, a date, and another character string (containing 'a', '|', 'b', '\', 'c', newline and 'd') and a null field. Trailing blanks are removed from character strings; an empty but non-null character field has a single blank in the unload file.

If Oracle cannot readily be made to handle that, then consider whether Perl + DBI + DBD::Informix + DBD::Oracle might be a toolset to use - this allows you to connect to both the Oracle and the Informix (SE) databases and transfer the data between them.

Alternatively, you need to investigate alternative unloaders for SE. One program that may be worth investigating unless you're using Windows is SQLCMD (fair warning: author's bias creeping in). It has a fairly powerful set of output formatting options and can probably create a text format that Oracle would find acceptable (CSV, for example).

A final fallback would be to have a tool generate INSERT statements for the selected data. I think this could be useful as an addition to SQLCMD, but it isn't there yet. So, you would have to use:

SELECT 'INSERT INTO Target(Col1, Col2) VALUES (' ||
       Col1 || ', ''' || Col2 || ''');'
  FROM Source

This generates a simple INSERT statement. The snag with this is that it is not robust if Col2 (a character string) itself contains quotes (and newlines may cause problems on the receiving end too). You'd have to evaluate whether this is acceptable.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文