Sql Loader es una utilidad que proporciona Oracle para cargar datos a una base de datos desde un fichero externo, normalmente un fichero de texto aunque tambien pueden ser ficheros binarios.
Al SQLLoader ( sqlldr) se le pasan como parametros (los más importanes) el fichero que contiene los datos que se van a cargar y la ruta del fichero de control que contiene las acciones a realizar. El formato de los datos, donde se cargaran y cualquier otro tipo de control.
El archivo de control ( Control file en bárbaro ) es donde se especifica cómo se van a cargar los datos. Normalmente suele responder al siguiente esquema:
LOAD DATA
BADFILE '/a/donde/van/los/datos/malos'
DISCARDFILE '/a/donde/van/los/datos/descartados'
INFILE '/la/ruta/del/archivo/desde/el/que/se/cargan/los/datos'
APPEND
INTO TABLE TU_TABLA_DE_DESTINO
FIELDS TERMINATED BY "|" OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
CAMPO0 POSITION(1:15),
CAMPO1 CHAR "ltrim(rtrim(:CAMPO1))",
CAMPO2 CHAR "ltrim(rtrim(:CAMPO2))",
CAMPO3NUMERICO INTEGER EXTERNAL,
CAMPO4FECHA DATE "DD-Month-YY"
)
Como ves, si los campos tienen una longitud fija puedes especificarle las posiciones, desde el caracter 1 a la 15 y sucesivamente. O si no, puedes dejar que oracle interprete los campos y los inserte. En este caso está introduciondo datos APPEND al final de la tabla. ( Podria ser REPLACE para que reemplazara datos preexistentes). Como puedes imaginar por defecto cada linea es una fila. Y en este ejemplo cada campo está delimitado por el carácter |. TRAILING NULLCOLS sirve para que interprete que los campos sin contenido sean interpretados como NULOS.
Si estas cargando datos con fechas es posible que te cause problemas al intentar insertar columnas con fechas y campos nulos. Una manera de evitarlo es borrar los caracteres en blanco del campo de fecha. Siguiendo el patron:
campo_de_fecha "to_date (ltrim(rtrim(:campo_de_fecha)), 'yyyy-mm-dd hh24:mi')"
Te dejo un ejemplo:
LOAD DATA
APPEND
INTO TABLE art
FIELDS TERMINATED BY "|"
TRAILING NULLCOLS
(
ART_CODE char "ltrim(rtrim(:ART_CODE))",
DESCRIPTION char "ltrim(rtrim(:DESCRIPTION))",
DATOUV "to_date (ltrim(rtrim(:DATOUV)), 'DD-Month-YY')",
DATPEREMPTION "to_date (ltrim(rtrim(:DATPEREMPTION)), 'DD-Month-YY')",
UNIT char "ltrim(rtrim(:UNIT))",
FRNS char "ltrim(rtrim(:FRNS))"
)