Sybase bcp数据类型日期和文本使用sqlldr到oracle数据库

Sybase bcp data type date and text to oracle database using sqlldr

我正在尝试将 table 从 sybase 数据库迁移到 Oracle 数据库。 以下是我的sybase数据库的结构。

我已经使用 bcp 提取了所有记录。我提取的记录如下 -

1|0.1|1/7/2010 12:00:00 AM|<exm><id>1</id></exm> 
2|0.2|1/8/2010 12:00:00 AM|<exm><id>1</id></exm>

我正在使用以下 sqlldr 命令将记录插入 oracle 数据库。

sqlldr \'username/passwd@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=myhost.com)(PORT=1111)))(CONNECT_DATA=(SID=MYSIDE)(SERVER=DEDICATED)))\' control=loader.ctl log=mylog.log

这是我的加载器文件(loader.ctl)

LOAD DATA 
INLINE '/tmp/bcp_out.txt'
INTO TABLE MY_TABLE
FIELDS TERMINATED BY '|'
TRAILING NULLCOLS
(ID,
VERSION,
DATE,
STATEMENT CHAR(10000))

Table 在 Oracle 中创建 -

所以从上面table,我们希望将来自sybase的日期转换为oracle时间戳,并将语句转换为Oracle CLOB。

能否建议我必须对加载程序文件进行哪些更改才能实现我的目标?

你真的需要oracle的数据类型是TIMESTAMP吗?据我所知,DATE 就足够了。在 oracle 中,与其他一些 rdbms 不同,DATE 的数据类型包括 时间,精确到秒。在 oracle 中,TIMESTAMP 包括日期和时间 nano-second,也可以有时区变体。

documentation 提供了一个很好的例子来处理输入的 csv 文件中的日期。根据您的情况进行调整:

LOAD DATA 
INLINE '/tmp/bcp_out.txt'
INTO TABLE MY_TABLE
FIELDS TERMINATED BY '|'
DATE FORMAT "mm/dd/yyyy hh12:mi:ss AM"
TRAILING NULLCOLS
(ID,
VERSION,
DATE,
STATEMENT CHAR(10000))

日期格式模型的进一步解释here

至于clob,我也没办法。我自己从未做过,但我会先查看 sqlldr 的文档。

目标 table(在 Oracle 中;请注意 date 是无效的列名(除非用双引号引起来,但我不建议这样做)):

SQL> desc test
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER
 VERSION                                            VARCHAR2(5)
 DATUM                                              TIMESTAMP(6)
 STATEMENT                                          CLOB

SQL>

控制文件(包含示例数据;您可能会将其放在单独的文件中;另外,我不知道 1/7/2010 真正代表什么 - 是 7 月 1 日还是 1 月 7 日 - 日期格式可能需要更改):

load data 
infile *
replace
into table test
fields terminated by '|'
trailing nullcols
( 
id,
version,
datum "to_date(:datum, 'dd/mm/yyyy hh:mi:ss am')",
statement
)

begindata
1|0.1|1/7/2010 12:00:00 AM|<exm><id>1</id></exm> 
2|0.2|1/8/2010 12:00:00 AM|<exm><id>1</id></exm>

加载会话和结果:

SQL> $sqlldr scott/tiger control=test22.ctl log=test22.log

SQL*Loader: Release 11.2.0.2.0 - Production on Uto Lis 13 18:16:41 2020

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

Commit point reached - logical record count 1
Commit point reached - logical record count 2
    
SQL> -- you don't have to do that; I'm just showing *what is what* in the timestamp
SQL> alter session set nls_timestamp_format = 'dd.mm.yyyy hh:mi:ss.ff6';

Session altered.

SQL> select * from test;

        ID VERSION DATUM                          STATEMENT
---------- ------- ------------------------------ ------------------------------
         1 0.1     01.07.2010 12:00:00.000000 AM  <exm><id>1</id></exm>
         2 0.2     01.08.2010 12:00:00.000000 AM  <exm><id>1</id></exm>


SQL>

截至另一种日期格式:

SQL> select to_timestamp('1 Mon 2020 12:00:00:000 am', 'dd Mon yyyy hh:mi:ss:ff am') from dual;

TO_TIMESTAMP('1SIJ202012:00:00:000AM','DDMONYYYYHH:MI:SS:FFAM')
---------------------------------------------------------------------------
01.01.20 00:00:00,000000000

SQL>