有趣的场景!
有几个问题需要担心:
Oracle批量导入的格式是什么格式?
DATE和DATETIME值的正确格式是什么?
务实(并且基于对Informix而不是Oracle的经验),而不是在批量加载之前截断表,我会将数据批量加载到新创建的表中(一个相对耗时的过程),然后安排替换旧的新表。根据最快的工作原理,我要么做一系列的操作:
将旧表重命名为垃圾表
将新表重命名为旧表
然后是一系列'drop junk table'操作,或者我会这样做:
放弃旧桌子
将新表重命名为旧表
如果以这种方式完成操作,那么与'truncate table'后跟'load table'相比,表的'停机时间'最小化。
Oracle就像SE一样 - 它的DDL语句是非事务性的(与IDS不同,在这种情况下,您可以拥有一个删除表的事务,创建一个新事务,然后回滚整个操作集)。
如何导出数据?
这取决于Oracle加载器的灵活性。如果它们可以适应Informix的标准输出格式(例如,UNLOAD格式),则卸载操作非常简单。您可能需要设置DBDATE环境变量以确保Oracle可以识别日期值。我可以相信'DBDATE="Y4MD-"'可能会被接受;这是2009年12月2 nd的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(一个字符串)本身包含引号(并且换行也可能在接收端引起问题),那么它的缺点是它不健壮。你必须评估这是否可以接受。
373

被折叠的 条评论
为什么被折叠?



