modulo gestion de bases de datos

Upload: diego-fernando

Post on 12-Jul-2015

647 views

Category:

Documents


2 download

TRANSCRIPT

GESTIN DE BASES DE DATOS

PRESENTACINLa Universidad Autnoma de Quito pone a disposicin de los estudiantes de la modalidad semipresencial esta ayuda metodolgica vlida para la formacin de profesionales en el rea informtica capacitados para el anlisis, diseo, creacin y mantenimiento de sistemas que utilicen bases de datos. El estudio y la correcta comprensin de los principios bsicos referentes a las bases de datos son de capital importancia para los profesionales de la informtica y para otros especialistas cuyo trabajo se desarrolla dentro del mbito de la sociedad de la informacin y del conocimiento. Esta ayuda permite al estudiante adquirir los conocimientos necesarios para poder realizar sistemas con bases de datos relacionales mediante la prctica numerosos ejemplos. Este mdulo pretende ser una introduccin a Forms y Report como componentes de Oracle. No se pretende realizar un estudio exhaustivo de todas las opciones, solo se ha pretendido introducir y explicar las opciones ms tiles, dejando los detalles ms especficos a los manuales de referencia. Deseo el mejor aprovechamiento de este material y el xito en esta profesin.

1

GESTIN DE BASES DE DATOS

OBJETIVOS DEL MDULO1.1 GENERAL El objetivo de este curso es doble. El primer objetivo es aportar al alumno una visin genrica y bastante completa de la arquitectura que Oracle utiliza para almacenar la informacin, desde lo bsico hasta lo ms avanzado del rea. Tras ello, el segundo objetivo de este curso es permitir que el alumno entienda el desarrollo de aplicaciones utilizando Forms y Report en un entorno cliente servidor en donde todas las prcticas se realizarn sobre tecnologa Oracle. 1.2 ESPECFICOS Conocer la arquitectura de la base de datos Oracle. Aprender una herramienta de desarrollo de aplicaciones utilizando bases de datos Crear sistemas utilizando arquitectura cliente servidor bajo las herramientas de Oracle. Aprender a instalar y administrar un manejador de bases de datos.

2

GESTIN DE BASES DE DATOS

INTRODUCCIONEste mdulo trata sobre la utilizacin de herramientas de desarrollo de aplicaciones de Oracle como el mejor manejador de bases de datos que existen en la actualidad. Trata sobre la versin 8 de Oracle, que cualquiera podra decir que se ha quedado obsoleto, y la verdad es que no le falta razn. Sin embargo, la mayora de los captulos no tratan de temas especficos y avanzados de Oracle, sino sobre conceptos de bases de datos relacionales, la arquitectura interna o el uso de Forms y Report, y la verdad es que sobre estos tres aspectos no hay cambios muy a menudo. De todas formas, algunos detalles de lo que explico han podido quedar obsoletos, as que recomiendo que consulten con los manuales de Oracle para asegurarse sobre cmo funcionan en las versiones actuales. Es por eso que este mdulo no da los detalles ms ocultos de Oracle, ni los trucos ms avanzados para optimizar bases de datos, ni siquiera pretende ser un texto de referencia para consultar la sintaxis de las instrucciones, sino que ayudar a introducir en el mundo de Oracle, empezando desde cero, y llegando a un nivel que permitir seguir aprendiendo por si mismo. Tambin puede ser til para los que han trabajado algo con SQL en otras bases de datos, y quieren comprender la arquitectura interna de Oracle y los conceptos de base y programacin en un entorno cliente servidor con las herramientas de Oracle.

3

GESTIN DE BASES DE DATOSUNIDAD IOBJETIVO DE LA UNIDAD Conocer los conceptos bsicos de bases de datos y sus caractersticas principales Definir el concepto de un Sistema Manejador de Bases de Datos DBMS Enterarse del funcionamiento interno de un manejador de bases de datos Aprender el lenguaje de programacin PL/SQL que ampla la funcionalidad de SQL El alumno conocer algunas caractersticas de la base de datos Oracle y del producto PL/SQL y cmo se inserta en la arquitectura de desarrollo de la base de datos.

ACTIVIDADES: 1. Recopilar informacin de la normalizacin de bases de datos. 2. Obtener manuales de referencia de Oracle CRITERIOS DE EVALUACIN: Examen escrito Desarrollo de ejercicios Trabajos individuales

4

GESTIN DE BASES DE DATOS CAPITULO I DEFINICIONES Y CONCEPTOS BASICOS Que es una Base de DatosEs una coleccin de archivos interrelacionados, creados y manejados con un DBMS. El contenido de una base de datos engloba a la informacin concerniente (almacenadas en archivos) de una organizacin, de tal manera que los datos estn disponibles para los usuarios. Tambin podemos decir que es una agrupacin de datos almacenados bajo las siguientes caractersticas: Integrados o Combinacin de archivos separados o Control centralizado o Poca redundancia Compartidos o Mltiples aplicaciones o Acceso solamente a personas autorizadas Concurrentemente Compartidos o Integridad de los datos o Deteccin de DEAD-LOCKS Independientes o Mtodo de acceso o Estructura de datos

Objetivos de una Base de Datos Controlar la integridad referencial Proveer mecanismos de seguridad Evitar las inconsistencias y redundancias Facilidad de manipulacin de las bases de datos Acceso concurrente

Que es un manejador de Bases de DatosUn DBMS es una coleccin de numerosas rutinas de software interrelacionadas, cada una de las cuales es responsable de una tarea especfica.

5

GESTIN DE BASES DE DATOSSISTEMA DE BASES DE DATOS

USUARIO

Manejador de Base B.D.DDe Datos

Programa o nivel de software que sirve de interface entre el usuario y la Base de Datos fsica Nivel de Software mencionado que principalmente facilita: o Uso simultneo de la Base de Datos por mltiples usuarios o Herramientas para acceder y manipular los datos de la Base de Datos Una Estructura para ORGANIZAR datos normalizados.

NormalizacinLa normalizacin es el proceso mediante el cual se transforman datos complejos a un conjunto de estructuras de datos ms pequeas, que adems de ser ms simples y ms estables, son ms fciles de mantener. Tambin se puede entender la normalizacin como una serie de reglas que sirven para ayudar a los diseadores de bases de datos a desarrollar un esquema que minimice los problemas de lgica. Cada regla est basada en la que le antecede. La normalizacin se lleva a cabo por cuatro razones: 1. Estructurar los datos de forma que se puedan representar sus relaciones pertinentes. 2. Permitir la recuperacin sencilla de los datos en respuesta a las solicitudes de consultas y reportes. 3. Simplificar el mantenimiento de datos (altas, bajas, modificaciones, consultas) 4. Reducir la necesidad de estructurar los datos cuando surjan nuevas aplicaciones.

El modelo lgicoUn primer paso en el modelo de procesos es la construccin de un modelo lgico de datos usados en el negocio. El modelo lgico es un diagrama normalizado de datos. Ej Tabla Worker Name Age Lodging Manager Ardes Skill1

6

GESTIN DE BASES DE DATOSSkill2 Skill3 Ability

Primera forma normalEs poner los datos en tablas separadas de manera que los datos de cada tabla son de un tipo similar y dando a cada tabla una clave principal para eliminar los grupos repetidos de datos. Tabla Worker Name Age House Manager Ardes Tabla Skill Name Skill Description Ability

Clave Principal

Segunda forma normalSacar los datos que solo dependen de una parte de la clave. Tabla Worker Tabla Skill-Worker Name Name Age Skill Lodging Ability Manager Address Tabla Skill Skill Description

Tercera forma normalDeshacerse de cualquier cosa de las tablas que dependan de la clave principal pero a travs de otro campo. Tabla Worker Tabla Skill-Worker Tabla Skill Tabla Lodging Name Name Skill Lodging Age Skill Description LongName Lodging Ability Manager Address Con esta informacin podemos elaborar el siguiente modelo entidad-relacin.

7

GESTIN DE BASES DE DATOS

EJERCICIO: Realice el script respectivo para la creacin fsica de la bases de datos del modelo E-R anterior utilizando comandos SQL.

8

GESTIN DE BASES DE DATOS CAPITULO IIQUE ES ORACLEORACLE es un manejador de bases de datos Relacional que soporta la tarea de introducirguardar-recuperar informacin y proporciona hbiles herramientas que permiten considerables y sofisticadas maneras en que se capturan los datos, se editan, se modifican y se introducen, adems de cmo se guardan de una manera segura y cmo se pueden recuperar, manipular y emitir informes con ellos. Actualmente est disponible en cuatro versiones: STANDARD.- Se caracteriza por ser fcil de usar potente y con funcionalidad para trabajo en grupo. ENTERPRISE EDICIN (Edicin Empresarial).- Incorpora opciones de misiones critica OLTP (procesamiento de transacciones en lnea) y aplicaciones de Data Ware Housing (bodega de datos). PERSONAL EDITION.- Incluye las opciones de la versin empresarial pero solo para un usuario. LITE.- Permite la sincronizacin de bases de datos ubicadas en las PALM (Hand Held).

MODULOS DE ORACLEOracle esta compuesta por:

Export / Import

Host Lenguaje Interface

SQL*Plus

Oracle Kernel

Forms

Diccionario DATO S

DataLoader

Datos

Report

SQL Execution Host Lenguaje Interface

9User Programs Pro * Oracle

GESTIN DE BASES DE DATOSEl levantar una base de datos de Oracle implica que se ejecuten ciertos procesos para su correcto funcionamiento. Cada vez que una base de datos est corriendo es asociada con una instancia de Oracle.

INSTANCIA DE ORACLECuando una base de datos es arrancada en un servidor, Oracle reserva un rea de memoria llamada SGA (System Global Area) y ejecuta uno o ms procesos en back ground. En el SGA es donde se encuentra el Area de Contexto, los buffers, tablas y redo logs a travs de los cuales fluyen todas las transacciones entre las aplicaciones y el almacenamiento de datos y sirven a uno o ms usuarios de la base de datos.

Por cada instancia de base de datos, tendremos una zona de memoria global, el SGA, donde se almacenan aquellos datos y estructuras que deben se compartidos entre distintos procesos de la base de datos, como los procesos propios de Oracle y cada uno de los subprocesos que gestionan la conexin. El tamao del SGA es uno de los puntos ms crticos a la hora de mejorar el rendimiento de una base de datos, ya que, cuanto mayor memoria se reserve (mientras no sea memoria virtual), ms rpidas se realizarn ciertas operaciones. Por ejemplo, las ordenaciones (una de las operaciones que ms rpido deben hacerse) se realizan en el SGA si hay espacio suficiente. En caso contrario, se realizarn directamente en el disco, utilizando segmentos temporales. El SGA se divide en cuatro grandes zonas:

