oracle sqlldr - ghdrako/doc_snipets GitHub Wiki
load data
infile '<file_path>' optionall enclosed by '"'
truncate into table <tab>
fields terminated by ";"trailing nullcols
(field1,field2,...,field<n>)
Example
create table student(roll_no number(2), name varchar2(20));
cat load_file.csv
1,Mukesh
2,Suresh
3,Rajesh
vi control.ctl
LOAD DATA
INFILE 'load_file.csv'
INSERT INTO TABLE student
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
roll_no,
name
)
sqlldr userid=system/oracle control=control.ctl log=track.log
when you load fixed-width,columnar data is to trim trailing whitespace from each field in the input record. Trimming whitespace is one of the first thing SQL Loader does after reading each record of data.
PRESERVE BLANKS - prevent trimming trailing whitespace. When using PRESERVE BLANKS you'll need to use DEFAULTIF or NULLIF with any INTEGER_EXTERNAL,FLOAT_EXTERNAL,DECIMAL_EXTERNAL
load data
infile '...'
REPLACE PRESERVE BLANKS INTO TABLE X
(
  a POSITION(4) CHAR(44) "RTRIM(:a)"
- 
NULLIF clause- sepcify one or more condition under with a field should be interpreted as a NULL - 
DEFAULTIF clause- sepcify one or more condition under with a field should take on either a null or a zero value depending on whether the fields a character field or a numeric field 
$ sqlldr scott/tiger control=.ctl
NAZWA CHAR(45) "convert(:NAZWA,'WE8ISO8859P1')",
home_points "NVL(:home_points,0)"   
Load Data
APPEND
INTO TABLE MyDataTable
fields terminated by ","     ---- Noticed i omitted the "enclosed by"
TRAILING NULLCOLS
(
  column1 enclosed by '"',   --- Specified "enclosed by" here for all cols
  column2 enclosed by '"',
  HOME_ADD  "replace(:HOME_ADD, chr(34))", -- Omitted "enclosed by".  replace removes all doublequotes in string value.  chr(34) is charcode for doublequote
  column3 optionally enclosed by '"'
  FIRST_NAME "replace(substr(:FIRST_NAME,2, length(:FIRST_NAME)-2), chr(34) || chr(34), chr(34))", -- Omitted "enclosed by".  substr removes doublequotes, replace fixes double quotes showing up twice.  chr(34) is charcode for doublequote
DEPTNO CHAR(255) TERMINATED BY "," OPTIONALLY ENCLOSED BY '"',
  column4 enclosed by '"',
  column5 enclosed by '"'
)
You have to specify the length in your control file if it exceeds 255 bytes. Specify CHAR(4000) in your field description in control
The default length for a CHAR field is 255. Your control file should look something like:
LOAD DATA
INFILE "test.txt"
INTO TABLE TEST replace
fields terminated "|" optionally enclosed by '"' TRAILING NULLCOLS
(
  DOCUMENTID,
  CUSTID,
  USERID ,
  FILENAME,
  LABEL,
  DESCRIPTION CHAR(2000),
  POSTDATE DATE "YYYY-MM-DD HH24:MI:SS" NULLIF POSTDATE=BLANKS,
  USERFILENAME,
  STORAGEPATH
)
- https://docs.oracle.com/database/121/SUTIL/GUID-AEBA1A45-2394-4947-81CB-37CD99BA5BA9.htm
 - https://stackoverflow.com/questions/30615636/sqlloader-does-not-recognize-delimiter-%C2%A5
 - https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-sql-loader-control-file-contents.html#GUID-413DEE17-FA16-4AD7-A5E6-0A6D8BFE0057
 
fields terminated by X'9' optionally enclosed by X'1F'
TRAILING NULLCOLS {…} 
RECORDS DELIMITED BY '\r\n'
Stream records
load data
infile "test3.dat" "str '**DLM**'"
into table T
TRUNCATE
fields terminated by 'XXXXX' optionally enclosed by '"'
(
TEXT
)
LOAD DATA
3    INFILE 'sample.dat'
4    BADFILE 'sample.bad'
5    DISCARDFILE 'sample.dsc'
6    APPEND
7    INTO TABLE emp
8    WHEN (57) = '.'
9    TRAILING NULLCOLS
10  (hiredate SYSDATE,
      deptno POSITION(1:2)  INTEGER EXTERNAL(2)
              NULLIF deptno=BLANKS,
       job    POSITION(7:14)  CHAR  TERMINATED BY WHITESPACE
              NULLIF job=BLANKS  "UPPER(:job)",
       mgr    POSITION(28:31) INTEGER EXTERNAL 
              TERMINATED BY WHITESPACE, NULLIF mgr=BLANKS,
       ename  POSITION(34:41) CHAR 
              TERMINATED BY WHITESPACE  "UPPER(:ename)",
       empno  POSITION(45) INTEGER EXTERNAL 
              TERMINATED BY WHITESPACE,
       sal    POSITION(51) CHAR  TERMINATED BY WHITESPACE
              "TO_NUMBER(:sal,'$99,999.99')",
       comm   INTEGER EXTERNAL  ENCLOSED BY '(' AND '%'
              ":comm * 100"
    )
OPTIONS (ERRORS=100, SILENT=(FEEDBACK))
 LOAD DATA
 INFILE *
REPLACE
INTO TABLE dept
 FIELDS TERMINATED BY ','
 OPTIONALLY ENCLOSED BY '"'
 (recno RECNUM, deptno  CONSTANT "XX", dname, loc, tdate SYSDATE)
LOAD DATA
 INFILE *
TRUNCATE
INTO TABLE loadnums (
col1 position(1:5),
 col2 position(7:16) "TO_NUMBER(:col2,'99,999.99MI')")
 BEGINDATA
 abcde 1,234.99-
 abcde 11,234.34+
 abcde 45.23-
 abcde 99,234.38-
 abcde 23,234.23+
 abcde 98,234.23+
LOAD DATA
 INFILE *
INTO TABLE emp
 REJECT ROWS WITH ALL NULL FIELDS
 (
 empno  POSITION(01:04) INTEGER EXTERNAL,
 ename  POSITION(06:15) CHAR,
 job    POSITION(17:25) CHAR,
 mgr    POSITION(27:30) INTEGER EXTERNAL,
 sal    POSITION(32:39) DECIMAL EXTERNAL,
 comm   POSITION(41:48) DECIMAL EXTERNAL,
 deptno POSITION(50:51) INTEGER EXTERNAL)
BEGINDATA
7781 CLARK      MANAGER   7838 -572.50           10
7839XKING       PRESIDENT      5500.00           10
7934 MILLER     CLERK     7782 -920.00           10
7566 JONES      MANAGER   7839 3123.75           20
7499 ALLEN      SALESMAN  7698 1600.00   300.01  30
7654 MARTIN     SALESMAN  7698 1312.50  1400.00  30
7658 CHAN       ANALYST   7566 3450.00           20
LOAD DATA
 INFILE *
APPEND
INTO TABLE emp
 FIELDS TERMINATED BY ","
 OPTIONALLY ENCLOSED BY '"'
 (<column_name>, <column_name> DATE "DD-Month-YYYY",
 <column_name> CHAR TERMINATED BY ':',
 <column_name> SEQUENCE(MAX,1))
sqlldr scott/tiger control=c: emp\sqlldr02 log=c: emp\ddl_file.txt external_table=generate_only
Assembling Logical Records
CONCATENATE CONCATENATE <number_of_physical_records> 
CONCATENATE 3 
CONTINUEIF CONTINUEIF THIS [PRESERVE] (start_position:end_position) = value 
CONTINUEIF THIS (1:2) = '%%'
CONTINUEIF THIS PRESERVE (1:2) = '%%' 
CONTINUEIF CONTINUEIF NEXT [PRESERVE] (start_position:end_position) = value 
CONTINUEIF NEXT (1:2) = '%%'
CONTINUEIF NEXT PRESERVE (1:2) = '%%' 
CONTINUEIF CONTINUEIF LAST (start_position:end_position) = value 
-- Tests against the last non-blank character.
-- Allows only a single character for the test 
PRESERVE Preserves the CONTINUEIF characters 
"TO_NUMBER(:MyVariable, '9999999999D999999', 'NLS_NUMERIC_CHARACTERS = ''.,''')"
or
set NLS_NUMERIC_CHARACTERS=,. 
!!! NOTE nie zadziala bo sqlldr bedzie mial inna sesje ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ",."
select * from nls_session_parameters;
select * from nls_database_parameters;
alter session set NLS_NUMERIC_CHARACTERS = ',.';
select to_number('100,12') from dual;
alter session set NLS_NUMERIC_CHARACTERS = '.,';
select to_number('100.12') from dual;
$ mknod named_pipe.dat p 
$gzip -dc myfile.gz > named_pipe.dat & sqlldr control=x.ctl 
where x.ctl uses "named_pipe.dat" as the source data
$ mknod npipe p
$ gunzip -c < ascii_file.txt.gz > npipe &
$ sqlldr scott/tiger data=npipe
| Unix | Windows | |
|---|---|---|
| Successful Execution | 0 | 0 | 
| An unrecoverable failure has happened | 1 | 3 | 
| At least one row got rejected | 2 | 2 | 
| Any O/S specific Errors | 3 | 4 | 
To read this exit code and handle it in windows, the following batch script can be used:
---------------begin script ------------------------------
sqlldr userid/pwd CONTROL=load.ctl log=load.log
if errorlevel 0 echo SQL*Loader execution successful
if errorlevel 2 echo SQL*Loader got executed, but atleast some rows got rejected, check the log file.
if errorlevel 3 echo SQL*Loader encountered an unrecoverable failure,check the logfile for more details
if errorlevel 4 echo SQL*Loader execution encountered OS Specific Error
---------------end script ------------------------------
In Oracle 11GR2 the codes are as follows:
EX_SUCC 0
EX_FAIL 1
EX_WARN 2
EX_FTL 4
http://docs.oracle.com/cd/E14072_01/server.112/e10701/ldr_params.htm
Also, errorlevels should be tested in descending order: