« Cloud y OracleOracle 12c New Features : Comando VALIDATE de RMAN »

Oracle 12c New Features : SQL Loader Express



Siempre lo más complicado de cargar datos mediante SQL Loader, es general el archivo de control.. pues bien, eso hoy tiene una solución rápida y sencilla



Imaginate una situación así.

- Un archivo CSV con la siguiente estructura si lo abrimos mediante un notepad


- Y si lo vemos a través de Microsoft Excel


Pues bien , generar el archivo de control , debería ser algo así

OPTIONS(EXTERNAL_TABLE=EXECUTE, TRIM=LRTRIM)
LOAD DATA
INFILE 'objetos.csv'
APPEND
INTO TABLE OBJETOS
FIELDS TERMINATED BY ","
(
NOMBRE,
EDAD,
DIRECCION
)


Esto podría ser sencillo para un archivo más pequeño, pero imagínense un archivo más grande, con muchos más campos o estructuras más complejas, en esta actividad, en crear el archivo CTL podemos ocupar varias horas, con pruebas y errores.

Pues bien.. desde Oracle 12c, existe una característica que nos permite realizar la carga de un archivo sin necesidad del archivo de control, esta característica se llama SQL LOADER EXPRESS.

¿Cómo funciona? Pues bien, mediante ejemplos probaremos su funcinamiento

- Ejecutamos el comando de la forma más básica

sqlldr usuario/password tabla=nombre_tabla


Con lo anterior , se cumplirá lo siguiente :

- SQL Loader tratará de cargar un archivo llamado nombre_tabla.dat, es lo que buscará mediante la creación de una tabla externa.
- SQL Loader asumirá los campos y tipos que posea la tabla nombre_tabla dentro de nuestra base de datos.
- Se generará por defecto un archivo de control, esto lo podemos ver si buscamos en el archivo nombre_tabla.log
- Si existen registros malos, que no se puedan cargar, se creará por defecto un archivo llamado nombre_tabla.bad
- El formato de las fechas está dado por el seteo NLS existente, el sabrá si se asume YYYY-MM-DD o DD-MM-YYYY.
- Si la tabla posee datos, SQL Loader simplemente cargará los datos al final de los registros existentes (APPEND).

Si quisieramos cargar los datos expuestos en las primeras líneas, simplemente deberíamos ejecutar el comando

sqlldr usuario/pwd table=objetos data=objetos.csv

Y el comando generaría el siguiente archivo de log

SQL*Loader: Release 12.1.0.2.0 - Production on Sáb Ago 22 19:23:49 2015

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

Express Mode Load, Table: OBJETOS
Data File:      objetos.csv
  Bad File:     objetos_%p.bad
  Discard File:  none specified
 
 (Allow all discards)

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

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

   Column Name                  Position   Len  Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
NOMBRE                              FIRST     *   ,       CHARACTER            
EDAD                                 NEXT     *   ,       CHARACTER            
DIRECCION                            NEXT     *   ,       CHARACTER            

Generated control file for possible reuse:
OPTIONS(EXTERNAL_TABLE=EXECUTE, TRIM=LRTRIM)
LOAD DATA
INFILE 'objetos.csv'
APPEND
INTO TABLE OBJETOS
FIELDS TERMINATED BY ","
(
  NOMBRE,
  EDAD,
  DIRECCION
)
End of generated control file for possible reuse.

created temporary directory object SYS_SQLLDR_XT_TMPDIR_00000 for path C:\Hector

enable parallel DML: ALTER SESSION ENABLE PARALLEL DML

creating external table "SYS_SQLLDR_X_EXT_OBJETOS"

CREATE TABLE "SYS_SQLLDR_X_EXT_OBJETOS" 
(
  "NOMBRE" VARCHAR2(100),
  "EDAD" NUMBER,
  "DIRECCION" VARCHAR2(100)
)
ORGANIZATION external 
(
  TYPE oracle_loader
  DEFAULT DIRECTORY SYS_SQLLDR_XT_TMPDIR_00000
  ACCESS PARAMETERS 
  (
    RECORDS DELIMITED BY NEWLINE CHARACTERSET WE8MSWIN1252
    BADFILE 'SYS_SQLLDR_XT_TMPDIR_00000':'objetos_%p.bad'
    LOGFILE 'objetos_%p.log_xt'
    READSIZE 1048576
    FIELDS TERMINATED BY "," LRTRIM 
    REJECT ROWS WITH ALL NULL FIELDS 
    (
      "NOMBRE" CHAR(255),
      "EDAD" CHAR(255),
      "DIRECCION" CHAR(255)
    )
  )
  location 
  (
    'objetos.csv'
  )
)REJECT LIMIT UNLIMITED

executing INSERT statement to load database table OBJETOS

INSERT /*+ append parallel(auto) */ INTO OBJETOS 
(
  NOMBRE,
  EDAD,
  DIRECCION
)
SELECT 
  "NOMBRE",
  "EDAD",
  "DIRECCION"
FROM "SYS_SQLLDR_X_EXT_OBJETOS"

dropping external table "SYS_SQLLDR_X_EXT_OBJETOS"

Table OBJETOS:
  4 Rows successfully loaded.

Run began on Sáb Ago 22 19:23:49 2015
Run ended on Sáb Ago 22 19:23:50 2015

Elapsed time was:     00:00:00.82
CPU time was:         00:00:00.03

La documentación
http://www.oracle.com/technetwork/database/enterprise-edition/learnmore/sqlldr-express-mode-wp-1991038.pdf

Espero les sirva

by Ligarius
22.08.15. 17:33:16. 664 words, 5160 views. Categories: Oracle 12c , • Send a trackback »

Trackback address for this post

Trackback URL (right click and copy shortcut/link location)

No feedback yet

Comments are closed for this post.