Tablas Externas en Oracle 9i

Una, entre las muchas características que se han integrado en Oracle 9i es la capacidad de crear las tablas externas. Una tabla externa es una tabla donde la estructura se define dentro de la base de datos pero que sus datos residen externamente en uno o más archivos en el sistema operativo. 

Estas tablas son muy similares a las tablas regulares en Oracle, a excepción que los datos no se almacenen  en los datafiles de Oracle, si no en ficheros del sistema operativo, y estos no son manejados por la base de datos.

Las tablas externas en esta versión tienen algunas limitaciones importantes:
  • No es posible realizar operaciones DML sobre estas tablas (insert, update o delete).
  • No se pueden definir índices en la tabla.
  • No soporta archivos más grandes de 2GB.
A pesar de estas limitaciones, las ventajas que podemos obtener sobre el uso de estas tablas son muy considerables, ya que son tablas estáticas,en las que el usuario solo puede acceder a los datos pero no modificarlos.  Además Oracle tiene previsto, en versiones futuras, la posibilidad de escritura sobre estas tablas.



Vemos un ejemplo de cómo crear una tabla externa y operar sobre ella:

Lo primero que debemos hacer es indicarle a Oracle en que directorio del sistema operativo se van ubicar los ficheros de datos:

CREATE OR REPLACE DIRECTORY MIDIRECTORIO AS 'C:oracletabext';

Unavez que Oracle sabe cual es directorio donde se encuentran los ficherosde datos sobre los que vamos a crear la tabla externa, debemos dar permisos a los usuarios para que puedan acceder a ese directorio:

GRANT READ, WRITE ON DIRECTORY MIDIRECTORIO TO USUARIO;

Supongamos que en ese directorio (c:oracletabext) tenemos el fichero meses.txt creado previamente con la siguiente estructura:

1,Enero,31,2,Febrero,28,3,Marzo,31,4,Abril,30,5,Mayo,31,
6,Junio,30,7,Julio,31,8,Agosto,31,9,Septiembre,30,
10,Octubre,31,11,Noviembre,30,12,Diciembre,31

Creamos entonces la tabla externa con el comando CREATE TABLE:

CREATE TABLE EXT_MESES( MES VARCHAR2(50), DESMES VARCHAR2(50), DIAS VARCHAR2(50))ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER DEFAULT DIRECTORY MIDIRECTORIO ACCESS PARAMETERS ( RECORDS DELIMITED BY NEWLINE NOBADFILE NODISCARDFILE NOLOGFILE SKIP 0 FIELDS TERMINATED BY ',' MISSING FIELD VALUES ARE NULL REJECT ROWS WITH ALL NULL FIELDS ( MES CHAR, DESMES CHAR, DIAS CHAR ) ) LOCATION ('meses.txt')) REJECT LIMIT UNLIMITED

Esta declaración DDL funcionará incluso si el archivo meses.txt no existiera en el directorio del sistema operativo. Hasta que ejecutemos una sentencia contra la tabla, no sabremos si esta fue creada con éxito.

Comprobamos que la tabla fue creada con éxito mediante una sentencia SELECT:

select * from ext_meses;

Si todo esta correcto el resultado debería parecerse a lo siguiente,

MES DESMES DIAS 
-----------------------------------
1 Enero 31
2 Febrero 28
3 Marzo 31
4 Abril 30
5 Mayo 31
6 Junio 30
7 Julio 31
8 Agosto 31
9 Septiembre 30
10 Octubre 31
11 Noviembre 30
12 Diciembre 31

Volvamos de nuevo sobre el script de creación de la tabla externa. La primera parte de la declaración de CREATE TABLE es igual a una tabla regular de Oracle con la excepción de la declaración especifica ORGANIZATION EXTERNAL, que indica que esta tabla es una tabla externa. También en esa parte de la declaración especificamos un tipo de ORACLE_LOADER, el cual es solamente soportado por Oracle.

Observamos que el directorio es también parte de la declaración DEFAULT DIRECTORY MIDIRECTORIO, en que le indicamos a la tabla dónde encontrar los archivos.

A partir de aquí, especificamos los parámetros del acceso (ACCESS PARAMETERS). Los más significativos son:
  • records delimited, especifica los caracteres que será utilizado para separar las filas.
  • badfile, especifica el archivo que el Oracle utilizará almacenar las filas rechazadas. En nuestro caso hemos prescindido de él, así como del logfile.
  • logfile, se utilizará para almacenar la información de cualquier error.
  • fields, especifica el separador distinguirá una columna de otra durante la carga.
  • location, la localización proporciona el nombre del archivo real al acceso. Si Oracle necesita tener acceso a archivos múltiples, pueden ser especificados como sigue: location ('file1.dat', 'file2.dat')
  • reject limit, especifica el número de las filas que pueden ser rechazadas antes deque el comando devuelva un error. Si se alcanza este umbral, se produciera un error.
Con este ejemplo hemos visto la utilidad de estas tablas. Podemos hacer modificaciones en el fichero y estas modificaciones las veremos reflejadas en la tabla externa. Podemos ordenar los datos, agruparlos, sumarlos, contarlos,mostrar únicamente las columnas que especifiquemos, sin embargo, no dejara de ser una tabla estática, cuyos valores son siempre fijos para el usuario pero no para el administrador de la base de datos.

Seguid experimentando vosotros esta nueva funcionalidad de Oracle, y espero vuestros comentarios e ideas.

Comentarios

Entradas populares de este blog

Backup y Recuperación en Frío (ORACLE)

Uso de la función RANKX (DAX)