自动生成sqlloader控制文件并导入数据一例
----------
说明
----------
先使用sql脚本,自动生成sqlloader的控制文件,然后将源表使用查询语句,生成数据文件,并获取源表的创建语句,将这些信息全部ftp到目标数据库服务器上,创建新表,并使用sqlldr将数据插入新表,可以通过这种方式,实现对小表的移植。具有可跨平台、跨版本的好处。
环境简单说明
HP-UX zw01 B.11.11 U 9000/800 oracle rdbms 9206
windowXP hxc oracle rdbms 9201
将 zw01 上的sys.uni_long_time_t 表,通过sql*load的方式,移植到hxc上的system用户下。
----------
主要步骤
----------
1. 自动生成control.sql生成sql*load控制文件
2. 在hxc上的system用户下创建表,表的脚本来自zw01 上的sys.uni_long_time_t 表
3. 使用查询语句,生成数据文件
4. 执行导入
-------------
step1. 编辑脚本 control.sql
-------------
set echo off
set heading off
set verify off
set feedback off
set show off
set trim off
set pages 0
set concat on
set lines 300
set trimspool on
set trimout on
spool &1..ctl
select 'LOAD DATA'||chr (10)||
'INFILE '''||lower (table_name)||'.dat'''||chr (10)||
'INTO TABLE '||table_name||chr (10)||
'FIELDS TERMINATED BY '','''||chr (10)||
'TRAILING NULLCOLS'||chr (10)||'('
from all_tables
wheretable_name = upper ('&1');
select decode (rownum, 1, ' ', ' , ')||
rpad (column_name, 33, ' ')||
decode (data_type,
'VARCHAR2', 'CHAR NULLIF ('||column_name||'=BLANKS)',
'FLOAT', 'DECIMAL EXTERNAL NULLIF('||column_name||'=BLANKS)',
'NUMBER', decode (data_precision, 0,
'INTEGER EXTERNAL NULLIF ('||column_name||
'=BLANKS)', decode (data_scale, 0,
'INTEGER EXTERNAL NULLIF ('||
column_name||'=BLANKS)',
'DECIMAL EXTERNAL NULLIF ('||
column_name||'=BLANKS)')),
'DATE', 'DATE "MM/DD/YY"NULLIF ('||column_name||'=BLANKS)',
null)
from user_tab_columns
wheretable_name = upper ('&1')
orderby column_id;
select ')'
from sys.dual;
spool off
-------------
step2. 运行control.sql生成控制文件
-------------
sqlplus "/as sysdba"
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.6.0 - 64bit Production
With the Partitioning option
JServer Release 9.2.0.6.0 - Production
SQL> start control.sql uni_long_time_t
LOAD DATA
INFILE 'uni_long_time_t.dat'
INTO TABLE UNI_LONG_TIME_T
FIELDS TERMINATED BY ','
TRAILING NULLCOLS
(
IPDET CHAR NULLIF (IPDET=BLANKS)
, USERNAME CHAR NULLIF (USERNAME=BLANKS)
, ONTIME DATE "MM/DD/YYYY"NULLIF (ONTIME=BLANKS)
, OFFTIME DATE "MM/DD/YYYY"NULLIF (OFFTIME=BLANKS)
, FLAG INTEGER EXTERNAL NULLIF (FLAG=BLANKS)
, NOTE CHAR NULLIF (NOTE=BLANKS)
)
-------------
step3. 获取创建表的脚本
-------------
create table UNI_LONG_TIME_T
(
IPDET VARCHAR2(15) not null,
USERNAME VARCHAR2(15) not null,
ONTIME DATE not null,
OFFTIMEDATE not null,
FLAG INTEGER not null,
NOTE VARCHAR2(50)
);
-------------
step4. 生成数据文件
-------------
set lines 1000
set pages 1000
spool uni_long_time_t.dat
select a.ipdet || ',' || a.username || ',' ||
to_char(a.ontime, 'mm/dd/yy') || ',' ||
to_char(a.offtime, 'mm/dd/yy') || ',' || a.flag || ',' || a.note
from sys.uni_long_time_t a;
spool off
-------------
step5. 运行sqlldr
-------------
sqlldr userid=system/system control=a.ctl
C:\>sqlldr userid=system/system control=a.ctl
SQL*Loader: Release 9.2.0.1.0 - Production on 星期二 10月 21 09:50:24 2008
Copyright (c) 1982, 2002, Oracle Corporation.All rights reserved.
达到提交点,逻辑记录计数64
达到提交点,逻辑记录计数128
达到提交点,逻辑记录计数192
达到提交点,逻辑记录计数256
达到提交点,逻辑记录计数320
达到提交点,逻辑记录计数384
达到提交点,逻辑记录计数448
达到提交点,逻辑记录计数512
达到提交点,逻辑记录计数576
达到提交点,逻辑记录计数640
达到提交点,逻辑记录计数704
达到提交点,逻辑记录计数768
达到提交点,逻辑记录计数804