oracle体系-16.2-sql*loader

 sql*loader 原理:

1)将外部数据(比如文本型)导入oracle database。(可用于不同类型数据库数据迁移)

本质是在段(segment 表)重新insert 记录

①conventional:将记录插入到segment的HWM(高水位线)以下的块,要首先访问bitmap ,来确定那些block 有free space

②direct path:将记录插入到segment的HWM(高水位线)以上的从未使用过的块,绕过db_buffer, 不检查约束。还可以关闭redo, 也支持并行操作,加快插入速度。   ###不走sga,直接pga插入数据文件,缺点是需要一次性插入,中间不能出错。

传统插入数据

SQL> create table emp1 as select * from emp where 1=2;

SQL> insert into emp1 select * from emp;   传统方式数据

直接方式数据

SQL> insert /*+ APPEND */ into emp1 select * from emp;   直接方式数据,必须commit后才能查看数据

sql*loader 用法:

SQLLDR keyword=value [,keyword=value,...]

可以看帮助信息$/u01/oracle/bin/sqlldr(回车)

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

外部表示例

使用ORACLE_LOADER引擎建立外部表

步骤1,模拟生成数据源

SQL>select empno||','||ename||','||sal||','||deptno from scott.emp;

步骤2,建立目录,生成平面表(数据源)

$mkdir -p /home/oracle/dir1

$vi /home/oracle/dir1/emp1.dat   粘贴步骤1的查询结果

步骤3,建立directory

名称为dir1指向物理目录/home/oracle/dir1,

SQL>create directory dir1 as '/home/oracle/dir1'; 

将dir1的对象权限授予scott和tim用户。

SQL>grant read,write on directory dir1 to scott,tim;

步骤4,使用ORACLE_LOADER引擎创建外部表emp1_ext

scott:

CREATE TABLE emp1_ext  

(EMPNO      NUMBER(4),

   ENAME       VARCHAR2(10),

   SAL             NUMBER(7,2),

   DEPTNO     NUMBER(2))

  ORGANIZATION EXTERNAL

 (TYPE ORACLE_LOADER 

  DEFAULT DIRECTORY dir1

        ACCESS PARAMETERS (FIELDS TERMINATED BY ",")

          LOCATION ('emp1.dat')

            ) REJECT LIMIT UNLIMITED;

步骤5,验证外部表

SQL> select * from emp1_ext;

使用ORACLE_DATAPUMP引擎导出导入外部表

步骤1,为scott用户建立外部表emp2_ext

数据源是emp.dmp文件,逻辑目录是dir1

SQL> CREATE TABLE emp2_ext 

ORGANIZATION EXTERNAL

( TYPE ORACLE_DATAPUMP  

  DEFAULT DIRECTORY dir1

  LOCATION ('emp2.dmp'))

AS SELECT empno,ename,sal,deptno FROM scott.emp ;

步骤2,验证scott的外部表emp2_ext

SQL> select * from scott.emp2_ext

步骤3,为tim用户建立外部表emp3_ext, 同样读取数据源emp2.dmp

tim:

SQL> CREATE TABLE emp3_ext

   (EMPNO   NUMBER(4),

    ENAME   VARCHAR2(10),

    SAL  NUMBER(7,2),

    DEPTNO NUMBER(2))

ORGANIZATION EXTERNAL   

(  

  TYPE ORACLE_DATAPUMP 

  DEFAULT DIRECTORY dir1

  LOCATION ('emp2.dmp')   

) ;

步骤4,验证tim的外部表emp3_ext

SQL>select * from tim.emp3_ext

使用sqlldr将emp1.dat导入到scott下的emp1

步骤1,建立控制文件

$ vi /home/oracle/dir1/emp1.ctl

load data

infile '/home/oracle/dir1/emp1.dat'

insert              --insert 插入表必须是空表,非空表用append

into table emp1

fields terminated by ','

optionally enclosed by '"'

(empno,ename,sal,deptno)

步骤2,在scott下建立emp1表(内部表),只要结构不要数据

SQL> create table scott.emp1 as select empno,ename,sal,deptno from scott.emp where 1=2;

步骤3ORACLE_LOADER引擎导入(normal方式)

$ cd /home/oracle/dir1

$ sqlldr scott/scott control=emp1.ctl log=emp1.log

步骤4,验证结果

SQL> select * from scott.emp1;

上例的另一种形式是将数据源和控制文件合并在.ctl里描述

[oracle@work sqlldr]$ vi emp.ctl

load data

infile *

append

into table emp1

fields terminated  by   ','

optionally enclosed by '"'

(empno,ename,sal,deptno)

begindata

7369,SMITH,800,20

7499,ALLEN,1600,30

7521,WARD,1250,30

[oracle@prod sqlload]$ sqlldr scott/scott control=emp.ctl log=emp.log

猜你喜欢

转载自www.cnblogs.com/yqp-1/p/12329043.html