Database buffer cache: almacena los bloques que se han ledo de los datafiles. Cada vez que es necesario acceder a un bloque, se busca el bloque en esta zona, y en caso de no existir, se lee de nuevo del datafile correspondiente. Cuantos ms bloques quepan en esta zona de memoria, mejor ser el rendimiento. Area de Contexto: es la zona de memoria se almacenan compiladas las ltimas sentencias SQL (y bloques PL/SQL) ejecutadas. Adems se almacenan las variables acopladas (bind), el rbol de parsing, los buffer de ejecucin y el plan de ejecucin. Es importante que siempre que se utilice la misma sentencia, sea exactamente igual, para poder aprovechar sentencias previas almacenadas en el SQL Area. Es decir, las siguientes sentencias: SELECT * FROM TABLA select * from tabla SELECT * FROM TABLA SELECT *

10

GESTIN DE BASES DE DATOSFROM tabla se consideran distintas y no se aprovecha el SQL Area. Debe coincidir el texto exactamente, considerando maysculas y minsculas, espacios, retornos de carro, nombre de parmetros, etc. Esto es debido a que se buscan dentro del SQL Area utilizando un hash de la sentencia, y un simple espacio (o cambiar una letra a maysculas) hace que el hash resultante sea distinto, por lo que no encontrar la sentencia dentro del SQL Area. Cuanto mayor sea el espacio del SQL Area, se realizarn menos compilaciones, planes de ejecucin y anlisis lxicos, por lo que la ejecucin de las consultas ser ms rpida.

Redo cache: almacena los registros de redo de las ltimas operaciones realizadas. Estos registros se almacenan en los archivos de redo, que sirven para recomponer la base de datos en caso de error. Dictionary cache: almacena datos del diccionario de Oracle, para utilizarlos en los planes de ejecucin, optimizacin de consultas, etc. Cuantos ms datos quepan en esta zona, mayor probabilidad habr de que el dato que necesitamos ya est en memoria, y no sea necesario acceder a las tablas del diccionario para leerlo.

ESTRUCTURA DE UNA BASE DE DATOSUna Base de Datos Oracle est estructurada por los siguientes elementos:

1. La Instancia de memoria que contienen la SGA 2. Ejecucin de procesos en back ground (Procesos en segundo plano)3. Archivos fsicos de la Base de Datos entre los que tenemos: Archivos de inicializacin Adems de estructuras de disco y de memoria, un servidor Oracle necesita ciertos archivos para poder ejecutarse. Estos archivos se establecen durante la creacin de la base de datos, y se consultarn cada vez que se arranque la base de datos, por lo que deben estar disponibles. Bsicamente podemos diferenciar los siguientes tipos de archivos:

a. Control files: son archivos de control que se consultan cada vez que se arranca labase de datos. Indica datos como la localizacin de los datafiles, nombre de la base de datos.

b. Init file: es el archivo que contiene los parmetro de inicio de la base de datos(tamao del bloque, tamao del SGA, etc.). Normalmente tiene el nombre INIT.ORA

c. Redo logs: estos archivos contienen un historial de todas las instrucciones quehan sido lanzadas a la base de datos, para poder recuperarla en caso de fallo. No se utilizan durante la inicializacin, sino durante toda la ejecucin de la base de datos.

Archivos de la Base de Datos.- Datafiles

11

GESTIN DE BASES DE DATOS

COMPONENTES DE UN SISTEMA DE BASE DE DATOS

Despus de arrancada una instancia, Oracle asocia esta instancia con la base de datos especifica. Esto se conoce con el nombre de Montar la Base de Datos. La Base de Datos luego debe ser accesible a usuarios autorizados y se conoce con el nombre de Abrir la Base de Datos. PROCESOS DE ORACLE DATABASE WRITER(dbwr) Se encarga de escribir bloques de datos modificados desde los buffers de la base de datos a los datafiles. LOG WRITER(lgwr) Escribe los buffers de los REDO LOGS al disco. SYSTEM MONITOR(smon) Ejecuta una recuperacin de la base de datos cuando una instancia falla al ser arrancada, limpiando los segmentos temporales que ya no estn en uso y restaura las transacciones al estado que estaban antes que se produzca la falla. PROCESS MONITOR(pmon) Ejecuta procesos de recuperacin cuando un proceso de usuario falla. Es responsable de limpiar el cach y libera recursos que el proceso usaba realizando un ROLLBACK de la base de datos. ARCHIVER(arch) Escribe los archivos REDO LOG a un dispositivo de archivo cuando el rea de los mismos se haya llenado. Checkpoint (CKPT) Durante perodos especficos de tiempo, los buffers de la base de datos en el SGA son escritos a los datafiles por el DBWR; este proceso es llamado checkpoint, el cual es responsable de sealar al DBWR que buffers han sido actualizados.

12

GESTIN DE BASES DE DATOSRecoverer (RECO) Es usado para resolver transacciones distribuidas que estn pendientes en la red o cuneado el sistema falla en una base de datos distribuida automticamente realizando commit o rollback..

SEGMENTOS DE UNA BASE DE DATOSBOOTSTRAP SEGMENT Es un segmento especial conteniendo las definiciones del diccionario de datos que son cargados cuando la base de datos es abierta permitiendo subir a la base. No se tiene control para este segmento. DATA SEGMENT Es definido como el espacio asignado a las tablas de datos. INDEX SEGMENT Incluye un espacio reservado que se utiliza en la generacin de ndices de las tablas. TEMPORARY SEGMENT Es un tipo especial de almacenamiento asociado con los usuarios de SQL durante la ejecucin de consultas. ROLLBACK SEGMENT Es el segmento donde se almacena la informacin hasta que se complete la transaccin y actualice la base de datos o se realice un rollback.

ALMACENAMIENTO DE DATOS EN ORACLEPara almacenar datos Oracle divide lgicamente a la Base de Datos en unidades ms pequeas que se conocen con el nombre de Tablespaces. Entonces una Base de Datos est formada por una o varias unidades lgicas llamadas Tablespaces.

TABLESPACEUn tablespace no es un fichero fsico en el disco, simplemente es el nombre que tiene un conjunto de propiedades de almacenamiento que se aplican a los objetos (tablas, ndices, permisos, secuencias) que se van a crear en la base de datos bajo el tablespace indicado. Un objeto en base de datos debe estar almacenado obligatoriamente dentro de un tablespace. Las propiedades que se asocian a un tablespace son: Localizacin de los ficheros de datos. Especificacin de mximas cuotas de consumo de disco. Control de la disponibilidad de los datos (en lnea o fuera de lnea). Backup de datos.

Cuando un objeto se crea dentro de un cierto tablespace, este objeto adquiere todas las propiedades antes descritas del tablespace utilizado.

13

GESTIN DE BASES DE DATOSEn este esquema podemos ver que, por ejemplo, la tabla ARTICULO se almacena dentro del tablespace A, y que por lo tanto tendr todas las propiedades del tablespace A que pueden ser: Sus ficheros de datos estn en $ORACLE_HOME/datos/datos_tablespace_A Los objetos no pueden ocupar ms de 10Mb de espacio de base de datos. En cualquier momento se puede poner fuera de lnea todos los objeto de un cierto tablespace. Se pueden hacer copias de seguridad slo de ciertos tablespaces.

Si nos fijamos, se puede apreciar que es posible tener una tabla en un tablespace, y los ndices de esa tabla en otro. Esto es debido a que los ndices no son ms que objetos independientes dentro de la base de datos, como lo son las tablas. Y al ser objetos independientes, pueden ir en tablespaces independientes. En el esquema tambin vemos que hay un tablespace Temporal (en gris oscuro). Este representa las propiedades que tendrn los objetos que la base de datos cree temporalmente para sus clculos internos (normalmente para ordenaciones y agrupaciones). Su creacin difiere en una de sus clusulas de creacin. El tablespace RO (en gris claro) difiere de los dems en que es de solo lectura (Read Only), y que por lo tanto todos los objetos en l contenidos pueden recibir rdenes de consulta de datos, pero no de modificacin de datos. Estos pueden residir en soportes de slo lectura, como pueden ser CDROMs, DVDs, etc. Cuando se crea un tablespace, ste se crea de lectura/escritura. Despus se puede modificar para que sea de solo lectura.

El Tablespace SystemCuando se crea una base de datos es obligatorio crear un tablespace inicial en el que se van a crear los usuarios SYS y SYSTEM automticamente. Estos usuarios son los que tienen la informacin necesaria para que funcione nuestra base de datos y podamos hacer todo tipo de operaciones como, por ejemplo, crear nuevos usuarios o crear nuevos tablespaces y tablas en esos nuevos tablespaces. Este tablespace inicial se llama por defecto SYSTEM. Es una pieza clave para un buen funcionamiento de la base de datos ya que en l residen todos los objetos de los usuarios SYS y SYSTEM. En l se almacenan todos los datos de sistema, el catlogo y todo el cdigo fuente y compilado de procedimientos PL/SQL. Es muy recomendable crear al menos otro tablespace nuevo distinto al SYSTEM. As, todos los nuevos usuarios que creemos en nuestra base de datos, junto con todas sus tablas e ndices se almacenarn en un tablespace diferente a SYSTEM. Se realiza esta separacin para evitar que se bloquee toda la base de datos si ocurre algo grave en el tablespace SYSTEM. Suele ser habitual que para nuestras aplicaciones creemos usuarios y tablas en las que introducimos informacin y que sin darnos cuenta se llene de informacin el tablespace en el que estn estas tablas. Si no hemos sido previsores, podemos haber llenado el tablespace SYSTEM con lo que es posible que se paralice toda la base de datos. Un tablespace puede estar en lnea o fuera de ella (Online o OffLine), esto es que todos los objetos contenidos en l estn a disposicin de los usuarios o estn inhabilitados para restringir su uso.

14

GESTIN DE BASES DE DATOSCualquier objeto almacenado dentro de un tablespace no podr ser accedido si este est fuera de lnea.

