Oracle 大容量导入操作之三- 使用外部表

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;


<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(412) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值