You are on page 1of 29

TABLAS EXTERNAS

Indice

1.- Visin General 2.- Aplicaciones y beneficios de las Tablas Externas 3.- Historia y Evolucin (9i, 10g, 11gR2) 4.- Sintaxis y uso 4.1 Creacin y modificacin 4.2 Uso del Driver ORACLE_LOADER 4.3 Uso del Driver ORACLE_DATAPUMP 4.4 Definir tablas externas con SQL*Loader 4.5 Uso con un preprocesador 4.6 Privilegios 4.7 Vistas del Diccionario. 5.- Transformacin de datos PIPELINED, usando tablas externas

1.- Visin General Las tablas externas son tablas cuyos datos se almacenan fuera de la base de datos en ficheros planos o binarios. Complementan la funcionalidad de carga de datos de SQL*Loader, o de transmisin de datos/carga de DATAPUMP. Son similares a las tablas SQL normales, pero no residen en la base de datos, por lo tanto su organizacin es externa. Se pueden consultar directamente y tambin en paralelo usando SQL. De hecho, la tabla externa acta como una vista. Los metadatos de la tabla externa, son creados en el diccionario de la base de datos usando la sentencia CREATE TABLE ORGANIZATION EXTERNAL. No se permiten operaciones de manipulacin de datos en la misma (DML), ni tampoco creacin de ndices sobre sus datos. Los datos existen fuera de la base de datos. Una vez que la definicin de la tabla externa (metadatos) exista en el diccionario, puede ser seleccionada, incluso en paralelo, producindose entonces el proceso de extraccin de las fuentes externas, especificadas en los metadatos de la misma. Se puede realizar una operacin de tipo CREATE TABLE tabla_convencional AS SELECT FROM tabla_externa , permitiendo una variacin del proceso de extraccin y carga. Tambin podemos extraer datos de tablas convencionales y rellenar una tabla externa de tipo DATAPUMP (unload), mover el/los ficheros donde estos datos externos han sido creados y crear los metadatos de esa tabla externa en otra base de datos diferente, facilitando el proceso de transmisin/carga de datos entre bases de datos. Para poder usarlas, es preciso conocer el formato de los ficheros de texto y de los registros que la componen, si el driver que utilizamos es ORACLE_LOADER. Si utilizamos ficheros binarios, es preciso conocer ORACLE_DATAPUMP.

2.- Aplicaciones y beneficios de las Tablas Externas Las tablas externas, nos permiten usar datos externos como si fueran una tabla virtual, y por lo tanto pueden ser consultadas o unidas a tablas normales, sin necesidad de cargar sus datos en tablas convencionales o tablas intermedias. Es decir, cada vez que son accedidas, la informacin se almacena en memoria de usuario (PGA). Veamos algunas caractersticas: - El paralelismo transparente, no est limitado por el nmero de ficheros que lee la tabla externa. - No es preciso almacenar los datos en reas intermedias o de stage para las aplicaciones de tipo ETL en los datawarehouse. - Son muy tiles, cuando una fuente externa, tiene que ser unida o joined con objetos de la base de datos y luego transformada. - Tambin son tiles cuando el volumen de datos es grande, y no se consultan permanentemente. - Complementa las funcionalidades de SQL*Loader en el paralelismo transparente y en las capacidades de insercin directa. 3.- Historia y Evolucin (9i, 10g, 11gR2) La primera versin de las tablas externas, aparece en los aos 2001 y 2002, con Oracle Database Release 9i (r1 y r2). Inicialmente slo permita el uso del driver ORACLE_LOADER, y el tipo de ficheros que se podan leer, eran slo de texto (los mismos que SQL*Loader). En la versin 9, con el driver ORACLE_LOADER, era preciso tener privilegios de lectura (READ) sobre un objeto de tipo DIRECTORY, donde residan los ficheros de texto con los datos. La segunda versin, aparece en torno al ao 2006, con Oracle Database Release 10g (r2). Es en este momento cuando se introduce el uso del driver ORACLE_DATAPUMP, que permite crear un fichero binario, con datos procedentes de todo tipo de tablas, para la descarga/transporte a otras bases de datos. Tambin se permite la posibilidad de trabajar con la clusula PROJECT COLUMN REFERENCED o PROJECT COLUMN ALL, que determina cmo el driver valida los datos procedentes de los ficheros donde residen las fuentes de datos.

