Vous êtes sur la page 1sur 14

Parcial III: 4

Leccin 20

Oracle9i Extensiones para sentencias DML y DDL


Objetivo Despus de finalizar este captulo conocers lo siguiente: Describirs las ventajas de las inserciones en mltiples tablas Usaras los siguientes tipos de inserciones en mltiples tablas o INSERT incondicional o INSERT respecto a un pivote o ALL INSERT condicional o FIRST INSERT Condicional Creacin y uso de tablas externas Nombrar el ndice al momento de la creacin de una llave primaria

Revisando la sentencia INSERT Se pueden aadir nuevas filas a una tabla con el uso de la sentencia INSERT. Donde: table column value es el nombre de la tabla es el nombre de la columna en la tabla a poblar es el valor correspondiente a la columna

Nota: Esta sentencia con la clusula VALUES aade solo una fila a la vez a la tabla.

Parcial III: 4

Leccin 20

Revisando la sentencia UPDATE Se pueden modificar filas existentes con el uso de la sentencia UPDATE. Donde: table column value condition es el nombre de la tabla es el nombre de la columna en la tabla a poblar es el valor o sub consulta correspondiente para la columna identifica las filas a ser actualizadas y esta compuesto de nombres de columnas, expresiones, constantes, sub consultas y operadores de comparacin

Visin general de las sentencias INSERT multitablas La sentencia INSERT SELECT pueden ser usadas para insertar filas en mltiples tablas como parte de una simple sentencia DML Las sentencias INSERT multitablas pueden ser usadas en datos de sistemas de almacn para transferir datos de uno o mas recursos operacionales y establecer las tablas a ser manipuladas. Estas sentencias proveen una mejora significativa en el desempeo

En una sentencia INSERT multitabla, se insertan filas derivadas del calculo de las filas obtenidas en la evaluacin de una sub consulta dentro de una o ms tablas. Las sentencias INSERT multitablas pueden jugar un rol de mucha utilidad en un escenario de datos para un almacn. Es necesario cargar los datos del almacn en forma regular para que pueda servir el propsito de facilitar el anlisis del negocio. Para hacer esto, los datos de uno o mas sistemas operacionales necesitan ser extrados y copiados en un sistema de almacn. El proceso de extraccin de datos del sistema origen para ser trados dentro del sistema de almacn es comnmente llamados ETL(Extraction, Transformation, Loading), el cul se inicia para la extraccin, transformacin y carga.

Parcial III: 4

Leccin 20

Durante la extraccin, el dato deseado ha sido identificado y extrado de muchas fuentes diferentes, como un sistema de base de datos y aplicaciones. Despus de la extraccin, el dato ha sido fsicamente transportado al sistema destino un sistema intermedio para su proceso futuro. Dependiendo de los medios escogidos para su transporte, algunas transformaciones pueden realizarse durante este proceso. Por ejemplo, una sentencia SQL que directamente accede a un objetivo remoto a travs de un gateway puede concatenar dos columnas como parte de la sentencia SELECT. Una vez que el dato es cargado en la base de datos de Oracle9i, las transformaciones de los datos pueden ser ejecutadas usando operaciones SQL. Con Oracle9i las sentencias INSERT multitabla es una de las tcnicas para implementar transformaciones de datos en SQL. Las sentencias INSERTS multitabla ofrecen el beneficio de sentencias INSERT SELECT cuando mltiples tablas involucradas como objetivos. Usando la funcionalidad anterior de Oracle9i, tuviste que tratar con n sentencias INSERT SELECT independientes, y as procesar el mismo dato origen n veces e incrementando el trabajo de carga para las transformaciones en el mismo nmero de veces. Al igual que con la existente sentencia INSERT SELECT, la nueva sentencia puede ser paralelizada y usada con un mecanismo de carga directo para un mejor desempeo. Cada registro de algunos flujos de entrada, como es una tabla de una base de datos no relacional, puede ahora ser convertida en mltiples registros para ms tablas de ambientes de bases de datos relacionales. Para implementar esta funcionalidad antes de Oracle9i, se tuvo que escribir mltiples sentencias INSERT.

