2

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

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

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

4

1 回答 1

2

有趣的场景!

有几个问题需要担心:

  • 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')和空值的记录场地。从字符串中删除尾随空格;空但非空字符字段在卸载文件中有一个空格。

如果 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(一个字符串)本身包含引号(并且换行符也可能在接收端引起问题),那么它是不健壮的。您必须评估这是否可以接受。

于 2009-12-03T01:30:13.097 回答