En la versin 10, se mantienen los mismos privilegios, pero si queremos rellenar una tabla externa sobre un fichero binario que resida en un objeto DIRECTORY, es preciso tener privilegios de escritura (WRITE) sobre el objeto DIRECTORY. La tercera versin se produce en a finales del 2009, con la aparicin de Oracle Database 11g R2. Esta versin incluye la posibilidad de invocar a un preprocesador (programa), que trate/manipule los ficheros externos, antes de ser ledos. En concreto, se puede invocar a gunzip, a un fichero .sh (shell) o .bat (lotes). Es decir, los datos a leer pueden estar comprimidos, y en el momento de ser accedidos, se invoca al preprocesador que los descomprime y transfiere. En esta versin, es necesario un permiso especial, sobre el DIRECTORY donde reside el preprocesador: EXECUTE.

4.- Sintaxis y uso 4.1 Creacin y modificacin CREATE: Para crear una tabla externa, utilizamos el comando SQL CREATE TABLE ORGANIZATION EXTERNAL, con los siguientes atributos: - TYPE: Tipo de tabla externa. Puede ser ORACLE_LOADER (defecto), o ORACLE_DATAPUMP - DEFAULT DIRECTORY: Directorio por defecto donde residen los ficheros que son ledos/escritos por las tablas externas. - ACCESS PARAMETERS: Describen las fuentes de datos externas que implementan el tipo de tabla externa especfico. - LOCATION: Nombres de los ficheros donde residen los datos externos.

ALTER: Para modificar una tabla externa utilizamos el comando SQL ALTER TABLE, como en las tablas regulares.

ALTER TABLE
REJECT LIMIT

Descripcin Cambia el lmite de registros rechazados o mximo de errores permitidos Determina cmo el access driver valida las filas en las consultas que se realicen contra la tabla externa: PROJECT COLUMN REFERENCED: el access driver procesa solo la lista de columnas que estn en la SELECT de la consulta. Este valor puede dar una visin inconsistente de las filas, cuando se consultan otras columnas de la misma tabla externa. PROJECT COLUMN ALL: el access driver procesa TODAS las columnas definidas en la tabla externa (aunque la consulta slo seleccione una). ste valor siempre proporciona una visin consistente de los datos cuando se consultan tablas externas. Es el valor por defecto. Cambia la especificacin del directorio por defecto.

Examplo
ALTER TABLE admin_ext_employees REJECT LIMIT 100; ALTER TABLE admin_ext_employees PROJECT COLUMN REFERENCED; ALTER TABLE admin_ext_employees PROJECT COLUMN ALL;

PROJECT COLUMN

DEFAULT DIRECTORY

ALTER TABLE admin_ext_employees DEFAULT DIRECTORY admin_dat2_dir; ALTER TABLE admin_ext_employees ACCESS PARAMETERS (FIELDS TERMINATED BY ';'); ALTER TABLE admin_ext_employees LOCATION ('empxt3.txt', 'empxt4.txt');

ACCESS PARAMETERS

Permite cambiar los parmetros de acceso a la tabla externa, sin tener que recrearla.

LOCATION

Permite cambiar los nombres de las Fuentes de datos (ficheros externos), sin tener que recrearla. Igual que en tablas regulares. Cambia el grado de paralelismo. Igual que en tablas regulares. Aade una columna a la tabla externa. No se permiten columnas virtuales. Igual que en tablas regulares. Modifica una columna de la tabla externa. No se permiten columnas virtuales. Se transforma de forma transparente en una sentencia ALTER TABLE DROP COLUMN. Como las tablas externas consisten solo en metadatos en

PARALLEL

ADD COLUMN

MODIFY COLUMN

SET UNUSED

ALTER TABLE

Descripcin la base de datos, el comando DROP COLUMN lo realiza de forma equivalente al SET UNUSED.

Examplo

DROP COLUMN

Igual que en tablas regulares. Borra una columna de una tabla externa. Igual que en tablas regulares. renombrar una tabla externa. Permite

RENAME TO

4.2 Uso del Driver ORACLE_LOADER Ejemplo para crear una tabla externa de tipo ORACLE_LOADER. 1.- Identificar el formato del fichero plano: El fichero empxt1.dat contiene los siguientes datos de muestra:

El fichero empxt2.dat contiene los siguientes datos de muestra:

2.- Crear los objetos DIRECTORY y dar permisos:

3.- Crear la tabla externa en el esquema HR:

4.- Probamos que devuelve datos y lo creado en los directorios bad y log:

5.- Cargar los datos de la tabla externa, en una tabla convencional, en paralelo.

4.3 Uso del Driver ORACLE_DATAPUMP Este tipo de driver, permite la descarga/carga de datos sobre ficheros binarios. La tabla externa es creada con una sentencia SQL CREATE TABLE AS SELECT y los registros devueltos por la sentencia SELECT , son escritos en un dumpfile (fichero binario) en formato DATAPUMP. En este ejemplo, vemos como rellenar la tabla externa emp_ext, utilizando un subconjunto de datos procedentes de las tablas employees y departments. En el ejemplo, los empleados que trabajan en los departamentos de Marketing y Purchasing, son descargados en el fichero emp1.exp sobre el directorio al que apunte admin_dat_dir.