Parcial III: 4

Leccin 20

Sentencias INSERT multitablas En el ejemplo anterior se muestran los formatos generales para las sentencias INSERT multitablas. Tipos de sentencias INSERT multitablas Oracle9i introduce los siguientes tipos de sentencias INSERT multitablas: INSERT incondicional ALL INSERT condicional FIRST INSERT condicional INSERT pivote Usa las diferentes clusulas para indicar el tipo de INSERT a ser ejecutado. Incondicional INSERT:ALL into_clause Especifique ALL seguido por mltiple insert_into_clauses para ejecutar un insert multitabla incondicional. El servidor de Oracle ejecuta cada insert_into_clause una vez para cada fila obtenida por la sub consulta. Condicional INSERT: conditional_insert_clause Especifique el conditional_insert_clause para ejecutar un insert multitabla condicional. El servidor de Oracle filtra cada insert_into_clause a travs de la correspondiente condicin WHEN, el cul determina si insert_into_clause es ejecutado. Una simple sentencia INSERT multitabla puede contener arriba de 127 clusulas WHEN.

Parcial III: 4

Leccin 20

Condicional INSERT:ALL Si se especifica ALL, el servidor de Oracle evala cada clusula WHEN independientemente del resultado de la evaluacin de las otras clusulas WHEN. Para cada clusula WHEN cuya condicin evaluada sea verdadera, el servidor de Oracle ejecuta la correspondiente lista de clusulas INTO. Condicional FIRST: INSERT Si especificas FIRST, el servidor de Oracle evala cada clusula WHEN en el orden en las cuales aparecen en la sentencia. Si la primera clusula WHEN evaluada es verdadera, el Servidor de Oracle ejecuta la correspondiente clusula INTO y salta las subsecuentes clusulas WHEN para esa fila. Condicional INSERT: ELSE Para cada fila, si no se tiene una clusula WHEN evaluada a verdadero: Si se tiene especificado una clusula ELSE, el Servidor de Oracle ejecuta la lista de la clusula INTO asociada con la clusula ELSE Si no se tiene especificado alguna clusula ELSE, el Servidor de Oracle no realiza ninguna accin para esa fila Restricciones en sentencias INSERT multitablas Solo se pueden ejecutar inserts multitablas en tablas, no en vistas o vistas materializadas. No se pueden ejecutar inserts multitablas en tablas remotas No se puede especificar una coleccin de tablas como expresin cuando ejecutas un insert multitabla En un insert multitabla, todas las insert_into_clauses no pueden ser combinadas para especificar ms de 999 columnas. Ejemplo INSERT ALL Incondicional

En el ejemplo se insertan filas en ambas tablas SAL_HISTORY y MGR_HISTORY. La sentencia SELECT recupera los detalles del nmero de empleado, fecha de contratacin y nmero de jefe de aquellos empleados cuyo nmero de identificacin es mayor que 200 de la tabla EMPLOYEES. El detalle del nmero de empleado, fecha de contratacin y salario es insertado en la tabla SAL_HISTORY. El detalle del nmero de empleado, nmero de jefe y salario es insertado en la tabla MGR_HISTORY.

Parcial III: 4

Leccin 20

Esta sentencia INSERT es referida como un INSERT incondicional, puesto que ninguna restriccin es aplicada a las filas recuperadas por la sentencia SELECT. Todas las filas recuperadas por la sentencia SELECT son insertadas en dos tablas SAL_HISTORY y MGR_HISTORY. La clusula VALUES en la sentencia INSERT especifica las columnas de la sentencia SELECT que tienen que ser insertadas en cada una de las tablas. Cada fila obtenida por la sentencia SELECT genera dos inserciones, una para cada tabla. Ejemplo INSERT ALL condicional