Manipulando TablespacesAhora que nos hemos hecho una idea acerca de qu es un tablespace, vamos a realizar sobre l las manipulaciones bsicas. Partimos de una base de datos creada y levantada. Nos conectaremos a la misma con el usuario SYSTEM y su contrasea. La contrasea del usuario SYSTEM al crear la base de datos es, por defecto, MANAGER. Como medida de seguridad se recomienda cambiarla cuanto antes. Por lo tanto nos conectaremos bien al SqlPlus mediante sqlplus system/manager, o bien al server manager mediante el comando svrmgrl system/manager. Crear un Tablespace. En primer lugar vamos a crear un tablespace llamado Prueba. Esto lo podemos hacer por ejemplo desde el SQLPLUS conectados como system. Create tablespace prueba datafile '/users/oradata/orcl/prueba01.dbf' size 100M; Con esta sentencia estamos creando en nuestra base de datos un tablespace nuevo llamado "prueba" y que est formado fsicamente por un fichero (datafile) llamado prueba01.dbf de 100 Mbytes y que est en el directorio "/users/oradata/orcl". Esta sentencia crea fsicamente dicho fichero. Aumentar de tamao un Tablespace. Para aumentar el tamao de un tablespace que se nos ha quedado ya pequeo, tenemos varias posibilidades. La primera de ellas es crear un nuevo datafile y asignrselo al tablespace que queremos aumentar. Esto lo podemos hacer con la instruccin siguiente. Alter tablespace prueba add datafile '/users/oradata/orcl/prueba02.dbf' size 50M; Con esta sentencia hemos creado un nuevo fichero fsico en nuestro directorio /users/oradata/orcl de 50 Mbytes de tamao y se lo hemos asignado al tablespace "prueba". Otra posibilidad es ampliar el tamao de uno de los ficheros fsicos o datafiles que forman el tablespace. Esto lo podemos hacer fcilmente con la siguiente instruccin: Alter datafile '/users/oradata/orcl/prueba01.dbf' resize 150M; Con esta sentencia lo que hacemos es aumentar el datafile que forma parte de nuestro tablespace en 50 Mbytes. Tanto en la instruccin de crecin como en la de aumentar el tamao de un tablespace se puede observar fcilmente cmo un datafile pertenece solamente a un tablespace ya que en la propia sentencia se crea el fichero fsico o datafile.

15

GESTIN DE BASES DE DATOSBorrando un tablespace. Para eliminar un tablespace de la base de datos se debe utilizar la sentencia: Drop tablespace prueba;

Tablespaces Online y OfflineUn tablespace puede estar en dos estados: Online y Offline. Que un tablespace est online significa que est disponible para operar en l, mientras que si est offline quiere decir que no se puede utilizar. Cuando creamos un tablespace, se crea en estado online y, por lo tanto, podemos crear en dicho tablespace objetos como ndices, tablas, etc. Cmo sabemos en qu estado se encuentran nuestros tablespaces?. Existe una vista que nos da informacin sobre los tablespaces de nuestra base de datos. Esta vista es la dba_tablespaces. Consultndola podemos conocer qu tablespaces tenemos en nuestra base de datos y en qu estado se encuentran. select tablespace_name, status from dba_tablespaces; Para qu queremos poner un tablespace offline?. Hay que tener en cuenta que cuando un tablespace est offline, no se puede acceder a ningn objeto que se encuentre en l, es decir, que si en el tablespace hay tablas, no se podr hacer consultas ni inserciones ni modificaciones de estas tablas, sin embargo, el resto de los objetos que se encuentran en otros tablespaces de la base de datos si estn accesibles. Por lo tanto, pondremos un tablespace offline en general para realizar tareas administrativas. Para poder hacer una copia de seguridad del tablespace estando completamente seguros de que nadie est modificando los objetos del tablespace y que no quedan transacciones pendientes sin terminar y que pueden modificar estos objetos. Para poder actualizar una aplicacin que se basa en los objetos de este tablespace sin que ningn usuario pueda modificar los datos en medio de la actualizacin.

En un tablespace puede haber objetos de varios tipos, como hemos indicado. Si en un tablespace existen segmentos de rollback activos, no se puede poner offline, primero hay que desactivar los segmentos de rollback activos del tablespace. Cmo sabemos los rollback segments que existen en un tablespace y su estado?. Muy sencillo, con la siguiente sentencia: select rollback_segment, status, tablespace_name from dba_rollback_segs; As podremos ver todos los rollback que tenemos, en qu estado se encuentran (online, offline) y en qu tablespace estn. Si comprobamos que en el tablespace que vamos a poner offline tenemos algn segmento de rollback online (activo), debemos ponerlo offline antes que el tablespace. Para desactivar un segmento de rollback, ejecutaremos la siguiente sentencia desde el SqlPlus o desde el server manager. alter rollback segment nombre_de_segmento offline;

16

GESTIN DE BASES DE DATOSCuando ya no queden segmentos de rollback en estado online en nuestro tablespace, ya podremos desactivarlo para que no se pueda acceder a l. alter tablespace nombre_de_tablespace offline; Finalmente, cuando terminemos nuestras tareas administrativas sobre dicho tablespace, ya podemos activarlo para que todos sus objetos vuelvan a estar accesibles por los usuarios. alter tablespace nombre_de_tablespace online; Por supuesto, no debemos olvidar que si hemos tenido que desactivar algn segmento de rollback que se encontraba en nuestro tablespace, ahora deberemos volver a activarlo. alter rollback segment nombre_de_segmento online; Una curiosidad sobre los tablespaces que no estn disponibles (offline), es que, como ya hemos comentado, no se pueden realizar consultas ni modificaciones ni inserciones en los datos de las tablas que estn en ellos, pero si que se pueden eliminar objetos de dicho tablespace, que no es lo mismo que borrar datos de objetos del tablespace. Tambin es muy habitual que en el diseo de las bases de datos, se creen tablespaces para almacenar los ndices de la aplicacin y otros distintos para almacenar las tablas o datos. En estos casos, si desactivamos el tablespace en el que se encuentran los ndices, podemos seguir accediendo a las tablas y realizar consultas sobre ellas porque su tablespace est accesible. Por otro lado, es posible que si en servidor Oracle se encuentra con graves problemas para escribir en un tablespace, al cabo de varios intentos lo ponga automticamente offline. Queremos apuntar aqu, aunque se escapa a los objetivos de este manual, que cuando un tablespace est offline, la informacin de que esto ha ocurrido se queda almacenadada en el tablespace SYSTEM de esta base de datos. Existe una forma de transportar un tablespace de una base de datos a otra para tener accesibles sus objetos en la segunda, pero si el tablespace est offline en la primera, nunca podr ponerse online en la base de datos destino ya que, como hemos dicho, la informacin del estado de este tablespace se encuentra en el tablespace SYSTEM de la base de datos originaria del tablespace.

Tablespaces Read OnlyCuando creamos un tablespace, podemos crear en l todos los objetos que queramos y acceder a ellos y eliminarlos y tambin consultar los datos de las tablas que se encuentren en este tablespace, as como borrar, insertar y modificar estos datos. Existe la posibilidad de poner un tablespace en un estado en el cual, solamente se pueden consultar los datos de los objetos, no se puede ni borrar ni insertar nada en ellos. La principal ventaja de un tablespace read only es que, como no se pueden modificar los datos que en l se encuentran, no hace falta hacer backup del mismo. Dependiendo de las apliaciones que tengamos en nuestra base de datos nos puede interesar tener tablespaces read only o no. Por ejemplo, si tenemos una aplicacin en la que se pueden consultar cientos de fotos de animales salvajes o de paisajes, podramos crear un tablespace en el que introducir estas imgenes y luego ponerlo read only.

17

GESTIN DE BASES DE DATOSGeneralmente un tablespace de estas caractersticas, que sirve de almacenamiento de fotos o temas similares, suele ocupar mucho espacio, por lo que hacer un backup del mismo todos los das puede resultar muy costoso en tiempo y espacio. Adems, si no se modifican nunca estas fotos no tiene mucho sentido hacer copia de seguridad del mismo, y no solo eso, podramos incluso almacenar dicho tablespace en un CDROM en vez de ocupar espacio en disco. Para poner un tablespace en estado read only, simplemente debemos ejecutar la siguiente instruccin: alter tablespace nombre_de_tablespace read only; Como hemos indicado, en un tablespace read only solo se pueden realizar consultas de los datos, por lo tanto, si en el instante de ejecutar esta sentencia se estn realizando modificaciones o inserciones o borrado de datos, el servidor espera hasta que acaben para poner el tablespace en estado read only. Para ver si ha quedado en estado read only, simplemente ejecutamos la misma select que al principio para ver la informacin general de los tablespaces: select tablespace_name, status from dba_tablespaces; Si por algn motivo necesitamos modificar los datos que se encuentran almacenados en espace un tablespace read only, simplemente deberemos ponerlo en primer lugar en estado read write y una vez realizada la modificacin, volver a ponerlo en su estado read only. La sentencia que debemos ejecutar ser: alter tablespace nombre_de_tablespace read write; Tenemos un concepto que debe quedar claro. Un tablespace read only no necesita backup, y por tanto, recovery, pero, esto no hay que tomarlo al pie de la letra. Siempre hay que hacer al menos un backup. En primer lugar creamos un tablespace vaco en el que iremos metiendo poco a poco toda la informacin que nos interesa que, como en el caso que hemos supuesto anteriormente, pueden ser varias tablas que almacenan fotos de animales y paisajes. Cuando ya no vamos a crear nuevas imgenes es cuando ponemos el tablespace read only, pero ah si debemos hacer una copia de seguridad, backup, y como ya no vamos a tocar nunca ms este tablespace ser la nica. Si por algn motivo decidimos poner este tablespace otra vez read write para crear o borrar datos, despus de volver a ponerlo read only deberemos hacer un backup de los nuevos datos. Tambin hay que diferenciar dos ideas. Por un lado hemos dicho que en un tablespace read only no se pueden modificar, ni insertar ni borrar datos de sus tablas. Sin embargo y, al igual que en los tablespaces offline, si se pueden borrar objetos enteros del tablespace, como por ejemplo un ndice o una tabla.

Tablespaces TemporalesUn tablespace temporal es aqul en el que solamente puede haber objetos temporales. No se pueden crear en l objetos permanentes como pueden ser los ndices, las tablas o los segmentos de rollback. Estn especialmente preparados para optimizar las operaciones en las que se lleven a cabo ordenaciones. Por lo tanto est muy recomendado tener al menos un tablespace temporal en cada base de datos. Algunas de las operaciones que implican realizar ordenaciones son, las selects que tienen group by, las que tienen order by, la creacin de ndices y analizar ndices para calcularles las estadsticas. En todos estos casos, cuando para realizar la ordenacin el servidor no encuentra espacio suficente libre en la memoria, utiliza el tablespace temporal. Los rendimientos son muy superiores comparndolos con los tiempos que se empleara en realizar las ordenaciones

18

