aroug biday 2013 - automatizar procesos de etl con pl/sql
DESCRIPTION
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/TRANSCRIPT
![Page 1: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/1.jpg)
1/49
Automatizar procesos de ETL con PL/SQL
Ing. Nelson Calero, [email protected]
AROUG BI Day – 12 de Junio 2013Buenos Aires, Argentina
![Page 2: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/2.jpg)
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
![Page 3: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/3.jpg)
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
![Page 4: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/4.jpg)
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
![Page 5: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/5.jpg)
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.
![Page 6: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/6.jpg)
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)
![Page 7: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/7.jpg)
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
![Page 8: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/8.jpg)
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
![Page 9: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/9.jpg)
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
![Page 10: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/10.jpg)
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
![Page 11: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/11.jpg)
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
![Page 12: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/12.jpg)
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
![Page 13: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/13.jpg)
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;
![Page 14: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/14.jpg)
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)
![Page 15: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/15.jpg)
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
![Page 16: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/16.jpg)
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
![Page 17: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/17.jpg)
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
![Page 18: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/18.jpg)
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)
![Page 19: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/19.jpg)
19/49
Control 1 – Existenciacreate 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;
![Page 20: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/20.jpg)
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"
![Page 21: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/21.jpg)
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
);
![Page 22: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/22.jpg)
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)
![Page 23: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/23.jpg)
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)
![Page 24: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/24.jpg)
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
![Page 25: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/25.jpg)
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
![Page 26: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/26.jpg)
26/49
Ejecución automática
-- calcula la fecha de proxima ejecucion del job de cargacreate 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;
![Page 27: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/27.jpg)
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
![Page 28: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/28.jpg)
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);
![Page 29: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/29.jpg)
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
![Page 30: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/30.jpg)
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
![Page 31: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/31.jpg)
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
![Page 32: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/32.jpg)
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 isBegin 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;
![Page 33: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/33.jpg)
33/49
Procedimiento de carga
-– Procedimiento de carga genéricoProcedure 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 cargaException Rollback de esta tabla Loguear error y continuarEnd;
![Page 34: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/34.jpg)
34/49
Procedimiento de carga
-– Procedimiento de carga globalProcedure p_ejecutar_cargaBegin 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;
![Page 35: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/35.jpg)
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
![Page 36: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/36.jpg)
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
![Page 37: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/37.jpg)
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
![Page 38: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/38.jpg)
38/49
Ejemplo
• Código en crea_pck_load.sql – Revisar e instalar
• Ejecución completa ok y con error – Analizar datos e informes
![Page 39: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/39.jpg)
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
![Page 40: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/40.jpg)
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
![Page 41: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/41.jpg)
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.
![Page 42: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/42.jpg)
42/49
Código completo de carga
• script gen-pck-load.sql– Genera crea_pck_load.sql
• Mucho testing!!
![Page 43: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/43.jpg)
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
![Page 44: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/44.jpg)
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
![Page 45: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/45.jpg)
45/49
Performance – SQL traceoracle@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.
![Page 46: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/46.jpg)
46/49
Performance – SQL traceoracle@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)
![Page 47: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/47.jpg)
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.
![Page 49: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL](https://reader031.vdocuments.pub/reader031/viewer/2022012405/546f9f17b4af9f350b8b45ff/html5/thumbnails/49.jpg)
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.htm#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–
•