Oracle控制文件自动生成

    技术2022-05-20  22

    自动生成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 where  table_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 where  table_name = upper ('&1') order  by 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,   OFFTIME  DATE 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


    最新回复(0)