Comprobemos el fichero en el S.O. y consultemos la tabla externa.

4.4 Definir tablas externas con SQL*Loader

Si tenemos un fichero de control (.ctl) , SQL*Loader, puede generar un fichero de log, con comandos SQL que permitan lo siguiente: - Crear metadatos para la tabla externa. - Insertar datos en la tabla destino - Borrar los metadatos de la tabla externa. Veamos un ejemplo:

- Creamos una tabla convencional en el esquema hr llamada dept:

- Crea amos un fichero fi car rga_dep.c ctl para sim mular la ca arga en de ept. Veam mos su co ontenido.

- Invo oquemos a sqlldr pa ara generar r el log file con los comandos s para a generar la tabla externa y el directorio o.

- Veam mos qu contiene c carga_dep p.sql

Ahora podramos ejecutar los comandos sql generados en el fichero carga_dep.sql, para crear directorio/tabla externa, cargar datos en dept procedentes de la tabla externa y finalmente borrar el directorio/tabla externa. 4.5 Uso con un Preprocesador En Oracle Database 11g R2, la sintaxis del driver ORACLE_LOADER, ha sido mejorada, para permitir la especificacin de un programa que procese o trate los ficheros de datos que van a ser ledos por la tabla externa. Con esta nueva prestacin, se introduce tambin un nuevo privilegio EXECUTE, para los objetos de tipo DIRECTORY. Al leer los datos de la tabla externa con un preprocesador, el driver ORACLE_LOADER crear un proceso que ejecute un programa que a su vez, procese los ficheros de datos de la tabla externa. Este programa ha de residir en un DIRECTORY, de ah el privilegio EXECUTE. Slo un usuario al que se le haya concedido el privilegio EXECUTE sobre el DIRECTORY, tendr permisos de ejecutar programas en l.

Hay algunas implicaciones de seguridad al usar preprocesadores. Como el programa que va a ser ejecutado, corre bajos las credenciales que tiene en el SO el usuario ORACLE, el preprocesador tambin puede acceder a cualquier fichero del SO al que puede acceder el usuario ORACLE. El DBA debe verificar que el preprocesador, no dae ningn fichero ni del SO ni de la base de datos. Ejemplo de Preprocesamiento en LINUX

La tabla sales_transactions_ext es la tabla externa. El directorio exec_file_dir es el DIRECTORY sobre el que el usuario ha de tener privilegio EXECUTE.

'gunzip' es el nombre del programa preprocesador de los datos, que a


su vez puede ser invocado con diferentes opciones. El fichero 'sh_sales.dat.gz' es el fichero externo, que ser descomprimido por la utilidad GNU zip. gzip (GNU zip) es una utilidad de compresin que reemplaza a la utilidad compress. Ha sido adoptada por el proyecto GNU, y es muy popular en Internet. Gzip produce ficheros con extensin .gz . gunzip puede descomprimir los ficheros creados con los comandos gzip, compress o pack. Los ficheros de log/bad, se encuentran el directorios diferentes de preprocesor.

Ejem mplo de pr reprocesam miento en n WINDOW WS: En el e ejemplo o de Wind dows, la ta abla a carg gar tiene una sola co olumna de e tipo VAR RCHAR2. El fichero batch bar.bat b es s el progra ama que p preprocesa a las filas s. Va a co onvertir la a cadena de d caracter res del fic chero de e entrada, h hello word d en Hello Word. El con ntenido del d fiche ero .bat es