GESTIN DE BASES DE DATOSen tablespaces normales. Esto se debe a que el mecanismo que se utiliza para reservar y desreservar el espacio en los tablespaces temporales es muy distinto que en los normales ya que est orientado a objetos que crecen mucho y rpido y que a continuacin disminuyen totalmente su tamao y desaparecen. Para crear un tablespace temporal simplemente hay que aadir la palabra TEMPORARY a la instruccin utilizada para crear tablespaces normales. Siguiendo el ejemplo indicado en la creacin de tablespaces, podramos tener lo siguiente: Create tablespace prueba datafile '/users/oradata/orcl/prueba01.dbf' size 100M temporary; Para indicar a un usuario de base de datos que sus ordenaciones debe hacerlas en un determinado tablespace temporal, hay que lanzar una sentencia como la que sigue. Alter user nombre_de_usuario temporary tablespace nombre_de_tablespace; Y para conocer qu usuarios existen en nuestra base de datos y cual es el tablespace temporal que utilizan, podemos consultar la base de datos de la siguiente manera: Select username, temporary_tablespace from dba_users; Y finalmente, si queremos conocer qu tablespaces tenemos y cules son temporales y cuales son permanentes, podemos consultar la vista que nos da la informacin sobre los tablespaces, es decir, la vista dba_tablespaces; Select tablespace_name, contents from dba_tablespaces; Como nota final apuntaremos que un tablespace permanente puede pasar a temporal y que uno temporal puede pasar a permanente. Adems cada uno de estos Tablespaces estn formados por uno o varios archivos fsicos llamados Datafiles.

19

GESTIN DE BASES DE DATOSTemas Relacionados para CONSULTARRelacionado directamente con este tema, se pueden estudiar tambin los siguientes temas: Parametrizacin de los tablespaces. Qu es la clusula storage? qu son initial_extent, next_extent, pct_increase?. Cmo conseguimos que un usuario pueda crear tablas o ndices en un tablespace?. Qu es la fragmentacin de los tablespaces y cmo se soluciona?. Qu son los tablespaces transportables?. Qu son los tablespaces locales?. Qu es la normativa O.F.A. de Oracle y cmo se aplica a los tablespaces?.

DATAFILE (FICHERO DE DATOS)Un datafile es la representacin fsica de un tablespace. Son los "ficheros de datos" donde se almacena la informacin fsicamente. Un datafile puede tener cualquier nombre y extensin (siempre dentro de las limitaciones del sistema operativo), y puede estar localizado en cualquier directorio del disco duro, aunque su localizacin tpica suele ser $ORACLE_HOME/Database. Un datafile tiene un tamao predefinido en su creacin (por ejemplo 100Mb) y este puede ser alterado en cualquier momento. Cuando creemos un datafile, este ocupar tanto espacio en disco como hayamos indicado en su creacin, aunque internamente est vaco. Oracle hace esto para reservar espacio continuo en disco y evitar as la fragmentacin. Conforme se vayan creando objetos en ese tablespace, se ir ocupando el espacio que cre inicialmente. Un datafile est asociado a un solo tablespace y, a su vez, un tablespace est asociado a uno o varios datafiles. Es decir, la relacin lgica entre tablespaces y datafiles es de 1-N.

En el esquema podemos ver como el Tablespace A est compuesto (fsicamente) por tres datafiles (DATOS_1.ORA, DATOS_2.ORA y DATOS_3.ORA). Estos tres datafiles son los ficheros fsicos que soportan los objetos contenidos dentro del tablespace A. Aunque siempre se dice que los objetos estn dentro del tablespace, en realidad las tablas estn dentro del datafile, pero tienen las propiedades asociadas al tablespace.

20

GESTIN DE BASES DE DATOSCada uno de los datafiles utilizados est ocupando su tamao en disco (50 Mb los dos primeros y 25 Mb el ltimo) aunque en realidad slo contengan dos objetos y estos objetos no llenen el espacio que est asignado para los datafiles. Los datafiles tienen una propiedad llamada AUTOEXTEND, que se si est activa, se encarga de que el datafile crezca automticamente (segn un tamao indicado) cada vez que se necesite espacio y no exista. Al igual que los tablespaces, los datafiles tambin pueden estar en lnea o fuera de ella. Cuando se van creando objetos en un tablespace, stos fsicamente se van almacenando en los datafiles asignados a dicho tablespace, es decir, cuando creamos una tabla y vamos insertando datos en ella, estos datos realmente se reparten por los ficheros fsicos o datafiles que forman parte del tablespace. No se puede controlar en qu fichero fsico se almacenan los datos de un tablespace. Si un tablespace est formado por 2 datafiles y tenemos una tabla en ese tablespace, a medida que vamos insertando filas stas se almacenarn en cualquiera de los dos datafiles indistintamente, es decir, unas pueden estar en un datafile y otras en otro. El espacio total disponible en un tablespace es lgicamente la suma de los tamaos que ocupan los ficheros fsicos o datafiles que lo forman. Como hemos indicado estos datafiles, al crearlos, estn totalmente vacos, simplemente es un espacio reservado y formateado por Oracle para su uso. A medida que se van creando objetos en ellos como tablas, ndices, etc y se van insertando registros en estas tablas, los datafiles se van llenando o, lo que es lo mismo, el tablespace se va llenando.

Creacin y ManipulacinLa creacin de datafiles est estrechamente relacionada con el tablespace al que va a pertenecer. Tenemos varias formas de crear datafiles. Cada vez que se crea un tablespace nuevo, hay que indicar obligatoriamente cual es el datafile que va a pertenecer a dicho tablespace y, en ese momento, se crea tanto el tablespace como su datafile. Tambin se pueden aadir datafiles nuevos a un tablespace que ya existe. Esto se suele hacer cuando un tablespace se est llenando y est a punto de llegar a su capacidad mxima. Al aadir un datafile a un tablespace, se aumenta el espacio disponible en dicho tablespace en tantos megabytes como tenga el datafile nuevo recin creado. Creacin de un nuevo datafile de 50 megabytes junto con un nuevo tablespace: Create tablespace nombre_tablespace datafile '/users/oracle/orcl/nombre_datafile.dbf' size 50M; Una vez creado este tablespace, si con el tiempo queremos aadirle espacio, lo podemos hacer creando un nuevo datafile y asignndoselo al tablespace: Alter tablespace nombre_tablespace add datafile '/users/oracle/orcl/nombre_datafile2.dbf' size 100M; Con estas dos instrucciones hemos creado un tablespace nuevo en nuestra base de datos en el que caben 150 megabytes de informacin. Este espacio est formado fsicamente por dos ficheros llamados nombre_datafile.dbf y nombre_datafile2.dbf que se encuentran en el directorio /users/oracle/orcl de nuestra mquina y que ocupan 50 y 100 Mbytes respectivamente.

21

GESTIN DE BASES DE DATOSPara conocer los datafiles que forman parte de nuestra base de datos, podemos consultar la vista dba_data_files en la que se nos indica por cada datafile o fichero de datos, a qu tablespace pertenece y cuanto espacio total tiene reservado. Es importante recalcar que el espacio que aparece en esta vista es el espacio total que ocupa el fichero fsico y no el espacio utilizado de ese fichero, es decir, que si creamos un datafile de 50Mbytes y acto seguido consultamos esta vista, veremos que ocupa 50Mbytes a pesar de estar totalmente vaco. Este dato indica la cantidad de espacio que ocupa el fichero fsico, la cantidad de informacin que podremos introducir en l. select tablespace_name, file_name, bytes /1024/1024 from dba_data_files; Tenemos tambin la posibilidad de aumentar el tamao de un datafile, es decir, podemos conseguir que un tablespace tenga ms sitio vaco aumentando uno o varios de los ficheros fsicos que lo forman, en lugar de aadindole un nuevo fichero fsico. Para aumentar el tamao de un datafile, podremos utilizar la siguiente instruccin: alter database datafile '/users/oracle/orcl/nombre_datafile.dbf' resize 100M; Esta instruccin deja el datafile indicado con un tamao de 100M, no es que se aumente en 100Mbytes. Esto es fcil de recordar, vale con pensar en que esta instruccin se utiliza tambin para disminuir el tamao de un datafile que en un primer lugar lo creamos excesivamente grande. En esta instruccin no se pueden utilizar nmeros negativos, por lo que parece claro que si ponemos un nmero queremos indicar que ser el tamao que queremos que tenga nuestro datafile. Es importante tener en cuenta que no siempre podemos disminuir el tamao de un datafile. Los motivos sern explicados en temas ms avanzados y tienen que ver con la forma que tiene Oracle de reservar el espacio dentro de los tablespaces y datafiles. Existe una posibilidad de que Oracle aumente automticamente el tamao de sus datafiles cuando stos se estn llenando, para evitar as la intervencin manual del administrador de la base de datos. Se puede hacer de varias formas, al crear el tablespace con el datafile, al aadir un nuevo datafile al tablespace o incluso en cualquier otro momento. Para indicar que queremos que un datafile aumente automticamente cuando aadimos un nuevo datafile a un tablespace existente podemos utilizar: alter tablespace nombre_tablespace add datafile nombre_datafile size 100M autoextend on next 250K maxsize 200M; Con esta instruccin lo que estamos haciendo es aadir un nuevo datafile llamado nombre_datafile a nuestro tablespace nombre_tablespace con 100Mbytes de tamao. Adems, estamos indicando que queremos que aumente por si mismo cada vez que se llene y que aumente en bloques de 250 Kbytes cada vez. Finalmente le ponemos un tope al tamao total que queremos que tenga nuestro datafile con la instruccin maxsize, por lo que una vez que llegue a 200 Mbytes, si se llena, no volver a crecer ms. Para indicar en cualquier momento que queremos que un datafile no crezca ms automticamente, podemos utilizar: alter database datafile nombre_datafile autoextend off; Y para indicar en cualquier momento que un determinado datafile crezca automticamente, la instruccin que ejecutaremos ser:

22

GESTIN DE BASES DE DATOSalter database datafile nombre_datafile autoextend on next 1 M maxize 300 M; Nota: en esta sentencia, se puede indicar que queremos que crezca indefinidamente, sin tome mximo. Esto lo conseguimos con "maxsize unlimited", pero es muy peligroso porque por algn problema descontrolado, nos puede crecer tanto que nos quedemos si disco en la mquina y luego es muy complicado restaurar un tamao normal.

