SQL*Loader之CASE6

CASE6

1. SQL脚本

[oracle@node3 ulcase]$ cat ulcase6.sql

set termout off
rem host write sys$output "Building case 6 demonstration tables.  Please wait"

drop table emp;

create table emp
       (empno number(4) not null,
        ename char(10),
        job char(9),
        mgr number(4),
        hiredate date,
        sal number(7,2),
        comm number(7,2),
        deptno number(2));

create unique index empix on emp(empno);

exit

2. 控制文件

[oracle@node3 ulcase]$ cat ulcase6.ctl

-- Copyright (c) 1991, 2004 Oracle.  All rights reserved.
-- NAME
-- ulcase6.ctl - SQL*Loader Case Study 6: Loading Data Using the
-- Direct Path Load Method
--
-- DESCRIPTION
-- This case study demonstrates the following:
-- Use of the direct path load method to load and index data.
--
-- How to specify the indexes for which the data is presorted.
--
-- Use of the NULLIF clause.
--
-- Loading all-blank numeric fields as NULL.
--
-- TO RUN THIS CASE STUDY:
-- 1. Before executing this control file, log in to SQL*Plus as
--    scott/tiger. Enter @ulcase6 to execute the SQL script for
--    this case study. This prepares and populates tables and
--    then returns you to the system prompt.
--
-- 2. At the system prompt, invoke the case study as follows:
-- sqlldr USERID=scott/tiger CONTROL=ulcase6.ctl LOG=ulcase6.log DIRECT=TRUE
--
-- NOTES ABOUT THIS CONTROL FILE
-- The SORTED INDEXES statement identifies the indexes on which
-- the data is sorted. This statement indicates that the datafile
-- is sorted on the columns in the empix index. It allows
-- SQL*Loader to optimize index creation by eliminating the sort
-- phase for this data when using the direct path load method.
--
-- The NULLIF...BLANKS clause specifies that the column should
-- be loaded as NULL if the field in the datafile consists of
-- all blanks.
--
LOAD DATA
INFILE 'ulcase6.dat'
REPLACE
INTO TABLE emp
SORTED INDEXES (empix)
(empno POSITION(1:4),
ename POSITION(6:15),
job POSITION(17:25),
mgr POSITION(27:30) NULLIF mgr=blanks,
sal POSITION(32:39) NULLIF sal=blanks,
comm POSITION(41:48) NULLIF comm=blanks,
deptno POSITION(50:51) NULLIF empno=blanks)

3. 数据文件

[oracle@node3 ulcase]$ cat ulcase6.dat

7499 ALLEN      SALESMAN  7698  1600.00   300.00 30
7566 JONES      MANAGER   7839  3123.75          20
7654 MARTIN     SALESMAN  7698  1312.50  1400.00 30
7658 CHAN       ANALYST   7566  3450.00          20
7782 CLARK      MANAGER   7839  2572.50          10
7839 KING       PRESIDENT       5500.00          10
7934 MILLER     CLERK     7782   920.00          10

执行后结果:

[oracle@node3 ulcase]$ sqlplus scott/tiger @ulcase6.sql

[oracle@node3 ulcase]$ sqlldr userid=scott/tiger control=ulcase6.ctl direct=yes

--注意,上述命令多了一个参数direct=yes,代表直接路径插入

SQL> select * from emp;

EMPNO ENAME     JOB         MGR  HIREDATE     SAL  COMM  DEPTNO
----- ---------- --------- ----- --------- ------- ----- ------
 7499 ALLEN     SALESMAN   7698               1600   300     30
 7566 JONES     MANAGER    7839               3124           20
 7654 MARTIN    SALESMAN   7698               1313  1400     30
 7658 CHAN      ANALYST    7566               3450           20
 7782 CLARK     MANAGER    7839               2573           10
 7839 KING      PRESIDENT                     5500           10
 7934 MILLER    CLERK      7782               920            10

7 rows selected.

查看日志文件:

[oracle@node3 ulcase]$ vim ulcase6.log 

SQL*Loader: Release 11.2.0.1.0 - Production on Fri Sep 19 02:49:21 2014

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

Control File:   ulcase6.ctl
Data File:      ulcase6.dat
  Bad File:     ulcase6.bad
  Discard File:  none specified
 
 (Allow all discards)

Number to load: ALL
Number to skip: 0
Errors allowed: 50
Continuation:    none specified
Path used:      Direct

Table EMP, loaded from every logical record.
Insert option in effect for this table: REPLACE

   Column Name                  Position   Len  Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
EMPNO                                 1:4     4           CHARACTER            
ENAME                                6:15    10           CHARACTER            
JOB                                 17:25     9           CHARACTER            
MGR                                 27:30     4           CHARACTER            
    NULL if MGR = BLANKS
SAL                                 32:39     8           CHARACTER            
    NULL if SAL = BLANKS
COMM                                41:48     8           CHARACTER            
    NULL if COMM = BLANKS
DEPTNO                              50:51     2           CHARACTER            
    NULL if EMPNO = BLANKS

The following index(es) on table EMP were processed:
index SCOTT.EMPIX loaded successfully with 7 keys

Table EMP:
  7 Rows successfully loaded.
  0 Rows not loaded due to data errors.
  0 Rows not loaded because all WHEN clauses were failed.
  0 Rows not loaded because all fields were null.

Bind array size not used in direct path.
Column array  rows :    5000
Stream buffer bytes:  256000
Read   buffer bytes: 1048576

Total logical records skipped:          0
Total logical records read:             7
Total logical records rejected:         0
Total logical records discarded:        0
Total stream buffers loaded by SQL*Loader main thread:        1
Total stream buffers loaded by SQL*Loader load thread:        0

Run began on Fri Sep 19 02:49:21 2014
Run ended on Fri Sep 19 02:49:27 2014

Elapsed time was:     00:00:06.66
CPU time was:         00:00:01.27

 注意:在本例中

     1> SORTED INDEXES (empix)指明数据文件的数据是按照索引empix对应的列排过序的,只有在直接路径插入下有效,即sqlldr命令中需指明direct=yes,这样可极大提高插入效率。

     2> NULLIF...BLANKS子句指明列对应数据文件的位置如果是空格的话,当null处理。

原文地址:https://www.cnblogs.com/ivictor/p/3981384.html