Lo que q hace el transfo formar hw w en HW. . El smbolo @ al principio o del fiche ero, es ev vitar que los datos s del fich hero de en ntrada se muestren n por pant talla. En Window ws, los argument tos de los ficher ros .bat son refer renciados con % (%1) ( en ved v de $ ($1), que e se usa en Linux con fiche eros.sh .

Vam mos a reali izar el mis smo ejemp plo para in nsertar reg gistros en EMP PLOYEES S, pero co omprimien ndo los ficheros .dat t con gzip: : Vem mos dnde e residen los l fichero os, y los co omprimim mos:

- Borramos la antigua tabla admin_ext_employees.

- Damos permiso EXECUTE, sobre el directorio donde residen el preprocesador gunzip.

- Creamos un preprocesador llamado uncompress.sh, para invocar a gunzip -c (cuando se llama a un programa con opciones, es necesario hacerlo a travs de ShellScript). El script precisa permisos de ejecucin y el path absoluto a binario gunzip. $1 recibe los argumentos de LOCATION.

- Crea amos de la a tabla ext terna, ahor ra con pre eprocesado or, en el esqu uena HR.

- Prob bamos que e funciona a el prepro ocesador, selecciona s ando datos s.

4.6 Privilegio P os Para a poder acceder a tab blas exter rnas creada as por otro os usuario os necesita amos los siguientes s privilegio os: - SEL LECT en la a definici n de la ta abla. - REA AD sobre el e director rio que con ntiene el/l los fichero os de datos. - WRI ITE sobre e el directo orio para los l fichero os de tipo B BAD y LO OG. Ejem mplo:

4.7 Vistas del Diccionario. Las ms importantes son las siguientes: DBA_EXTERNAL_TABLES: Contiene los atributos de todas las tablas externas del sistema. OWNER: Dueo de la tabla externa NAME: Nombre de la tabla externa TYPE_OWNER: Dueo del tipo de implementacin TYPE_NAME: Nombre del tipo de implementacin DEFAULT_DIRECTORY_OWNER: Dueo del directorio por defecto de la tabla externa DEFAULT_DIRECTORY_NAME: Nombre del directorio por defecto de la tabla externa REJECT_LIMIT: Lmite de registros rechazados DBA_EXTERNAL_LOCATIONS: Contiene la lista de ficheros planos y sus directorios correspondientes. OWNER: Dueo de la table externa TABLE_NAME: Nombre de la table externa LOCATION: Nombre del fichero plano DIRECTORY_OWNER: Dueo del directorio de la table externa DIRECTORY_NAME: Nombre del directorio de la tabla externa DBA_DIRECTORIES tambin es importante, porque puede mostrar los PATHS asignados a directorios a travs de variables como DATA_DIR o LOG_DIR, durante la creacin de la tabla externa.

5.- Transformacin de datos PIPELINED, usando tablas externas

El flujo de un proceso ETL (Extraccin, Transformacin y Carga) en un datawarehouse, puede ser remodelado, para que el flujo de datos y su transformacin se conviertan en un proceso ms escalable y no interrumpido (como sucede en la transformacin multistage). En este tipo de procesos, se leen, transforman y cargan los datos a travs de un solo proceso. Veamos un ejemplo de este estilo, usando TABLE FUNCTIONS. Las TABLE FUNTIONS son funciones que pueden producir un conjunto de filas como output, as como leer un consulto de filas como input. Soportan ejecucin de tipo PIPELINED y PARALLEL, usando PL/SQL, C o JAVA. Se usan en la clausula FROM de una sentencia SELECT.

- Creamos un tipo de dato objeto para la especificacin de la fila:


CREATE OR REPLACE TYPE rec_sales_type IS OBJECT ( PROD_ID NUMBER, CUST_ID NUMBER, TIME_ID DATE , CHANNEL_ID number, PROMO_ID NUMBER , QUANTITY_SOLD NUMBER(3), AMOUNT_SOLD NUMBER (10,2));

- Creamos un tipo de dato tabla, con ese tipo de dato objeto.


CREATE OR REPLACE TYPE table_sales_type IS TABLE OF rec_sales_type;

- Creamos la TABLE FUNCTION. En el ejemplo, la funcin manipulation, consulta la tabla externa SH.SALES_DELTA_XT y transforma el resultado durante la carga. La tabla externa tiene una columna, CHANNEL_ID en formato texto. Se transforma a formato numrico, y dependiendo del valor de entrada, se asignan diferentes canales de salida (ej. 1 o 99).

CREATE OR REPLACE FUNCTION manipulation RETURN table_sales_type PIPELINED IS out_rec rec_sales_type := rec_sales_type(null,null,null,null,null,null ,null); BEGIN FOR in_rec IN (SELECT * FROM sh.sales_delta_xt) LOOP out_rec.prod_id := in_rec.prod_id; out_rec.time_id := in_rec.time_id; out_rec.cust_id := in_rec.cust_id; out_rec.promo_id := in_rec.promo_id; out_rec.channel_id := CASE in_rec.channel_id WHEN 'S' THEN to_number('1') ELSE to_number('99') END; out_rec.amount_sold := in_rec.amount_sold; out_rec.quantity_sold := in_rec.quantity_sold; PIPE ROW (out_rec); END LOOP; RETURN; END;
- Invocar a la TABLE FUNCTION con una sentencia SELECT.

SELECT * FROM TABLE(manipulation);

- Llamar a la TABLE FUNCTION desde una subconsulta: INSERT /*+ APPEND, PARALLEL(sales) */ INTO sales SELECT * FROM TABLE(manipulation); Las funciones de tipo pipelined (tubera), se pueden usar en la clusula FROM de una sentencia SELECT. Las filas resultantes son recuperadas iterativamente desde la implementacin de la TABLE FUNCTION. Mltiples llamadas a la TABLE FUNCTION, ya sea en la misma consulta o en consultas separadas, provocan muchas ejecuciones de la implementacin de la funcin, sin buffering o reutilizacin de filas.

You might also like