Renombrando DatafilesExiste la posiblidad de cambiarle el nombre a un datafile o de cambiarlo de directorio. Esta operacin no consiste simplemente en ir al sistema operativo y cambiarle el nombre, ya que si hiciramos eso, Oracle no se da cuenta de que hemos movido de sitio un datafile y cuando intenta acceder a informacin de ese datafile muestra mensajes de error indicando que no lo encuentra. Hay que distinguir entre los datafiles del tablespace SYSTEM y el resto. Los datafiles del tablespace SYSTEM son especiales y no se pueden mover con la misma facilidad que los dems. Renombrando datafiles que no son del tablespace SYSTEM En primer lugar, hay que comprobar cual es nombre y el path completo del fichero a mover y el estado en que se encuentra dicho fichero. Para realizar esta comprobacin podemos consultar la vista dba_data_files. select file_name, status, bytes from dba_data_files; En file_name se nos indica cual es el nombre del datafile que nos interesa, con todo su path, y adems vemos cuanto ocupa. El campo status podremos comprobar si el datafile est disponible (available). Nota: No se debe mover el datafile fsico sin antes poner el tablespace offline. Hay que sealar que file_name es el nombre que Oracle cree en ese mismo instante que tiene su datafile. Si vamos al sistema operativo y movemos el datafile de sitio, Oracle no es consciente de lo que hemos hecho por lo que si volvemos ha realizar esta select nos seguir dando los mismos valores. Hay que conseguir decirle a Oracle que realmente hemos movido o renombrado el fichero. Ahora que sabemos cual es el path y nombre completo de nuestro datafile, tenemos que evitar que se realicen operaciones que modifiquen los datos de los objetos de nuestro tablespace, para que as consigamos tener el contenido del datafile esttico. Esto se consigue poniendo el tablespace en estado read only, como se explic en el tema de los tablespaces. alter tablespace nombre_tablespace read only; Para comprobar que realmente est nuestro tablespace en estado read only, podemos consultar la vista dba_tablespaces. En estos momentos, los usuarios de la base de datos, pueden acceder y modificar la informacin de cualquier tablespace que no sea el que estamos manipulando, en el cual, solamente podrn realizar operaciones de lectura, nunca inserciones ni modificaciones ni borrados de datos. Es en este instante, cuando sabemos que no se est modificando el contenido de nuestro tablespace y, por lo tanto, de nuestro datafile, cuando debemos ir al sistema operativo y hacer una

23

GESTIN DE BASES DE DATOScopia de nuestro datafile con el nuevo nombre y la nueva ubicacin. Una vez copiado, comprobamos tambin desde el sistema operativo que el nuevo datafile ocupa el mismo espacio que el antiguo, para estar seguros de que no ha habido ningn problema en la copia. Hasta ahora, no le hemos indicado a Oracle que hemos movido de ubicacin o de nombre a uno de sus datafiles, para poder indicrselo, debemos asegurarnos que no hay ningn usuario utilizando el tablespace, ni siquiera en modo consulta. Por lo tanto, debemos deshabilitar el tablespace. alter tablespace nombre_tablespace offline; Y una vez deshabilitado, indicamos a Oracle el cambio de nombre o de ubicacin: alter database rename file 'viejo_datafile_con_path' to 'nuevo_datafile_con_path'; En estos momentos Oracle ya sabe que cuando tenga que buscar la informacin de ese datafile debe buscarlo en el nuevo path indicado y con el nuevo nombre. Por lo tanto, si lanzamos la select para ver los datafiles de la base de datos, es decir, la select de la vista dba_data_files, comprobaremos que ha cambiado la informacin antigua por la nueva. Ahora solamente nos queda activar el tablespace y permitir operaciones de lectura y escritura en l. alter tablespace nombre_tablespace online; alter tablespace nombre_tablespace read write; Por supuesto, antes de realizar cualquier operacin que implique modificacin de las estructuras de la base de datos, como el renombrado de un datafile, se debe hacer un backup completo de la misma. Una vez realizada la operacin tambin se recomienda hacer un nuevo backup. Nota: hay que resaltar una vez ms, que no se debe mover el datafile desde el sistema operativo sin haber puesto con anterioridad su tablespace offline. De no ser as, si alguien manipula datos durante el tiempo que tarda en hacerse la copia en el sistema operativo, Oracle detecta problemas e invalida el datafile, lo que va a provocar que haya que poner en prctica alguna estrategia de backup para recuperar el datafile invalidado. Renombrando datafiles del tablespace SYSTEM El tablespace SYSTEM es especial, por lo tanto, para manipular sus datafiles, hay que hacerlo tambin de manera especial. Nadie puede trabajar con la base de datos. Por ese motivo, se debe apagar la base de datos y levantarla pero sin abrirla. Los conceptos de apagar la base de datos y levantarla no son objeto de este manual por lo que simplemente se indicarn las instrucciones. Primeramente se debe apagar o, ms coloquialmente, tirar abajo la base de datos. Esto lo hacemos desde el Server Manager, no desde SqlPlus. Nos conectamos al Server Manager como el usuario administrador y con privilegios especiales: svrmgrl connect internal shutdown; Despus de esperar a que se terminen las transacciones activas, las base de datos se apaga y podemos volver a levantarla, tambin desde el Sever Manager, pero sin abrirla, solamente montndola.

24

GESTIN DE BASES DE DATOSstartup mount; Con esta instruccin hemos levantado la base de datos pero no la hemos abierto, por lo que nadie, excepto otro administrador, puede estar manipulando sus objetos. Ahora podemos realizar la copia de los datafiles del tablespace SYSTEM al nuevo directorio o con el nuevo nombre. Comprobamos que tanto el fichero nuevo como el antiguo tengan el mismo tamao y a continuacin indicamos a Oracle que hemos movido el datafile de la misma manera que en el apartado anterior: alter database rename file 'viejo_datafile_con_path' to 'nuevo_datafile_con_path'; Finalmente podemos levantar la base de datos para que pueda volver a ser utilizada por todos los usuarios: alter database open; Nota: Despus de comprobar que la base de datos se levanta correctamente, se pueden borrar los ficheros fsicos o datafiles viejos de su ubicacin antigua ya que Oracle est utilizando solamente los nuevos.

Temas Relacionados para CONSULTARRelacionado directamente con este tema, se pueden estudiar tambin los siguientes temas: Es mejor crear pocos datafiles grandes o muchos pequeos?. Cuntos datafiles creamos para nuestra base de datos?. Se deben crear los datafiles en cualquier disco de nuestra mquina?. Los links de sistema operativo, qu son y cmo nos ayudan a la hora de mover datafiles de ubicacin?. Interesa crear datafiles con autoextent? y con maxsize unlimited?. Cmo conocer el espacio libre que tenemos en el datafile?. Qu es la fragmentacin de los datafiles y tablespaces? Cmo evitarla?. Cmo se puede verificar la escritura de los datafiles?. Cmo se aplica la normativa O.F.A. de Oracle a los datafiles?.

Oracle almacena la informacin en unidades lgicas que son los segmentos, las extensiones y los bloques. Estas tres unidades estn relacionadas entre s. Un segmento est formado por una o varias extensiones y cada extensin est formado por varios bloques.

SEGMENTOSUn segmento almacena la informacin de una estructura lgica de Oracle dentro de un Tablespace. Est formado por una o ms extensiones y, a medida que va creciendo el segmento se van asignando nuevas extensiones al mismo. Hay cuatro tipos de segmentos: de datos, de ndices, temporales y de rollback. Se puede decir que, segmento es a un objeto base de datos, lo que datafile a un tablespace: un de un el

25

GESTIN DE BASES DE DATOSsegmento es la representacin fsica del objeto en base de datos (el objeto no es ms que una definicin lgica). Podemos ver cmo el espacio que realmente se ocupa dentro del datafile es el segmento y que cada segmento pertenece a un objeto.

EXTENSIONESUna extensin es una unidad lgica de almacenamiento que est formada por un nmero determinado de bloques de datos contiguos. La agrupacin de una o varias extensiones forman un segmento que puede ser una tabla, un ndice, un segmento de rollback o un segmento temporal. Por lo tanto, datos de una tabla, sabemos que estn en un solo segmento de tipo tabla, que a su vez estar formado por una o varias extensiones y que, cada una de esas extensiones est formada por un nmero determinado de bloques de datos. Cuando se crea un segmento nuevo, es decir, una tabla, un ndice o un segmento de rollback, se crea obligatoriamente una extensin en dicho segmento (en el caso de los rollback se crean dos). El tamao de esta extensin inicial viene dado por el valor parmetro "initial" que se indica en el momento de crear el segmento.

En el esquema vemos como el objeto (tabla) FACTURA tiene un segmento en el datafile A-1, y este segmento est compuesto de 3 extensiones. Una de estas extensiones tiene un color distinto. Esto es porque existen dos tipos de extensiones:

INITIAL (extensiones iniciales): estas son las extensiones que se reservan durante la creacin del objeto. Una vez que un objeto est creado, no se puede modificar su extensin inicial. NEXT (siguientes o subsiguientes extensiones): toda extensin reservada despus de la creacin del objeto. Si el INITIAL EXTENT de una tabla est llena y se est intentando insertar ms filas, se intentar crear un NEXT EXTENT (siempre y cuando el datafile tenga espacio libre y tengamos cuota de ocupacin suficiente).

Sabiendo que las extensiones se crean en momentos distintos de tiempo, es lgico pensar que unas extensiones pueden estar fragmentadas de otras. Un objeto de base de datos no reside todo junto dentro del bloque, sino que residir en tantos bloque como extensiones tenga. Por eso es crtico definir un buen tamao de extensin inicial, ya que, si es lo suficientemente grande, el objeto nunca estar fragmentado.

26

GESTIN DE BASES DE DATOSSi el objeto tiene muchas extensiones y stas estn muy separadas en disco, las consultas pueden retardarse considerablemente, ya que las cabezas lectoras tienes que dar saltos constantemente. La mejor solucin es calcular el tamao que tendr el objeto (tabla o ndice), multiplicando el tamao de cada fila por una estimacin del nmero de filas. Cuando hemos hecho este clculo, debemos utilizar este tamao como extensin INITIAL y NEXT, y tendremos prcticamente la certeza de que no se va a producir fragmentacin en ese objeto. En caso de detectar ms de 10 extensiones en un objeto (consultando el catlogo de Oracle, como veremos), debemos recrear el objeto desde cero (aplicando el clculo anterior) e importar de nuevo los datos.

DATA BLOCKS - BLOQUESUn bloque es la unidad mnima de almacenamiento de informacin de Oracle. A los bloques tambin se les conoce como "bloques de datos", "bloques lgicos" o "bloques oracle". Cada uno de estos bloques est formado por un nmero determinado de bloques del sistema operativo. A la hora de crear una nueva base de datos se debe indicar cuntos bloques de sistema operativo formarn un bloque de datos o bloque oracle. Es muy importante decidir bien este valor de antemano ya que una vez creada la base de datos ya no se puede modificar ms que en migraciones a versiones ms actuales del producto. Un bloque de datos es la mnima unidad de Lectura / Escritura en una base de datos Oracle, es decir, Oracle no lee y escribe en bloques del sistema operativo sino que lo hace en unidades lgicas que son los bloques de datos y que varan de una base de datos a otra en la misma mquina ya que es un valor que se debe indicar en la creacin de cada base de datos Oracle. Oracle recomienda que el tamao de un bloque de datos o, data block, sea siempre un mltiplo del bloque de datos del sistema operativo. En un disco duro no es posible que un fichero pequeo ocupe menos de lo que indique la unidad de asignacin, as si la unidad de asignacin es de 4 Kb, un fichero que ocupe 1 Kb, en realidad ocupa 4 Kb. Siguiendo con la cadena, cada segmento (o cada extensin) se almacena en uno o varios bloques de datos, dependiendo del tamao definido para el extensin, y del tamao definido para el datablock. El siguiente esquema muestra toda la cadena de almacenamiento de Oracle.