Este ejemplo es similar al anterior, inserta filas en ambas tablas SAL_HISTORY y MGR_HISTORY. La sentencia SELECT recupera el detalle del nmero de empleado, fecha de contratacin, salario y nmero de jefe, para aquellos empleados cuyo nmero de empleado sea mayor a 200 de la tabla EMPLOYEES. Los detalles del nmero de empleado, fecha de contratacin y salario son insertados en la tabla SAL_HISTORY. Los detalles del nmero de empleado, jefe y salario son insertados en la tabla MGR_HISTORY. Esta sentencia INSERT es referida como un INSERT ALL condicional, puesto que una restriccin es aplicada para las filas que son recuperadas por la sentencia SELECT. De las filas recuperadas por la sentencia SELECT, solo aquellas filas en las cuales el valor de la columna SAL es mayor que 10000 son insertadas en la tabla SAL_HISTORY, y similarmente solo aquellas filas donde el valor de la columna MGR es mayor que 200 son insertadas en la tabla MGR_HISTORY. Observe que aunque en el ejemplo anterior 8 filas son insertadas en las tablas, en este ejemplo solo 4 registros son insertados.

Parcial III: 4 Ejemplo FIRST INSERT condicional

Leccin 20

En el ejemplo se insertan filas en ms de una tabla, utilizando una simple sentencia INSERT. La sentencia SELECT recupera el detalle del nmero de departamento, salario total y fecha mxima de contratacin para todos los departamentos de la tabla EMPLOYEES. Esta sentencia INSERT es conocida como FIRST INSERT condicional, como una excepcin es hecha para los departamentos cuyo salario total es mayor que $25,000. La condicin WHEN ALL > 25000 es evaluada primero. Si el salario total para un departamento es mayor que $25,000, entonces el registro es insertado en la tabla SPECIAL_SAL independientemente de la fecha de contratacin. Si en esta primera clusula WHEN la evaluacin es verdadera, el Servidor de Oracle ejecuta las correspondientes clusulas INTO y salta las subsecuentes clusulas WHEN para esa fila. Para las filas que no satisfagan la primera condicin WHEN (WHEN SAL > 25000), el resto de condiciones son evaluadas como una sentencia INSERT condicional y los registros recuperados por la sentencia SELECT son insertados en las tablas HIREDATE_HISTORY_00 o HIREDATE_HISTORY_99 o HIREDATE_HISTORY, basndose en el valor de la columna HIREDATE. Ejemplo INSERT pivote

En el ejemplo el dato de ventas es recibido de la tabla de la base de datos no relacionada SALES_SOURCE_DATA, que es el detalle de las ventas ejecutadas

Parcial III: 4

Leccin 20

por un representante de ventas en cada da de la semana, para una semana con un identificador en particular.

Observe que en el ejemplo anterior que usa un INSERT pivote, una fila de la tabla SALES_SOURCE_DATA es convertida en 5 registros para una tabla relacional, SALES_INFO. Tablas externas Una tabla externa es una tabla de solo lectura cuyos metadatos estn almacenados en la base de datos pero los datos estn fuera de la base de datos. Usando las caractersticas de las tablas externas de Oracle9i, se pueden usar datos externos como una tabla virtual. Estos datos pueden ser consultados y relacionados directamente y en paralelo si requerir cargar primeramente los datos externos en la base de datos. Puedes usar SQL, PL/SQL y Java para consultar los datos en una tabla externa. Las diferencias principales entre las tablas externas y las tablas regulares es que las tablas organizadas externamente son de solo lectura. No se pueden aplicar operaciones DML (UPDATE, INSERT o DELETE) y no se pueden crear ndices. La manera de definir los metadatos para tablas externas es a travs de la sentencia CREATE TABLE ORGANIZATION EXTERNAL. Esta definicin para

Parcial III: 4

Leccin 20

