Some data storage and transfer media have fixed-length physical records. When the data records are short, more than one can be stored in a single, physical record to use the storage space efficiently.
In this example, SQL*Loader treats a single physical record in the input file as two logical records and uses two INTO
TABLE
clauses to load the data into the emp
table. For example, assume the data is as follows:
1119 Smith 1120 Yvonne 1121 Albert 1130 Thomas
The following control file extracts the logical records:
INTO TABLE emp (empno POSITION(1:4) INTEGER EXTERNAL, ename POSITION(6:15) CHAR) INTO TABLE emp (empno POSITION(17:20) INTEGER EXTERNAL, ename POSITION(21:30) CHAR)
The same record could be loaded with a different specification. The following control file uses relative positioning instead of fixed positioning. It specifies that each field is delimited by a single blank (" ") or with an undetermined number of blanks and tabs (WHITESPACE
):
INTO TABLE emp (empno INTEGER EXTERNAL TERMINATED BY " ", ename CHAR TERMINATED BY WHITESPACE) INTO TABLE emp (empno INTEGER EXTERNAL TERMINATED BY " ", ename CHAR) TERMINATED BY WHITESPACE)
The important point in this example is that the second empno
field is found immediately after the first ename
, although it is in a separate INTO TABLE
clause. Field scanning does not start over from the beginning of the record for a new INTO TABLE
clause. Instead, scanning continues where it left off.
To force record scanning to start in a specific location, you use the POSITION
parameter. That mechanism is described in "Distinguishing Different Input Record Formats" and in "Loading Data into Multiple Tables".