27

GESTIN DE BASES DE DATOSDesde el nivel ms fsico al ms lgico: Unidades de asignacin del sistema operativo (El ms fsico. No depende de Oracle) Data blocks de Oracle Extents Segments DataFiles Tablespaces (El ms lgico)

El tamao de las unidades de asignacin del sistema operativo se define durante el particionado del disco duro (FDISK, FIPS), y el espacio de los data blocks de Oracle se define durante la instalacin y no puede ser cambiado. Como es lgico, el tamao de un data block tiene que ser mltiplo del tamao de una unidad de asignacin, es decir, si cada unidad de asignacin ocupa 4 K, los data blocks pueden ser de 4K, 8K, 12K para que en el sistema operativo ocupen 1, 2, 3 unidades de asignacin.

Esquema extrado del Oracle8 Concepts

STORAGETodo objeto que tenga ocupacin fsica en la Base de Datos, tendr una clusula storage en su sintaxis de creacin. El objetivo de esta clusula es definir ciertas propiedades de almacenamiento para el objeto creado, como puede ser tamao de la extensin inicial, tamao de las siguientes extensiones... Sintaxis: STORAGE (INITIAL entero {K|M} NEXT entero {K|M} {MINEXTENTS entero} {MAXEXTENTS entero | UNLIMITED} {PCTINCREASE % entero} ) Initial: Indica el tamao en bytes de la primera extensin que tendr el segmento. Se puede indicar despus del valor una "K" o "M" para que el valor sea interpretado como Kilobytes o Megabytes en lugar de bytes. Si no se pone explcitamente este parmetro en la creacin del segmento, se hereda por defecto el valor que tenga este parmetro en el tablespace en el que se est creando el segmento y que, si no se ha indicado tampoco, por defecto son 5 bytes. Cuando se crea una extensin oracle redondea el tamao indicado al siguiente mltiplo superior a 5 bloques de datos. Por lo tanto, si nuestros bloques son de 8192 bytes y creamos un segmento con un inital de 256Kbytes, realmente estamos creando un segmento de 32 bloques y oracle lo redondea a 35 bloques que es el primer mltiplo superior a 5 de 32. Por lo tanto, nuestra initial extent ser de 35 * 8192 = 280 Kbytes.

28

GESTIN DE BASES DE DATOSPara comprobar estos datos se puede consultar la tabla dba_segments en la que tenemos un registro por cada segmento distinto: Select segment_name, initial_extent, next_extent, pct_increase, min_extent, max_extent from dba_segments; Tambin se puede consultar la vista dba_extents que es un detalle de dba_segments ya que aqu se detalla por cada segmento todas sus extensiones, con su tamao en concreto. Select segment_name, extent_id, blocks, bytes from dba_extents; A pesar de lo que aparece en la documentacin de Oracle sobre los redondeos a mltiplos de 5 bloques, nos hemos encontrado con muchos casos en los que creamos segmentos con una sola extensin de 256 Kbytes con bloques de 8192 bytes (con el caso anterior), y en la vista dba_extents, al consultar el valor de initial_extent sigue siendo 256 Kbytes, y en dba_extents, que es donde debera redondearse realmente dicho valor a un mltiplo de 5, algunas extensiones aparecen con 256 Kbytes y otras con los 280 Kbytes que tericamente deberan tener. Next: Indica el tamao que tendr la prxima extensin que se cree cuando no quede ms sitio en las extensiones que ya tiene asignadas el segmento. De igual manera que en el caso del parmetro initial, Oracle redondea a un mltiplo de 5 bloques este valor, a la hora de crear la extensin nueva. Cada vez que se crea una nueva extensin, se recalcula el valor de este parmetro en funcin del valor de pctincrease y se actualiza la vista dba_segments. Pctincrease: En el momento que se asigna una nueva extensin al segmento, se recalcula el valor que va a tener la prxima que se le asigne y que ser, el tamao de la extensin recin creada (el next que tena el segmento) aumentado en el porcentaje indicado por pctincrease. Por lo tanto, si qeremos que todas las extensiones de nuestro segmento tengan el mismo tamao, habr que asignarles el pctincrease a 0. Oracle recomienda establecer por norma el pctincrease a 0 para evitar que se descontrolen los tamaos de los segmentos, especialmente los temporales, aunque, curiosamente, su valor por defecto es de 50%. No se puede modificar el pctincrease de los segmentos de rollback que es siempre 0. Mostremos un ejemplo: tenemos un segmento que en el campo next_extent tiene como valor 262144 y en pct_increase tiene 50 y los bloques son de 8192 bytes. Cuando crezca el segmento y solicite una nueva extensin, sta se crear del tamao indicado en next_extent redondendola al primer mltiplo de 5 bloques superior o igual a dicho valor. En nuestro caso 262144 son 32 bloques as que crear una extensin de 35 que son 286720 bytes. Adems, recalcula el valor del siguiente next_extent aumentando en un 50% el valor del antiguo next_extent, es decir 262144 * 1,5 = 393216 bytes. Nota: el reclculo del siguiente extent (393216) se basa en el valor del anterior next_extent (262144) y no en el valor de la extensin creada al redondear a un mltiplo de 5 bloques (286720), ya que si no, nos habra salido un next_extent de 286720 * 1,5 = 430080. Por lo tanto, al consultar las tabla dba_segments veremos que next_extent es 393216 es decir 48 bloques, aunque, eso si, si se vuelve a llenar esta extensin, se crear realmente una extensin de 50 bloques que son los 430080 bytes.

29

GESTIN DE BASES DE DATOS

Minextents: Se indica el nmero de extensiones que se deben reservar a la vez para un determinado segmento en el momento de su creacin. Por defecto es una excepto en los segmentos de rollback que son dos. Puede que las extensiones no estn contiguas. Por supuesto, si en la clusula storage en la cracin del objeto se indican valores para next y pctincrease, las extensiones iniciales que se crean se recalculan para cumplir lo indicado en estos parmetros. Por ejemplo, creamos un segmento con minextents = 4, con un initial de 262144, next de tambin 262144, bytes y con un pctincrease del 50%, el resultado ser la creacin de 4 extensiones de tamaos, 286720, 286720, 409600, 614400 y de un next extent de 884736. Estos tamaos vienen de redondear 32, 48 y 72 a mltiplos de 5 y el next extent es 108 bloques que es el 50% de 72 bloques. Maxextents: Es el numero mximo de extensiones que se pueden crear en ese objeto, contando tambin la primera. Se puede especificar UNLIMITED con lo que pueden crecer indefinidamente. No se recomienda que a los segmentos de rollback se les asigne unlimited maxextents ya que con operaciones complejas podran aumentar excesivamente de tamao y llenaran el disco. As que hay que tener cuidado a la hora de crear rollback segments, sobretodo porque heredan por defecto el valor del parmetro que tenga asignado el tablespace en el que se crean. Vamos a poner un ejemplo de creacin de una tabla en la que se indican valores para los parmetros de la clusula storage que acabamos de explicar. Crearemos, por ejemplo, una tabla llamada empleado que contiene un solo campo, nombre, con un initial extent de 256 Kilobytes, con 512 Kilobytes de next extent, un pctincrease de 50, con 3 extensiones iniciales y con un mximo de 10 extensiones: create table empleado (nombre varchar2(50)) storage (initial 256K next 512K pctincrease 50 minextents 3 maxextents 10) Si consultamos la vista dba_extents nos mostrar que ha creado las 3 extensiones que le hemos indicado con los siguientes valores: Select extent_id, bytes, blocks from dba_extents where segment_name = 'EMPLEADO' order by extent_id; 0 1 2 286720 532480 819200 35 65 100

Y, al consultar la vista dba_segments o incluso la vista user_tables para este segmento en concreto, observamos el valor de next_extent: Select next_extent from user_extents where segment_name = 'EMPLEADO'; 1179648 que es el resultado de 512K * 1,5 * 1,5.

30

GESTIN DE BASES DE DATOSCuando Oracle necesita asignar una nueva extensin a un segmento realiza el siguiente proceso para buscar bloques de datos contiguos en igual nmero o superior al solicitado por la extensin: En primer lugar, busca un conjunto de bloques contiguos igual al solicitado por la extensin ms uno, para evitar la fragmentacin (excepto cuando la extensin es de 5 o menos bloques). Por lo tanto, si la extensin nueva es de 29 bloques oracle buscar un conjunto de justo 30 bloques libres consecutivos. Si no encuentra ningn conjunto de exactamente ese nmero de bloques, empieza a buscar un conjunto de ms bloques contiguos. Si el primer conjunto que encuentra tiene ms de 5 bloques que los que busca, se queda solamente con los que busca, mientras que si la diferencia es de menos de 5 bloques, se coge todo el conjunto.

Por lo tanto, en nuestro caso, si el primer conjunto que encuentra fuera de 35 o ms bloques, cogera solo los 30 primeros, mientras que si encuentra un conjunto de entre 31 y 34 se lo quedara entero. Nota: En este paso se puede comprobar que, aunque a un segmento le asignemos pctincrease 0, puede que luego nos encontremos en dba_extents algun extensin algo ms grande que otras del mismo segmento. Cuando no encuentra ningn conjunto de bloques de tamao superior al que busca, realiza un coalesce del tablespace, que es un proceso mediante el cual se unen los distintos bloques que han ido quedndose fragmentados en el tablespace al irse creando y eliminando extensiones mediante este proceso. Una vez hecho el coalesce, Oracle vuelve a repetir los pasos anteriores. Si, finalmente no encuentra ningn conjunto de bloques para crear la nueva extensin, intenta aumentar el tamao de alguno de los datafiles del tablespace. Esto solamente lo conseguir si tienen activado el autoexpand. En caso de no conseguirlo, devolver un error. CREATE TABLE FACULTAD ( CODIGO_FACULTAD NUMBER(3) NOT NULL, DETALLE VARCHAR2(10) NOT NULL, CONSTRAINT PK_FACULTAD PRIMARY KEY(CODIGO_FACULTAD) ON DELETE CASCADE TABLESPACE UNIVERSIDAD STORAGE ( INITIAL 2M NEXT 640K PCTINCREASE 50 MINEXTENTS 2 MAXEXTENTS 100) );

31