la tabla externa puede ser pensada como una vista que es usada para correr cualquier consulta SQL contra datos externos sin requerir que los datos externos primeramente estn cargados en la base de datos. El Servidor de Oracle proporciona los principales controladores de acceso para tablas externas. Uno, es el controlador de acceso de carga u ORACLE_LOADER, que es usado para la lectura de datos de archivos externos utilizando la tecnologa de carga de Oracle. Este controlador de acceso permite que el Servidor de Oracle obtenga datos de diversos orgenes cuyo formato pueda ser interpretado por la utilidad SQL*Loader. El otro controlador de acceso proporcionado por Oracle es el controlador de acceso import/export u ORACLE_INTERNAL, este puede ser usado para la importacin y exportacin de datos usando un formato de plataforma independiente. Creando una tabla externa Crear una tabla externa usando la clusula ORGANIZATION EXTERNAL de la sentencia CREATE TABLE, de hecho no se estara creando una tabla. Ms bien, se estara creando un metadato en el diccionario de datos para que se pueda usar el acceso a los datos externos. La clusula ORGANIZATION deja que se especifique el orden en el cul las filas de datos de la tabla estn almacenados. Por la especificacin EXTERNAL en la clusula ORGANIZATION, indicas que la tabla es una tabla de slo lectura localizada fuera de la base de datos. TYPE access_driver_type indica el controlador de acceso de la tabla externa. El controlador de acceso es la Interfaz de Programacin de Aplicaciones (API, application Programming Interface) que interpreta los datos externos para la base de datos. Si no se especifica TYPE, Oracle utiliza el controlador de acceso por defecto, ORACLE_LOADER. La clusula REJECT LIMIT permite especificar cuantos errores de conversin pueden ocurrir durante una consulta de datos externos antes de que un error sea devuelto por Oracle y la consulta se aborte. El valor por defecto es 0. DEFAULT DIRECTORY permite especificar uno o ms objetos de directorio por defecto correspondientes a los directorios en el sistema de archivos donde la fuente de datos externos puede residir. Los directorios por defecto pueden tambin ser usados por el controlador de acceso para almacenar archivos auxiliares como bitcoras de errores. Mltiples directorios por defecto son permitidos para facilitar el balance en la carga de mltiples discos. La clusula opcional ACCESS PARAMETERS permite asignar valores a los parmetros de un controlador de acceso especfico para esta tabla externa. Oracle no interpreta nada de esta clusula. Esto esta a cargo del controlador de acceso para interpretar esta informacin en el contexto de datos externos. La clusula LOCATION permite especificar una localizacin externa para cada fuente de datos externa. Usualmente location_specifier es un archivo, pero no tiene que ser as. Oracle no interpreta esta clusula.

Parcial III: 4

Leccin 20

Ejemplo de la creacin de una tabla externa

Use la sentencia CREATE DIRECTORY para crear el objeto directorio. Un objeto directorio especifica un alias para un directorio en el sistema de archivos del servidor donde una fuente de datos externa reside. Se pueden usar nombres de directorio cuando nos referimos a una fuente de datos externa, ms bien, es como una ruta del sistema operativo. Se debe tener el privilegio del sistema CREATE ANY DIRECTORY para crear directorios. Cuando creas un directorio, automticamente otorgas el privilegio READ al objeto y puedes otorgar este privilegio a otros usuarios y roles. El DBA puede tambin otorgar este privilegio a otros usuarios o roles. Sintaxis

Donde: OR REPLACE

directory

path_name

especifica que el objeto directorio de la base de datos ser recreado si este existe. Se puede usar esta clusula para cambiar la definicin de un directorio existente sin eliminarlo, recreando y reotorgando los privilegios del objeto de la base de datos previamente otorgados en el directorio. especifica el nombre del objeto directorio a ser creado. La longitud mxima del directorio es 30 bytes. No se puede calificar un objeto directorio con un nombre de esquema. especifica la ruta completa del directorio del sistema operativo.

Parcial III: 4

Leccin 20

Asuma que hay un archivo plano que tiene registros en el siguiente formato: Los registros estn delimitados por nuevas lneas, y todos los campos terminan con una coma (,). El nombre del archivo es: /flat_files/emp1.txt Para convertir este archivo como fuente de dato para una tabla externa, cuyos metadatos pueden residir en la base de datos, necesitas ejecutar los siguientes pasos: 1. Crear un objeto directorio emp_dir como sigue:

