4)dw sqlldr
1@@@@parallel sql*loading
 ~drop all index,
 ~diable all constraint and trigger.
 like:
 sqlldr USERID=sh/sh CONTROL=control03.ctl LOG=control03.log DIRECT=true SKIP_INDEX_MAINTENANCE=true &;
 sqlldr USERID=sh/sh CONTROL=control04.ctl LOG=control04.log DIRECT=true SKIP_INDEX_MAINTENANCE=true &;
 sqlldr USERID=sh/sh CONTROL=control05.ctl LOG=control05.log DIRECT=true SKIP_INDEX_MAINTENANCE=true &;

 ~reenable all constraint and trigger, create all index.
 ~summary: one partition for one process at the same time.
  without mess data, it is hard to make lab.


2@@@@transformations using sql*loader
@@@
@@@<1>create table product like previously.
@@@
HR@ocp> conn hr/hr
Connected.
HR@ocp> ed
  1  create table product
  2  (
  3   product_id  varchar2(20),
  4   product_name  varchar2(20),
  5   category     varchar2(20),
  6   cost_price  number(9,2),
  7   sell_price  number(9,2),
  8   weight  number(9,2),
  9   shipping_charge  number(9,2),
 10   manufacturer varchar2(20),
 11   supplier    varchar2(20)
 12* )
HR@ocp> /
Table created.

@@@
@@@<2>write control file, add the transformation
@@@
[oracle@station78 dwdir]$ cat control04.ctl
LOAD DATA
INFILE 'product04.dat' append
INTO TABLE product WHEN product_id != BLANKS
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY "'"
(
 product_id "upper(:product_id)",
 product_name,
 category,
 cost_price,
 weight,
 shipping_charge,
 manufacturer,
 supplier
)

@@@
@@@<3>write the test data
@@@
[oracle@station78 dwdir]$ cat product04.dat
'SP1242', 'CD LX1', 'MUSC', 8.90, 15.67, 2.5, 2.95, 'RTG', 'CD Inc'
'SP1243', 'CD LX2', 'MUSC', 8.91, 15.68, 2.6, 2.97, 'RTG', 'CD Inc'
'SP1244', 'CD LX3', 'MUSC', 8.92, 15.69, 2.7, 2.99, 'RTG', 'CD Inc'
'SP1245', 'CD LX4', 'MUSC', 8.93, 15.70, 2.8, 2.93, 'RTG', 'CD Inc'
'BLANKS', 'CD LX5', 'MUSC', 8.93, 15.70, 2.1, 2.93, 'RTG', 'CD Inc'
' ', 'CD LX6', 'MUSC', 8.95, 15.74, 2.9, 2.93, 'RTG', 'CD Inc'

@@@
@@@<4>run the sqlldr, and inspect the result.
@@@
[oracle@station78 dwdir]$ sqlldr USERID=hr/hr CONTROL=control04.ctl LOG=product04.log \
> BAD=product.bad DISCARD=product.dis  DIRECT=true;
SQL*Loader: Release 10.2.0.1.0 - Production on Thu Aug 23 14:10:08 2012
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
Load completed - logical record count 7.

@@@
[oracle@station78 dwdir]$ cat product.dis
' ', 'CD LX6', 'MUSC', 8.95, 15.74, 2.9, 2.93, 'RTG', 'CD Inc'

@@@
[oracle@station78 dwdir]$ cat product04.log
SQL*Loader: Release 10.2.0.1.0 - Production on Thu Aug 23 13:56:46 2012
Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Control File:   control04.ctl
Data File:      product04.dat
  Bad File:     product.bad
  Discard File: product.dis
 (Allow all discards)

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

Table PRODUCT, loaded when PRODUCT_ID != BLANKS
Insert option in effect for this table: APPEND

   Column Name                  Position   Len  Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
PRODUCT_ID                          FIRST     *   ,  O(') CHARACTER           
    SQL string for column : "upper(:product_id)"
PRODUCT_NAME                         NEXT     *   ,  O(') CHARACTER           
CATEGORY                             NEXT     *   ,  O(') CHARACTER           
COST_PRICE                           NEXT     *   ,  O(') CHARACTER           
WEIGHT                               NEXT     *   ,  O(') CHARACTER           
SHIPPING_CHARGE                      NEXT     *   ,  O(') CHARACTER           
MANUFACTURER                         NEXT     *   ,  O(') CHARACTER           
SUPPLIER                             NEXT     *   ,  O(') CHARACTER           

Record 6: Discarded - failed all WHEN clauses.
Record 7: Discarded - failed all WHEN clauses.

Table PRODUCT:
  5 Rows successfully loaded.
  0 Rows not loaded due to data errors.
  2 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:        2
Total stream buffers loaded by SQL*Loader main thread:        1
Total stream buffers loaded by SQL*Loader load thread:        0

Run began on Thu Aug 23 13:56:46 2012
Run ended on Thu Aug 23 13:56:47 2012

Elapsed time was:     00:00:00.53
CPU time was:         00:00:00.03

@@@
@@@summary: Here, I write the WHEN clause in the control file, the bad file after running sqlldr
@@@do not appear, the discard file appear instead. I am not sure the BLANKS mean a word or a char.