GESTIN DE BASES DE DATOS CAPITULO IIIProgramacin en PL/SQLEl lenguaje de programacin de Oracle, llamado PL/SQL, es un lenguaje portable, procedural y de transaccin muy potente y de fcil manejo que ampla la funcionalidad de SQL aadiendo estructuras habituales en otros lenguajes de programacin como: Variables y tipos (predefinidos y definidos por el usuario) Estructuras de control (bucles y condiciones IF-THEN-ELSE) Procedimientos y funciones Tipos de objetos y mtodos

con las siguientes caractersticas fundamentales: 1. Incluye todos los comandos de SQL estudiados anteriormente 2. SELECT INSERT UPDATE DELETE.

Es una extensin de SQL, ya que este es un lenguaje no completo dado que no incluye las herramientas clsicas de programacin. Por eso, PL/SQL amplia sus posibilidades al incorporar las siguientes sentencias: Control condicionalIF ... THEN ... ELSE ... ENDIF

-

CiclosFOR ... LOOP WHILE ... LOOP

3. -

Incorpora opciones avanzadas en: Control y tratamiento de errores llamado excepciones. Manejo de cursores.

Creacin de programas PL/SQL.Podemos crear programas con cualquier editor y ejecutarlos desde el prompt de sql con START o @. Los ficheros creados sern de texto y tendrn la extensin sql. Para que un fichero se ejecute correctamente debe tener en su ltima lnea el smbolo /.

32

GESTIN DE BASES DE DATOSCaractersticas de PL/SQLLa unidad bsica en PL/SQL es el bloque. Todos los programas de PL/SQL estn compuestos por bloques que pueden estar anidados.

Estructura del bloque de cdigoVeamos a continuacin la organizacin del bloque de cdigo de PL/SQL, compuesto por cuatro secciones DECLARE, BEGIN, EXCEPTION y END como se detalla en el fuente 1:/* --- Fuente 1 ----------------------------------------------------------[>] Etiqueta que identifica al Bloque. [DECLARE] Declaracin de Variable Constante Cursor

ExcepcinVariables BEGIN Cdigo. [EXCEPTION] Control y tratamiento de errores. Es el punto al que se transfiere el control del programa siempre que exista un problema. Los indicadores de excepcin pueden ser definidos por el usuario o por el sistema, como es por ejemplo la excepcin ZERO_DIVIDE. Las excepciones se activan automticamente al ocurrir un error, existiendo la definicin de la excepcin OTHERS que considera aquellos errores no definidos y que siempre se ubica al final de todas las excepciones. END [nombre del bloque]; Fin del Bloque.

Se inicializa con un valor que no se puede modificar. Area de trabajo que contiene los datos de la fila de la tabla en uso. El cursor es el resultado de una sentencia SELECT. para control de errores.

Con el ejemplo del fuente 2 ilustraremos las distintas secciones que componen un bloque de cdigo en PL/SQL. En este caso deseamos calcular la venta promedio del da y, en caso que la misma sea menor a lo esperado, se debe registrar en la tabla VENTABAJA./* --- Fuente 2 ----------------------------------------------------------DECLARE esperada CONSTANT NUMBER(5) := 500; xtotal NUMBER; xcant NUMBER; xprom NUMBER; BEGIN /*Asigna a la variable xtotal el TOTAL de las ventas y a la variable xcant la cantidad de ventas del da. */ SELECT SUM(valor),COUNT(valor) INTO xtotal,xcant FROM ventas WHERE fecha=sysdate; xprom:=xtotal/xcant; IF xprom >= esperada THEN message('Ventas por encima de la esperada'); pause; ELSE /*Se registra en la tabla ventabaja las ventas por debajo

33

GESTIN DE BASES DE DATOSdel promedio esperado */ INSERT INTO ventabaja VALUES (sysdate,xprom); END IF; EXCEPTION WHEN ZERO_DIVIDE THEN message('No se realizaron ventas en el da'); pause; WHEN OTHERS THEN message('Error Indefinido'); pause; END;

Podemos crear diferentes tipos de bloques:

Bloques annimos: Se construyen de forma dinmica y se suelen ejecutar una sola vez. Bloques nominados: Igual que los annimos pero con una etiqueta que les da nombre. Subprogramas: Procedimientos, paquetes y funciones, almacenados en la BD y que se ejecutan en mltiples ocasiones. Los subprogramas se ejecutarn mediante una llamada. Disparadores (Triggers): Bloques nominados que se almacenan en la BD y se ejecutan ante algn suceso. Para dar nombre a un bloque se le pone una etiqueta antes del DECLARE . Para transformar un bloque en un procedimiento almacenado reemplazamos la palabra clave DECLARE por CREATE OR REPLACE PROCEDURE nombre_procedimiento AS .

ComentariosLos comentarios pueden ser multilnea encerrados entre /* y */ o monolnea, que comienzan por

Variables y tipos:Las variables deben declararse dentro de la seccin DECLARE, cada una debe tener su tipo asociado. Las variables pueden ser de los mismos tipos que las columnas de una base de datos:DECLARE v_NombreEstudiante v_FechaActual v_Puntos VARCHAR2(20); DATE; NUMBER(3);

Tambin existen otros tipos adicionales (enteros binarios y lgicos):DECLARE v_ContadorBucle BINARY_INTEGER; v_Registrado BOOLEAN;

BINARY_INTEGER: Se usa para almacenar valores que slo van a ser utilizados en clculos y no se van a almacenar en la BBDD. BOOLEAN: Pueden contener los valores TRUE,FALSE o NULL. Sintaxis:

34

GESTIN DE BASES DE DATOSnombre_variable tipo [CONSTANT] [NOT NULL] [:=valor]

El atributo %TYPE permite declarar una variable del mismo tipo que otra ya existente, especialmente til para declarar variables del mismo tipo que atributos de una tabla.NombreVariable variableReferencia%TYPE;

IdentificadoresLos identificadores vlidos empiezan por una letra que puede ser seguida de una secuencia de caracteres que puede incluir letras, nmeros,$ ,_ ,#. La longitud mxima de un identificador es de 30 caracteres.

LiteralesPodremos utilizar literales numricos (enteros y reales), booleanos (TRUE,FALSE Y NULL) y de carcter (uno o ms caracteres delimitados por comillas simples).

Asignacin de valoresLas dos formas que existen para asignar valores a variables de memoria, vistas en el ejemplo anterior, son: Con el operador de asignacin :=, como cuando calculamos el promedio de las ventas asignndole valor a la variable xprom con la siguiente sentencia:xprom:=xtotal/xcant;

-

Con la sentencia SELECT que contiene la orden INTO, como se muestra, es la asignacin de valores a las variables xtotal y xcant con el siguiente cdigo:SELECT SUM(valor), COUNT(valor) INTO xtotal,xcant FROM ventas WHERE fecha=sysdate;

Veamos a continuacin, con la creacin del procedimiento FECHAALTA, la asignacin de valores a una variable de registro llamada Client_Rec, que va a contener la estructura de una fila de la tabla CLIENTES y que estar formada por todos los campos correspondientes a la tabla. Para esto usaremos el atributo de variable %ROWTYPE que declara una variable de registro que contiene la estructura de la tabla, y despus, con el uso de la sentencia SELECT * INTO, se asigna a la variable de registro los valores de la fila. La referencia a un dato contenido en la variable de registro se hace de la forma variable_registro.campo, como por ejemplo cliente_rec.fecha hace referencia a la fecha del alta del cliente. Pasemos a mostrar lo anteriormente expuesto a travs del cdigo del fuente 3.

35

GESTIN DE BASES DE DATOS