2. Ejecutar el comando CREATE TABLE como en la tabla anterior El ejemplo anterior ilustra la especificacin de la tabla a crear en una tabla externa para el archivo: /flan_files/emp1.txt En el ejemplo, la especificacin TYPE es solo para ilustrar su uso. ORACLE_LOADER es el controlador de acceso por defecto si no se especifica. El ACCESS PARAMETERS proporciona valores a los parmetros de un controlador de acceso especfico y es interpretado por el controlador de acceso, no por el Servidor de Oracle. La clusula PARALLEL habilita la ejecucin de 5 servidores paralelos para simultneamente la fuente de datos externa (archivos) cuando ejecutes la sentencia INSERT INTO TABLE. La clusula REJECT LIMIT especfica que si ms de 200 conversiones de error ocurren durante una consulta de los datos externos, la consulta es abortada y un error es devuelto. Estos errores de conversin pueden levantarse cuando el controlador de acceso intenta transformar el dato en el archivo de datos para que corresponda con la definicin de la tabla externa. Una vez que el comando CREATE TABLE se ejecute satisfactoriamente, la tabla externa OLDEMP puede ser descrita y consultada como una tabla relacional.

Parcial III: 4

Leccin 20

En el siguiente ejemplo, la sentencia INSERT INTO TABLE genera un flujo de datos de la fuente de datos externa al SQL de Oracle donde el dato es procesado. Como el dato es extrado de una tabla externa, este es transparentemente convertido por el controlador de acceso ORACLE_LOADER de esta representacin externa a una representacin equivalente nativa de Oracle. La sentencia INSERT inserta los datos de la tabla externa OLDEMP en la tabla BIRTHDAYS:

Ahora podemos consultar la tabla BIRTHDAYS:

Consultando tablas externas Una tabla externa no describe ningn dato que sea almacenado en la base de datos. Ni tampoco describe como los datos son almacenados en la fuente externa. En lugar de eso, describe como la capa de la tabla externa necesita presentar los datos al servidor. Esto es la responsabilidad del controlador de acceso y de la capa de la tabla externa para hacer las transformaciones necesarias en los datos del archivo para que estas correspondan con la definicin de la tabla externa. Cuando el servidor de la base de datos necesita accesar los datos en una fuente externa, este llama al apropiado controlador de acceso para obtener los datos de la fuente externa en la forma en la que la base de datos lo espera.

Parcial III: 4

Leccin 20

Es importante recordar que la descripcin de los datos en la fuente de datos esta separado de la definicin de la tabla externa. El archivo fuente puede contener ms o menos campos que columnas en la tabla. Adems, el tipo de datos para los campos en la fuente de datos puede ser diferente al de las columnas en la tabla. El controlador de acceso toma el cuidado de asegurarse que los datos de la fuente de datos estn procesados para que correspondan con la definicin de la tabla externa.

Sentencia CREATE INDEX con CREATE TABLE En el ejemplo, la clusula CREATE INDEX es usada con la sentencia CREATE TABLE para crear un ndice de llave primaria explicita. Esta es una mejora provista por Oracle9i. Puedes ahora nombrar los ndices al momento de la creacin de la llave primaria, esto es diferente a lo visto anteriormente donde el Servidor de Oracle crea un ndice, pero donde no se tiene el control sobre el nombre del ndice. El siguiente ejemplo ilustra esto:

Observe que el Servidor de Oracle da un nombre al ndice cuando este es creado por una columna de llave primaria. Pero este nombre es secreto y no es fcil de entender. Con Oracle9i, se puede nombrar el ndice de la columna de la llave primaria, cuando es creada la tabla con la sentencia CREATE TABLE. Sin

Parcial III: 4

Leccin 20

embargo, antes de Oracle9i, si t nombrabas el constraint de llave primaria al momento de su creacin, el ndice era creado con el mismo nombre. Resumen En este captulo, se ha visto como: Usar la sentencia INSERT SELECT para insertar filas en mltiples tablas como parte de una simple sentencia DML Crear tablas externas Nombrar ndices usando la sentencia CREATE INDEX junto con la sentencia CREATE TABLE

Vous aimerez peut-être aussi