Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1844427
  • 博文数量: 323
  • 博客积分: 5970
  • 博客等级: 大校
  • 技术积分: 2764
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-03 23:13
文章分类

全部博文(323)

文章存档

2018年(2)

2017年(11)

2016年(10)

2015年(27)

2014年(2)

2013年(30)

2012年(197)

2011年(44)

分类: Oracle

2012-05-08 23:11:17

Oracle 大容量导入操作 III - 使用外部表
2011-03-13 16:54

D:\temp>sqlldr userid=test/test123control=test_main_c.ctl data=test_main_c.dat

external_table=generate_only

SQL*Loader: Release 10.2.0.1.0- Production on 星期日 3 13 16:25:27 2011

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

 

external_table=generate_only 意味着 SQLLDR 不加载任何数据,只是会生成所执行的 SQL 语句,保存在日志文件中。


程序执行完毕以后,打开当前目录下的  test_main_c.log 文件

 

 

SQL*Loader: Release 10.2.0.1.0- Production on 星期日 3 13 16:25:27 2011

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

 

控制文件:      test_main_c.ctl

数据文件:      test_main_c.dat

  错误文件:    test_main_c.bad

  废弃文件:    未作指定

(可废弃所有记录)

要加载的数: ALL

要跳过的数: 0

允许的错误: 50

继续:    未作指定

所用路径:       外部表

 

 TEST_MAIN,已加载从每个逻辑记录

插入选项对此表 INSERT生效

   列名                        位置      长度  中止包装数据类型

------------------------------ --------------- ---- ---- ---------------------

ID                                  FIRST     * WHT      CHARACTER            

VALUE                                NEXT     * WHT      CHARACTER            

 

 

 

文件需要 CREATE DIRECTORY 语句

------------------------------------------------------------------------

CREATE DIRECTORY SYS_SQLLDR_XT_TMPDIR_00000 AS 'D:\temp'

 

 

用于外部表的 CREATE TABLE 语句:

------------------------------------------------------------------------

CREATE TABLE "SYS_SQLLDR_X_EXT_TEST_MAIN" 

(

  "ID"NUMBER(38),

  "VALUE"VARCHAR2(10)

)

ORGANIZATION external 

(

  TYPE oracle_loader

  DEFAULT DIRECTORYSYS_SQLLDR_XT_TMPDIR_00000

  ACCESS PARAMETERS 

  (

    RECORDS DELIMITEDBY NEWLINE CHARACTERSET ZHS16GBK

    BADFILE'SYS_SQLLDR_XT_TMPDIR_00000':'test_main_c.bad'

    LOGFILE'test_main_c.log_xt'

    READSIZE 1048576

    FIELDS TERMINATEDBY WHITESPACE LDRTRIM 

    REJECT ROWS WITHALL NULL FIELDS 

    (

      "ID"CHAR(255)

        TERMINATED BYWHITESPACE,

      "VALUE"CHAR(255)

        TERMINATED BYWHITESPACE

    )

  )

  location 

  (

    'test_main_c.dat'

  )

)REJECT LIMIT UNLIMITED;

 

 

用于加载内部表的INSERT 语句:

------------------------------------------------------------------------

INSERT /*+ append */ INTO TEST_MAIN 

(

  ID,

 VALUE

)

SELECT 

 "ID",

 "VALUE"

FROM "SYS_SQLLDR_X_EXT_TEST_MAIN"

 

 

用于清除由以前的语句创建的对象的语句:

------------------------------------------------------------------------

DROP TABLE"SYS_SQLLDR_X_EXT_TEST_MAIN"

DROP DIRECTORY SYS_SQLLDR_XT_TMPDIR_00000

 

星期日 3  13 16:25:27 2011 开始运行

星期日 3  13 16:25:27 2011 处运行结束

 

经过时间为: 00: 00:00.26

CPU 时间为: 00: 00: 00.08

 

 

 SQL Plus 中,执行上面的红色的语句后,外部表就被创建了。

 

SQL> SELECT 

 2    "ID",

 3    "VALUE"

 4  FROM"SYS_SQLLDR_X_EXT_TEST_MAIN";

 

       ID VALUE

---------- ----------

        1 ONE

        2 TWO

 

 

SQL> select * from test_main;

       ID VALUE

---------- ----------

        2 ONE

        3 TWO

 

可以使用 MERGE 来实现,如果有,就更新,如果没有,就插入。

 

SQL> MERGE INTO test_main 

 2  USINGSYS_SQLLDR_X_EXT_TEST_MAIN

 3  ON ( test_main.id =SYS_SQLLDR_X_EXT_TEST_MAIN.id )    -- 条件是 id 相同

 4  WHEN MATCHED THEN UPDATE SET 

 5    test_main.value =SYS_SQLLDR_X_EXT_TEST_MAIN.value   -- 匹配的时候,更新

 6  WHEN NOT MATCHED THEN INSERTVALUES(

 7   SYS_SQLLDR_X_EXT_TEST_MAIN.id, SYS_SQLLDR_X_EXT_TEST_MAIN.value) -- 源表有,目标表没有,插入

 8  ;

 

行已合并。

 

SQL> select * from test_main;

 

       ID VALUE

---------- ----------

        1 ONE

         2 TWO

        3 TWO

 

 

假如需要换个数据文件

例如test_main_c2.dat

SQL> ALTER TABLE"SYS_SQLLDR_X_EXT_TEST_MAIN"

 2    LOCATION( 'test_main_c2.dat');

 

表已更改。

 

SQL> SELECT 

 2    "ID",

 3    "VALUE"

 4  FROM"SYS_SQLLDR_X_EXT_TEST_MAIN"

 5  ;

 

       ID VALUE

---------- ----------

        8 Eight

       10 Ten

 

 

如果需要一次处理多个文件

例如test_main_c.dattest_main_c2.dat

SQL> ALTER TABLE"SYS_SQLLDR_X_EXT_TEST_MAIN"

 2    LOCATION( 'test_main_c.dat', 'test_main_c2.dat');

 

表已更改。

 

SQL> SELECT 

 2    "ID",

 3    "VALUE"

 4  FROM"SYS_SQLLDR_X_EXT_TEST_MAIN"

 5  ;

 

       ID VALUE

---------- ----------

        1 ONE

        2 TWO

        8 Eight

       10 Ten


测试完毕后,清理现场

DROP TABLE"SYS_SQLLDR_X_EXT_TEST_MAIN";

DROP DIRECTORY SYS_SQLLDR_XT_TMPDIR_00000;


阅读(854) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~