/* --- Fuente 3 ----------------------------------------------------------PROCEDURE FECHAALTA IS BEGIN DECLARE cliente_rec clientes%ROWTYPE; BEGIN SELECT * INTO cliente_rec FROM clientes WHERE codigo = 5; IF cliente_rec.fecha>sysdate-10 THEN message( cliente_rec.nombre|| ' Dado de alta en los ltimos 10 das'); pause; ELSE message( cliente_rec.nombre|| ' Dado de alta hace ms de 10 das'); pause; END IF; END; END;

SELECT con control de excepcionesLa sentencia SELECT en PL/SQL no muestra en pantalla las filas resultantes de la consulta, como ocurre en SQL (el cual trabaja en forma interactiva) sino que, segn sea la accin a realizar, as ser la cantidad de filas devueltas por la consulta, existiendo en este caso una de las tres posibles situaciones recogidas en la tabla 1: Cantidad de filas Una Ms de una Ninguna Accin Se realiza la siguiente sentencia Ocurre la excepcin TOO_MANY_ROWS Ocurre la excepcin NO_DATA_FOUND

Tabla 1: Situaciones posibles segn la bsqueda realizada

Por esta razn, veremos a continuacin, a travs de un ejemplo, el uso de la sentencia SELECT, con control de excepciones para definir la accin a realizar en dependencia de la cantidad de filas devueltas por la consulta. Veamos con el cdigo del fuente 4 en el que se define el procedimiento VentasDe para consultar las ventas realizadas en el da de un determinado artculo:/* --- Fuente 4 ----------------------------------------------------------PROCEDURE ventasde(xarticulo ventas.articulo%TYPE) is BEGIN DECLARE xnombre clientes.nombre%TYPE; xventas NUMBER; BEGIN SELECT nombre into xnombre FROM clientes,ventas WHERE clientes.codigo=ventas.codigo AND

36

GESTIN DE BASES DE DATOSventas.fecha=sysdate AND articulo=xarticulo; message( 'Solo una venta de ' xarticulo' a: 'xnombre); EXCEPTION WHEN NO_DATA_FOUND THEN message('No hay ventas de '||xarticulo); pause; WHEN TOO_MANY_ROWS THEN SELECT COUNT(*) INTO XVENTAS FROM ventas WHERE ventas.fecha=sysdate AND articulo=xarticulo; message( TO_CHAR(xventas) ' Ventas de 'xarticulo); pause; WHEN OTHERS THEN message('Error Indefinido'); pause; END; END;

Este procedimiento ventasde recibe un parmetro que es el nombre del artculo a consultar, por lo cual, para ejecutarlo, se debe escribir ventasde('PAPEL'). Obsrvese tambin que la sentencia SELECT COUNT(*) INTO, usada en este ejemplo, siempre devuelve una fila, ya que no existe formacin de grupos al no estar presente la orden GROUP BY. Por lo tanto, en este caso la nica accin posible a realizar es pasar a la siguiente sentencia, o sea, no se requiere control de excepciones.

Estructuras de ControlEste tema muestra como estructurar el flujo de control dentro de un programa PL/SQL. Se podr entender como las distintas sentencias se encuentran conectadas mediante un poderoso y simple control de estructuras que constan de un punto de entrada y uno de salida. En su conjunto estas estructuras pueden manejar cualquier situacin y permiten una correcta estructuracin del programa. De acuerdo con el Teorema de la Estructura, cualquier programa computacional puede ser escrito utilizando las estructuras bsicas de control que se muestran en la figura 4-1. Estas se pueden combinar de todas las maneras necesarias para alcanzar la solucin de un problema dado. Las estructuras de seleccin verifican cierta condicin, despus ejecutan cierta secuencia de expresiones dependiendo si la condicin result ser verdadera o falsa. Una condicin es cualquier variable o expresin que retorna un valor booleano (TRUE o FALSE). Las estructuras de iteracin ejecutan una secuencia de sentencias repetidamente mientras la condicin permanezca verdadera. Las estructuras de secuencia simplemente ejecutan una secuencia de estamentos en el orden que ocurren.

37

GESTIN DE BASES DE DATOSS e l e c c i n Ite r a ci n S e c u e n c ia

T

F T

F

Figura 4-1:

Estructuras de Control

Control Condicional: Sentencia IFA menudo es necesario tomar alternativas de accin dependiendo de las circunstancias. La sentencia IF permite ejecutar una secuencia de acciones condicionalmente. Esto es, si la secuencia es ejecutada o no depende del valor de la condicin a evaluar. Existen tres modos para esta instruccin: IF THEN, IF THEN ELSE y IF THEN ELSIF.

IF THENEste es el modo ms simple y consiste en asociar una condicin con una secuencia de sentencias encerradas entre las palabras reservadas THEN y END IF (no ENDIF).IF condicin THEN secuencia_de_sentencias END IF;

La secuencia de sentencias es ejecutada slo si la condicin es verdadera. Si la condicin es falsa o nula no realiza nada. Un ejemplo real de su utilizacin es la siguiente:IF condicin THEN calcular_bonus (emp_id) UPDATE sueldos SET pago = pago + bonus WHERE emp_no = emp_id; END IF;

IF THEN ELSEEsta segunda modalidad de la sentencia IF adiciona una nueva palabra clave: ELSE, seguida por una secuencia alternativa de acciones:IF condicin THEN secuencia_de_sentencias_1 ELSE secuencia_de_sentencias_2 END IF;

La secuencia de sentencias en la clusula ELSE es ejecutada solamente si la condicin es falsa o nula. Esto implica que la presencia de la clusula ELSE asegura la ejecucin de alguna de las dos secuencias de estamentos. En el ejemplo siguiente el primer UPDATE es ejecutado cuando la condicin es verdadera, en el caso que sea falsa o nula se ejecutar el segundo UPDATE:IF tipo_trans = CR THEN UPDATE cuentas SET balance = balance + credito WHERE ELSE UPDATE cuentas SET balance = balance debito WHERE END IF;

38

GESTIN DE BASES DE DATOSLas clusulas THEN y ELSE pueden incluir estamentos IF, tal como lo indica el siguiente ejemplo:IF tipo_trans = CR THEN UPDATE cuentas SET balance = balance + credito WHERE ELSE IF nuevo_balance >= minimo_balance THEN UPDATE cuentas SET balance = balance debito WHERE ELSE RAISE fondos_insuficientes; END IF; END IF;

IF THEN ELSIFAlgunas veces se requiere seleccionar una accin de una serie de alternativas mutuamente exclusivas. El tercer modo de la sentencia IF utiliza la clave ELSIF (no ELSEIF) para introducir condiciones adicionales, como se observa en el ejemplo siguiente:IF condicin_1 THEN secuencia_de_sentencias_1 ELSIF condicin_2 THEN secuencia_de_sentencias_2 ELSE secuencia_de_sentencias_3 END IF;

Si la primera condicin es falsa o nula, la clusula ELSIF verifica una nueva condicin. Cada sentencia IF puede poseer un nmero indeterminado de clusulas ELSIF; la palabra clave ELSE que se encuentra al final es opcional. Las condiciones son evaluadas una a una desde arriba hacia abajo. Si alguna es verdadera, la secuencia de sentencias que corresponda ser ejecutada. Si cada una de las condiciones analizadas resultan ser falsas, la secuencia correspondiente al ELSE ser ejecutada:BEGIN IF

sueldo > 50000 THEN bonus : = 1500; ELSIF sueldo > 35000 THEN bonus : = 500; ELSE bonus : = 100; END IF; INSERT INTO sueldos VALUES (emp_id, bonus, );

END;

Si el valor de sueldo es mayor que 50.000, la primera y segunda condicin son verdaderas, sin embargo a bonus se le asigna 1500, ya que la segunda condicin jams es verificada. En este caso slo se verifica la primera condicin para luego pasar el control a la sentencia INSERT.

Controles de Iteracin: Las sentencias LOOP y EXITLa sentencia LOOP permite ejecutar una secuencia de acciones mltiples veces. Todas ellas gobernadas por una condicin que regula la ejecucin de la iteracin. Existen tres modalidades para esta instruccin: LOOP, WHILE LOOP y FOR LOOP.

LOOP 39

GESTIN DE BASES DE DATOSEl modo bsico (o infinito) de LOOP encierra una serie de acciones entre las palabras clave LOOP y END LOOP, como en el siguiente ejemplo:LOOP secuencia_de_instrucciones END LOOP;

Ej.

Con cada iteracin del ciclo las sentencias son ejecutadas. Para terminar estos ciclos de ejecucin se utiliza la palabra clave EXIT. Es posible ubicar innumerables EXIT dentro del loop, obviamente ninguno fuera de l. Existen dos modalidades para utilizar esta sentencia: EXIT y EXIT WHEN.

EXITLa clusula EXIT obliga al loop a concluir incondicionalmente. Cuando se encuentra un EXIT en el cdigo, el loop es completado inmediatamente y pasa el control a la prxima sentencia.LOOP IF ranking_credito < 3 THEN EXIT; --Termina el loop inmediatamente END IF; END LOOP;

Es necesario recordar que esta sentencia debe estar dentro del loop. Para completar un bloque PL/SQL antes de que su final natural sea alcanzado, es posible utilizar la instruccin RETURN.

EXIT WHENEsta sentencia permite terminar el loop de manera condicional. Cuando se encuentra un EXIT la condicin de la clusula WHEN es evaluada. Si la condicin es verdadera el loop es terminado y el control es pasado a la prxima sentencia. Ejemplo:LOOP FECTH c1 INTO EXIT WHEN c1%NOTFOUND; -- termina el loop si la condicin es verdadera

40

GESTIN DE BASES DE DATOSEND LOOP; CLOSE c1;

Hasta que la condicin no sea verdadera el loop no puede completarse, esto implica que necesariamente dentro de las sentencias el valor de la condicin debe ir variando. En el ejemplo anterior si la ejecucin de FETCH retorna una fila la condicin es falsa. Cuando FETCH falla al retornar una fila, la condicin es verdadera por lo que el loop es completado y el control es pasado a la sentencia CLOSE. La sentencia EXIT WHEN reemplaza la utilizacin de un IF. A modo de ejemplo se pueden comparar los siguientes cdigos:IF count > 100 THEN EXIT; END IF; | | | EXIT WHEN count > 100;

Ambos cdigos son equivalentes, pero el EXIT WHEN es ms fcil de leer y de entender.

EtiquetasEn todos los bloques escritos en PL/SQL, los ciclos pueden ser rotulados. Un rtulo es un identificador encerrado entre los signos dobles > y debe aparecer al comienzo de un loop, como se muestra a continuacin: LOOP secuencia de sentencias END LOOP;

La ltima sentencia puede cambiarse tambin por END LOOP rtulo;

WHILE - LOOPEsta sentencia se asocia a una condicin con una secuencia de sentencias encerradas por las palabras clave LOOP y END LOOP, como sigue:WHILE condicin LOOP secuencia_de_sentencias END LOOP;

Ej.

Antes de cada iteracin del ciclo se evala la condicin. Si sta es verdadera se ejecuta la secuencia de sentencias y el control se devuelve al inicio del loop. Si la condicin en falsa o nula, el ciclo se rompe y el control se transfiere a la prxima instruccin, fuera del loop.

FOR - LOOPEn las instrucciones anteriores el nmero de iteraciones es desconocido, mientras no se evala la condicin del ciclo. Con una instruccin del tipo FOR-LOOP, la iteracin se efecta un nmero finito (y conocido) de veces. La sintaxis de esta instruccin es la siguiente:

41

GESTIN DE BASES DE DATOSFOR contador IN [REVERSE] valor_minimo..valor_maximo LOOP secuencia_de_sentencias END LOOP;

Ej.

El contador no necesita ser declarado porque por defecto se crea para el bloque que involucra el ciclo y luego se destruye. Por defecto, la iteracin ocurre en forma creciente, es decir, desde el menor valor aportado hasta el mayor. Sin embargo, si se desea alterar esta condicin por defecto, se debe incluir explcitamente en la sentencia la palabra REVERSE. Los lmites de una iteracin pueden ser literales, variables o expresiones, pero que deben evaluarse como nmeros enteros. Un contador de loop tiene validez slo dentro del ciclo. No es posible asignar un valor a una variable contadora de un loop, fuera de l. Ejemplo:FOR cont IN 1..10 LOOP END LOOP; sum := cont + 1 ; -- Esto no est permitido

La sentencia EXIT tambin puede ser utilizada para abortar la ejecucin del loop en forma prematura. Por ejemplo, en el siguiente trozo de programa la secuencia normal debera completarse luego de 10 veces de ejecutarse, pero la aparicin de la clusula EXIT podra hacer que sta termine antes:FOR j IN 1..10 LOOP FETCH c1 INTO emprec; EXIT WHEN c1%NOTFOUND; END LOOP;

O tambin se puede utilizar: FOR i IN 1..5 LOOP FOR j IN 1..10 LOOP FETCH c1 INTO emprec; EXIT externo WHEN c1%NOTFOUND; END LOOP; END LOOP externo; -- el control retorna a esta lnea

-- sale de ambos ciclos

Controles de Secuencia: Las sentencias GOTO y NULL

42

GESTIN DE BASES DE DATOSOcasionalmente podra ser til la utilizacin de una sentencia de este tipo. A pesar de que es sabido que la sentencia GOTO redunda en un cdigo ms complejo y desordenado a veces podra cooperar en la implementacin de un programa. La sentencia nula puede cooperar con la fcil lectura del cdigo cuando este sobrepasa una cantidad determinada de instrucciones y torna ms difcil su comprensin.

GOTOLa sentencia GOTO obliga a saltar a un rtulo del programa en forma incondicional. El rtulo debe ser nico dentro de su alcance y debe preceder a una sentencia ejecutable o a un bloque PL/SQL. Cuando es ejecutada, esta instruccin transfiere el control a la sentencia o bloque rotulada. Los siguientes ejemplos ilustran una forma vlida de utilizar la sentencia GOTO y otra no vlida. Ejemplo vlido:BEGIN BEGIN UPDATE emp SET END; GOTO