Diese Präsentation wurde erfolgreich gemeldet.
Die SlideShare-Präsentation wird heruntergeladen. ×

AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Hier ansehen

1 von 49 Anzeige

AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

Herunterladen, um offline zu lesen

Presentación dada en BI DAY 2013 organizado por el grupo de usuarios Oracle de Argentina (AROUG) el 12 de junio de 2013.
Difusión del evento: http://aroug.org/2013/05/bi-day-reserva-tu-lugar/

Presentación dada en BI DAY 2013 organizado por el grupo de usuarios Oracle de Argentina (AROUG) el 12 de junio de 2013.
Difusión del evento: http://aroug.org/2013/05/bi-day-reserva-tu-lugar/

Anzeige
Anzeige

Weitere Verwandte Inhalte

Diashows für Sie (19)

Ähnlich wie AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL (20)

Anzeige

Weitere von Nelson Calero (20)

Aktuellste (20)

Anzeige

AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

  1. 1. 1/49 Automatizar procesos de ETL con PL/SQL Ing. Nelson Calero, OCP nelson.calero@awen.com.uy AROUG BI Day – 12 de Junio 2013 Buenos Aires, Argentina
  2. 2. 2/49 Nelson Calero • http://www.linkedin.com/in/ncalero • Ingeniero en Computación. OCP DBA 10g. Especializado en RAC • Trabajando con herramientas Oracle y entorno linux desde 1996 • DBA Oracle (desde 2001) & MySQL (desde 2005) • Instructor de Oracle University desde 2011 • Co-fundador y Presidente del Grupo de Usuarios Oracle de Uruguay (UYOUG) desde 2009 • Orador frecuente en eventos como el Oracle OpenWorld Latinoamérica, Collaborate, OTN Tour Uruguay, JIAP, MySQL Argentina • Co-fundador y director de Awen Consulting
  3. 3. 3/49 Objetivo 1) Implementar de solución para cargar datos de archivos de texto a Oracle, automatizando todo lo posible, incluyendo: a) Manejo de excepciones b) Evitar cargas duplicadas (y más controles) c) Ejecución automática d) Informe del resultado de ejecución e) Retoma de carga fallidas 2) Ver detalles de – Instalación – Mantenimiento – Performance
  4. 4. 4/49 Alternativas • Herramientas ETL – Warehouse Builder – Kettle – open source, kettle.pentaho.com • Programar usando lenguaje/framework con JDBC/ODBC – C, java, perl, python, ... • Scripts sobre funcionalidades propias de Oracle – SQL*Loader – Tablas externas – Funciones pipeline
  5. 5. 5/49 ¿Que vamos a usar? • Oracle Standard Edition 11.2 (>=9i) • PL/SQL • Jobs en la base de datos • Tablas externas • Archivos con datos en texto plano visibles en un directorio del servidor de base de datos • NOTA1 : solución “old school” NOTA2 : vamos a ver una solución de ejemplo basado en las definiciones mostradas. Hay otras formas de implementar lo mismo, dependiendo de la conveniencia de usar estas definiciones.
  6. 6. 6/49 Tablas externas CREATE TABLE.. ORGANIZATION EXTERNAL.. LOCATION ('archivo.txt') • Disponible desde la versión 9i • Acceso solo lectura con driver ORACLE_LOADER, lectura/escritura con driver ORACLE_DATAPUMP • No ocupa espacio en la base de datos. Es metadata del archivo • Permite paralelismo (tipos de datos no variables) • El archivo debe ser accesible desde el servidor de BD • Parámetros de acceso por defecto optimizados • Desde 11.2 (y 11.1.0.7) puede ejecutar comando para pre-procesar antes de leer (ej : gzip)
  7. 7. 7/49 Ejemplo CREATE TABLE dw.paises_txt ( country_code VARCHAR2(2), country_name VARCHAR2(40), country_number VARCHAR2(3) ) ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER DEFAULT DIRECTORY datos ACCESS PARAMETERS ( RECORDS DELIMITED BY NEWLINE PREPROCESSOR exec:'zcat' FIELDS TERMINATED BY ';' MISSING FIELD VALUES ARE NULL ( country_code CHAR(2), country_name CHAR(40), country_number CHAR(3) ) ) LOCATION ('paises.txt.gz') ) REJECT LIMIT UNLIMITED; paises.txt – columnas separadas por coma
  8. 8. 8/49 Ejemplo CREATE TABLE dw.paises_txt ( country_code VARCHAR2(2), country_name VARCHAR2(40), country_number VARCHAR2(3) ) ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER DEFAULT DIRECTORY datos ACCESS PARAMETERS ( RECORDS DELIMITED BY NEWLINE PREPROCESSOR exec:'zcat' FIELDS TERMINATED BY ';' MISSING FIELD VALUES ARE NULL ( country_code CHAR(2), country_name CHAR(40), country_number CHAR(3) ) ) LOCATION ('paises.txt.gz') ) REJECT LIMIT UNLIMITED; paises.txt – columnas separadas por coma
  9. 9. 9/49 Ejemplo CREATE TABLE dw.paises_txt ( country_code VARCHAR2(2), country_name VARCHAR2(40), country_number VARCHAR2(3) ) ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER DEFAULT DIRECTORY datos FIELDS ( country_code POSITION(01:02) CHAR, country_name POSITION(03:42) CHAR, country_number POSITION(43:45) CHAR ) ) LOCATION ('paises-pos.txt') ) REJECT LIMIT UNLIMITED; paises-pos.txt – columnas de ancho fijo
  10. 10. 10/49 Tablas externas • Directorios : – CREATE OR REPLACE DIRECTORY datos AS '/DW/datos'; – CREATE OR REPLACE DIRECTORY exec AS '/DW/bin'; – GRANT read,write ON DIRECTORY datos TO dw; – GRANT read,execute ON DIRECTORY exec TO dw; • ACCESS Parameters: muchos. similares a SQL*Loader • Se generan archivos de log y rechazos en cada SELECT – tabla_PID.log / tabla_PID.bad – Configurable con : badfile/logfile datos:archivo
  11. 11. 11/49 Tablas externas • Vista DB_EXTERNAL_LOCATIONS: SYS@XE> select * from dba_external_locations; OWNER TABLE_NAME LOCATION DIR DIRECTORY_NAME ---------- -------------------- ----------------- --- --------------- DW PAISES_GZ_TXT paises.txt.gz SYS DATOS DW PAISES_POS_TXT paises-pos.txt SYS DATOS DW PAISES_TXT paises-big.txt SYS DATOS DW DT_CONTROL_TXT DT_CONTROL.TXT SYS DATOS DW PAISES_NUM_TXT paises-big.txt SYS DATOS
  12. 12. 12/49 A tener en cuenta • Tablas externas con columnas DATE puede generar excepciones al leer – FECHA_ALTA POSITION (46:59) DATE "YYYY-MM-DD-HH24-MI-SS" • Registros de ancho variable no permiten paralelismo • Transformaciones se instrumentan en el select • Migrar de SQL*Loader con opcion en el controlfile – options (external_table=generate_only) – en logfile genera creación de Directory y TE, y ejemplo de insert • TE en RAC: usando ocfs2 o DBFS (desde 11.2) • Se pueden cargar LOBs – nombre de archivos en registros – archivo por cada lob – clausula COLUMN TRANSFORMS en TE
  13. 13. 13/49 LOBs CREATE TABLE dw.lob_tab ( Datos VARCHAR2(100), datos_clob CLOB, datos_blob BLOB ) ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER DEFAULT DIRECTORY datos ACCESS PARAMETERS ( RECORDS DELIMITED BY NEWLINE FIELDS TERMINATED BY ';' MISSING FIELD VALUES ARE NULL ( datos CHAR(100), archivo_clob CHAR(100), archivo_blob CHAR(100) ) COLUMN TRANSFORMS (datos_clob FROM LOBFILE (archivo_clob) FROM (datos) CLOB, datos_blob FROM LOBFILE (archivo_blob) FROM (datos) BLOB) ) LOCATION ('lob-datos.txt') ) REJECT LIMIT UNLIMITED;
  14. 14. 14/49 Tablas externas • Ejemplos – select/insert (ej1.sql) – Cargar LOBs con TE (ej-lob.sql) – Modificar atributos (ej2.sql) – Casos de error (ej3.sql)
  15. 15. 15/49 Tablas externas • Ejemplos – select/insert (ej1.sql) – Cargar LOBs con TE (ej-lob.sql) – Modificar atributos (ej2.sql) – Casos de error (ej3.sql) • Error de formato en datos filtrados por tabla externa van al archivo de rechazos (badfile) • Error de formato en datos no detectados en la tabla externa generan error SQL al manipularlo
  16. 16. 16/49 Manejo de errores (ej4.sql) BEGIN Insert into DW.tabla Select * from tabla_txt; EXCEPTION WHEN others THEN --- capturamos errores de acceso a la tabla externa *y* de SQL al insertar IF DBMS_UTILITY.FORMAT_ERROR_STACK LIKE '%KUP-04040%' THEN dbms_output.put_line ('# no existe archivo para TABLA'); ELSIF DBMS_UTILITY.FORMAT_ERROR_STACK LIKE '%ORA-30653%' THEN dbms_output.put_line ('# ERROR: problemas en datos de TABLA'); ELSE dbms_output.put_line ('# ERROR procesando TABLA'); Raise; END IF; END; Códigos de error: http://docs.oracle.com/cd/B19306_01/server.102/b14219/kupus.htm
  17. 17. 17/49 Objetivos (repaso) Cargar datos en archivos de texto a Oracle, automatizando todo lo posible, incluyendo: a) Manejo de excepciones b) Evitar cargas duplicadas (y más controles) c) Ejecución automática d) Informe del resultado de ejecución e) Retoma de carga fallidas
  18. 18. 18/49 Controles posibles Algunos imprescindibles: 1) Existencia de archivos a cargar (ej-lanza.sql) – Archivo de control indicando nuevos datos (p.ej: hay_datos.txt) – utl_file.fgetattr('DATOS',l_archivo,l_existe,l_size,l_blk_size); 2) Datos en archivo coincida con datos esperados (fecha) 3) Evitar cargas duplicadas 4) Cantidad de registros en archivo sean los esperados 5) Suma de una columna coincida con la esperada (u otra operación arbitraria)
  19. 19. 19/49 Control 1 – Existencia create or replace procedure p_job_carga as declare ex BOOLEAN; flen NUMBER; bsize NUMBER; v_archivo VARCHAR2(50) := 'HAY_DATOS.TXT'; v_dir VARCHAR2(50) := 'DATOS'; BEGIN dbms_output.enable; utl_file.fgetattr(v_dir, v_archivo, ex, flen, bsize); IF ex THEN -- existe archivo, se ejecuta carga y se quita marca de procesar p_ejecutar_carga; utl_file.fremove(v_dir, v_archivo); else DBMS_OUTPUT.PUT_LINE('No se procesan datos, no existe archivo '||v_archivo); END IF; p_registro_informe; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE ('ERROR en la ejecución del job'); DBMS_OUTPUT.PUT_LINE (SQLERRM); p_registro_informe; END;
  20. 20. 20/49 Control 2 Datos en archivo coincida con datos esperados – Objetivo: Detectar error en manipulación de archivos de datos por operadores – Fecha (o identificación) en los datos – Archivo de control para validar : DT_CONTROL.TXT CREATE TABLE "DW"."DT_CONTROL" ( "FECHA_DATOS" DATE, "TABLA" VARCHAR2(100), "NUM_REG" NUMBER(15), "COL_CTL" VARCHAR2(100), "TOT_CTL" NUMBER(15) ); • Tabla externa DT_CONTROL_TXT • Esta tabla se borra con cada nueva carga – Mantenemos historia luego de cargas exitosas: "DW"."DT_CONTROL_HIST"
  21. 21. 21/49 Control 3 Evitar cargas duplicadas – Por archivo o global. Si permitimos cargas parciales (algún archivo da error y pero se cargan el resto) es por archivo => Fecha_dato en el archivo de datos • como nueva columna => mucha redundancia • como primer registro => select * from tabla_txt where rownum=1 skip=1 para siguiente select (alter table..) – Tabla de Log de cargas anteriores: se valida que la fecha actual no exista CREATE TABLE "DW"."LOG_CARGA" ( "FECHA_CARGA" DATE, "TABLA" VARCHAR2(255), "FECHA_DATOS" DATE );
  22. 22. 22/49 Control 4 create table tabla_bad_ext ( text1 varchar2(4000) , text2 varchar2(4000) ) organization external (type oracle_loader default directory datos access parameters ( records delimited by newline Fields missing field values are null ( text1 position(1:4000), text2 position(4001:8000) ) ) location ('tabla.bad') ) select count(*) from tabla_bad_ext; Cantidad de registros en archivo sean los esperados – Primer registro de datos o información adicional fuera de los datos (archivo de control, usado para control 2) – Se puede validar el total cargado con ese valor, o buscar existencia de rechazos (.bad)
  23. 23. 23/49 Control 5 • Suma de una columna coincida con la esperada (u otra operación arbitraria) – Permite identificar errores en la generación del archivo de datos (p.ej: columnas fuera de orden o con datos inválidos)
  24. 24. 24/49 Objetivos (repaso) Cargar datos en archivos de texto a Oracle, automatizando todo lo posible, incluyendo: a) Manejo de excepciones b) Evitar cargas duplicadas (y más controles) c) Ejecución automática d) Informe del resultado de ejecución e) Retoma de carga fallidas
  25. 25. 25/49 Ejecución automática • Agendar job que lance la carga variable v_job number; exec dbms_job.submit (:v_job, 'p_job_carga;', sysdate, 'f_intervalo'); commit; • Reintentar durante N días – Función en next_date f_intervalo
  26. 26. 26/49 Ejecución automática -- calcula la fecha de proxima ejecucion del job de carga create or replace function dw.f_intervalo return date is v_mes date := trunc(sysdate,'MON'); begin if trunc(sysdate) between v_mes+3 and v_mes+13 then – entre el 4 y 14 return trunc(sysdate)+1+1/24; -- dia siguiente a la 1:00 am elsif trunc(sysdate) > v_mes+13 then – después del 14 -- mes siguiente día 4 a la 1:00 am return add_months(trunc(sysdate,'MON')+3, 1) + 1/24; Else – antes del 4 return trunc(sysdate,'MON')+3 + 1/24; -- 10 del mes actual a la 1:00 am end if; End;
  27. 27. 27/49 Crear informe • Varias alternativas – Generar datos en tabla temporal de log al cargar cada tabla, select como último paso – Spool en sqlplus – Escribir archivo en el servidor con paquete UTL_FILE • En lugar de insertar en tabla de log/spool • Capturar salida de dbms_output. Sirve para encapsular código ya existente, y es práctico para testear. Límite de 1Mb en 9.2, ilimitado desde 10.2 – Buena discusión de opciones: http://asktom.oracle.com/pls/asktom/f? p=100:11:0::::P11_QUESTION_ID:146412348066
  28. 28. 28/49 Informe con dbms_output (ej-informe.sql) archivo := 'informe_carga_'||to_char(sysdate,'yyyymmdd')||'.log'; output_file := utl_file.fopen ('DATOS', archivo, 'A'); loop status := max_lines; DBMS_OUTPUT.GET_LINES ( output_table, status); FOR linenum in 1..status LOOP BEGIN utl_file.put_line (output_file, NVL (output_table(linenum),'<null>')); EXCEPTION WHEN OTHERS THEN utl_file.put_line (output_file, 'Error: linea '||linenum||' -'||sqlerrm); END; END LOOP; exit when status < max_lines; -- no quedan mas lineas por leer end loop; utl_file.fclose(output_file);
  29. 29. 29/49 Objetivos (repaso) Cargar datos en archivos de texto a Oracle, automatizando todo lo posible, incluyendo: a) Manejo de excepciones b) Evitar cargas duplicadas (y más controles) c) Ejecución automática d) Informe del resultado de ejecución e) Retoma de carga fallidas
  30. 30. 30/49 Retoma de fallas Simplificando el procedimiento de carga: – Controlar datos tabla1 – Cargar tabla1 – Manejo excepciones1 – Controlar datos tabla2 – Cargar tabla2 – Manejo excepciones2 – … – Controlar datos tablaN – Cargar tablaN – Manejo excepcionesN
  31. 31. 31/49 Procedimiento de carga Para evitar repetir código: – Control de datos genérico – Uso de tabla de configuración (CARGA_DEF). indica que tablas hay que cargar: • Nombre de tabla destino • Nombre de tabla externa • Tipo de carga (incremental o reemplazo) • Columna usada para control de fecha • Columna usada para control de suma
  32. 32. 32/49 Procedimiento de carga -– Función para controlar integridad de archivos a cargar function f_control (p_tabla in varchar2, p_fecha_dato out number, p_replace out boolean) return number is Begin Lee dt_carga_def Controla fecha de datos sea la fecha a cargar Si tipo_carga = APPEND Controla que no hayan datos de esa fecha cargados Valida cantidad de registros en archivo sean los indicados Valida columna de suma (si se indica) Retorna #registros (codigos de error son negativos) End;
  33. 33. 33/49 Procedimiento de carga -– Procedimiento de carga genérico Procedure p_carga_generica (p_tabla in varchar2, p_tabla_txt in varchar2) Begin v_reg_ctl := f_control (p_tabla, v_fecha, v_replace); Si v_reg_ctl > 0 (éxito) Si carga REPLACE => truncar tabla Execute immediate 'insert /*+ APPEND */ … select * from TE' Validar #registros insertados sean los indicados Registrar carga en tabla de log Archivar (historia) registro de carga Exception Rollback de esta tabla Loguear error y continuar End;
  34. 34. 34/49 Procedimiento de carga -– Procedimiento de carga global Procedure p_ejecutar_carga Begin Cargar registros de control (desde TE. Indica tablas a cargar y valores p/control) Validar que no se haya hecho una carga completa igual Por cada tabla configurada para cargar Si no hubo carga anterior incompleta de esta tabla p_carga_generica (tabla); End;
  35. 35. 35/49 Objetivos (repaso) Cargar datos en archivos de texto a Oracle, automatizando todo lo posible, incluyendo: a) Manejo de excepciones b) Evitar cargas duplicadas (y más controles) c) Ejecución automática d) Informe del resultado de ejecución e) Retoma de carga fallidas
  36. 36. 36/49 Ejecución completa Rutinas involucradas: • Job en la base – f_next_date – p_job_carga • p_registro_informe • p_ejecutar_carga – f_control – p_carga_generica
  37. 37. 37/49 Instalación • Directorio de datos – Creación en file system – Permisos de acceso para Oracle, y a los archivos – Creación de directorio en Oracle y permisos • Creación de tablas externas para las tablas de datos • Creación de tabla de control y externa • Creación de tabla de definiciones – Cargar definiciones • Creación de procedimientos de carga • Creación de rutinas auxiliares para job • Creación de job
  38. 38. 38/49 Ejemplo • Código en crea_pck_load.sql – Revisar e instalar • Ejecución completa ok y con error – Analizar datos e informes
  39. 39. 39/49 ¿Cargar nuevas tablas? • Debemos: – Crear nueva tabla destino – Crear nueva tabla externa – Agregar registro de configuración – Agregar código pl/sql para carga • Se puede automatizar generando el código de ambos
  40. 40. 40/49 Generar código declare cursor c_cols is select owner, table_name from dw.dw_carga_def where owner=v_owner order by table_name; procedure p (p_str in varchar2) is begin insert into gen_aux values (s_orden.nextval, p_str); end; Begin p('create or replace package '||v_owner||'.k_carga is'); for r_cols in c_cols loop p(' procedure p_'||r_cols.table_name||';'); end loop; ... End; set linesize 120 pagesize 0 set trimspool on set feedback off spool /tmp/archivo.sql select dato from gen_aux order by orden; spool off
  41. 41. 41/49 Ejemplo: crear las TE • script PL/SQL: gen-tab-txt.sql – Genera crea_tab_txt.sql • Datos delimitados. Para posicionales o con formatos especiales hay que ajustar el código.
  42. 42. 42/49 Código completo de carga • script gen-pck-load.sql – Genera crea_pck_load.sql • Mucho testing!!
  43. 43. 43/49 Performance Recomendaciones – Definir tipo de datos en la TE para evitar transformaciones de datos en SQL que impactan en la performance – Si hay columnas DATE en la TE, usar DATE_CACHE grande – Insertar en modo Direct Path: insert /*+ APPEND */ ... – Paralelismo es útil: • Disponible en versión Enterprise. • Hay que evaluar capacidad del storage para no saturarlo. • No es necesario separar el archivo de datos • Se habilita con la cláusula “PARALLEL N” en la creación de la TE – Optimizar el acceso a archivos de datos • si es un mapeo de red, validar enlace • no competir con acceso a datafiles
  44. 44. 44/49 Performance ¿Qué hacer si las cargas son lentas? – Tablas con pocos índices y muchos datos existentes: deshabilitar índices antes de cargar – Muchos índices y muchos datos son un problema – Particionamiento puede ser útil con índices locales. Es mas útil para tareas de mantenimiento posteriores (p.ej: quitar datos obsoletos) cuando las consultas lo permiten – Si hay funciones de transformación, analizar peformance individual – Ante dudas, SQL Trace revela donde está el problema
  45. 45. 45/49 Performance – SQL trace oracle@oraculo:/DW> sqlplus / as sysdba SQL*Plus: Release 11.2.0.2.0 Production on Wed Jun 12 01:43:22 2013 Copyright (c) 1982, 2010, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options 01:43:22 SYS@ent11g>select value from v$diag_info where name='Default Trace File'; VALUE ------------------------------------------------------------------- /u01/app/oracle/diag/rdbms/ent11g/ent11g/trace/ent11g_ora_8683.trc 01:43:26 SYS@ent11g>alter session set sql_trace=true; Session altered. 01:43:28 SYS@ent11g>select count(*) from dw.paises_pos_txt; COUNT(*) ---------- 239 01:43:31 SYS@ent11g>exit oracle@oraculo:/DW> tkprof /u01/app/oracle/diag/rdbms/ent11g/ent11g/trace/ent11g_ora_8683.trc /tmp/pp.txt TKPROF: Release 11.2.0.2.0 - Development on Wed Jun 12 01:44:02 2013 Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
  46. 46. 46/49 Performance – SQL trace oracle@oraculo:/DW> less /tmp/pp.txt ... SQL ID: cmzwfgsvz52pq Plan Hash: 3582886107 select count(*) from dw.paises_pos_txt call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.00 0.00 0 0 0 0 Execute 1 0.00 0.01 0 24 0 0 Fetch 2 0.00 0.00 0 0 0 1 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 4 0.00 0.02 0 24 0 1 Misses in library cache during parse: 0 Optimizer mode: ALL_ROWS Parsing user id: SYS Number of plan statistics captured: 1 Rows (1st) Rows (avg) Rows (max) Row Source Operation ---------- ---------- ---------- --------------------------------------------------- 1 1 1 SORT AGGREGATE (cr=64 pr=0 pw=0 time=23669 us) 4 4 4 PX COORDINATOR (cr=64 pr=0 pw=0 time=17062 us) 0 0 0 PX SEND QC (RANDOM) :TQ10000 (cr=0 pr=0 pw=0 time=0 us) 0 0 0 SORT AGGREGATE (cr=0 pr=0 pw=0 time=0 us) 0 0 0 PX BLOCK ITERATOR (cr=0 pr=0 pw=0 time=0 us cost=8 size=0 card=8168) 0 0 0 EXTERNAL TABLE ACCESS FULL PAISES_POS_TXT (cr=0 pr=0 pw=0 time=0 us cost=8 size=0 card=8168)
  47. 47. 47/49 Conclusiones • Esta solución requiere un esfuerzo inicial grande. Para pocas tablas y sin expectativas de modificaciones futuras, puede ser una complejidad excesiva. • Desarrollo necesita dominio de PL/SQL. El mantenimiento puede realizarlo un operador. • Esta implementación es de una solución en producción. Tomó unas 60 horas su desarrollo y puesta en funcionamiento en tres sistemas de la misma empresa. • Si se tienen varias cargas distintas para automatizar, se gana mucho tiempo al generar el código a partir de la configuración.
  48. 48. 48/49 ¿Preguntas? nelson.calero@awen.com.uy
  49. 49. 49/49 Referencias • External table concepts 11.2 (utilities guide) http://docs.oracle.com/cd/E11882_01/server.112/e22490/et_concepts.htm • Managing external tables 11.2 (admin guide) http://docs.oracle.com/cd/E24693_01/server.11203/e17120/tables013.h tm#ADMIN01507 • Loading and Transformation 11.2 (DW guide) http://docs.oracle.com/cd/E24693_01/server.11203/e16579/transform. htm#DWHSG8312 • Usos interesantes de tablas externas con preproceso: – listing files with the external table preprocessor in 11g http://www.oracle-developer.net/display.php?id=513 – profiling trace files in 11g http://www.oracle-developer.net/display.php?id=516 –

×