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>
我正在尝试将 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>