You are on page 1of 242

Instalacin

1. INTRODUCCIN

racle 10g es la ltima versin del servidor de bases de datos


empresarial de Oracle.

Oracle 10g es un producto de pago en contraposicin con otros


servidores de bases de datos de cdigo abierto o licencia GPL y es un
servidor orientado al mundo empresarial con grandes requerimientos
de rendimiento, seguridad, etc. y, por lo tanto, no adecuado para
aplicaciones sencillas con un volumen de datos reducido (donde pueden
ser de utilidad otras bases de datos ms sencillas, como Access).
Con esta nueva versin de su servidor de bases de datos, Oracle da
respuesta a la utilizacin cada vez ms frecuente de servidores gratuitos
(o mucho ms baratos) del mundo GPL, como MySQL o Postgres; as
como a la utilizacin de otros servidores de pago, como Microsoft SQL
Server.
Y para ello introduce una forma distinta de planicar la red de
servidores de bases de datos. Esta nueva idea se conoce como grid
computing, de ah la g de la versin de Oracle 10g.

El enfoque que se aplica en grid computing es utilizar un grupo


de servidores de bajo coste conectados por software Oracle. Con el
Grid Computing de Oracle las aplicaciones se ejecutarn de forma
ms rpida que con mainframe. Y si un servidor falla, el grid de Oracle
sigue funcionando, mientras que el Mainframe se para.
La evolucin hacia redes con mltiples servidores de menor
potencia (y costo) en lugar de grandes equipos o mainframe conlleva
muchas ventajas y Oracle lo sabe.
Copyright Computer Aided Education, S.A.

Instalacin

Sin embargo, nosotros no nos centraremos en este asunto, sino


que estudiaremos Oracle 10g desde el punto de vista del diseador y
programador de bases de datos, conociendo los distintos objetos que
puede crear, su integracin con herramientas de desarrollo, etc., por lo
que es conveniente tener conocimientos bsicos de programacin.
2. EDICIONES DE ORACLE 10g

racle 10g aparece en distintas ediciones de forma que sea


ms fcil acceder a las necesidades de las empresas, desde
pequeas y medianas hasta grandes organizaciones.
La posibilidad de elegir entre una u otra edicin permite que las
empresas compren y utilicen el producto que mejor se adapte a su
negocio e incluso a su presupuesto.
A continuacin se detalla cada una de las ediciones disponibles:
Oracle 10g Express Edition: se trata de la edicin gratuita.
Como tal, dispone de la mayora de las caractersticas de Oracle
10g, aunque algunas de ellas estn realmente limitadas.

Utilizaremos la
revisin
Release 2 de
Oracle 10g.

Es la edicin ideal para estudiantes o todos aquellos que quieren


experimentar con Oracle y ms tarde aumentar las prestaciones de
su base de datos comprando una licencia de Oracle 10g.
Oracle 10g Standard Edition y Standard Edition One: es
una base de datos de caractersticas completas para pequeas
y medianas empresas que requieren el desempeo, la
disponibilidad y la seguridad de una base de datos empresarial
a un bajo costo.
Oracle 10g Enterprise Edition: es la edicin ms completa
de Oracle 10g y es idnea para las organizaciones ms grandes
y para los requisitos ms complejos. Todas las caractersticas de
Oracle 10g estn disponibles en esta edicin, tanto referentes a
OLTP como a OLAP.
Oracle 10g Personal Edition: permite a los programadores
generar todo tipo de aplicaciones sobre Oracle. Incluye todas
las funciones de Oracle 10g Enterprise Edition, pero se autoriza
su uso a un nico usuario, por lo que es til como sistema de
desarrollo y prueba, no como servidor de produccin.
sta es la edicin que utilizaremos a lo largo del curso.

Instalacin

Oracle 10g est disponible para distintos sistemas operativos:


Unix, Windows y Linux, incluyendo plataformas de 32 y 64 bits.
Todas las ediciones estn disponibles para su prueba descargndolas
gratuitamente desde el sitio web de Oracle. Posteriormente,
deber comprar la correspondiente licencia para sus servidores de
produccin.
La eleccin de una u otra edicin se fundamenta en las necesidades
empresariales. En muchas pequeas y medianas empresas es suciente
con la edicin Standard; mientras que las grandes organizaciones
requerirn de las prestaciones de la edicin Enterprise.

3. INSTALACIN

Es necesario
tener permisos
de administrador en el
equipo donde
se va a instalar
Oracle 10g

a instalacin de Oracle 10g es relativamente sencilla, ya que


se ha preparado un asistente para ello. Sin embargo, debido a
que se tienen que tomar ciertas decisiones, es importante estudiarla.
Una vez introducimos el CD de instalacin, aparecer la ventana
que puede ver a continuacin.

Copyright Computer Aided Education, S.A.

Instalacin

Debe pulsar el botn Install/Deinstall Products, con lo que


iniciar el asistente de instalacin.
Este asistente se divide en dos pasos que hay que realizar en este
orden: preparar la instalacin y realizarla.
Y es que previamente a instalar Oracle 10g, debemos asegurarnos
de disponer del hardware y software necesarios. El instalador har
una revisin de todo ello y, en caso necesario, instalar componentes
adicionales o le avisar de posibles problemas.
Podemos realizar una instalacin estndar del servidor de base
de datos, con lo que simplemente indicaremos la ubicacin de la
instalacin, qu edicin queremos instalar y si deseamos crear una
base de datos inicial; o elegir la opcin de la instalacin avanzada, con
lo que podremos establecer otras opciones.

Veamos los pasos de una instalacin avanzada. En el primer paso


del asistente debemos indicar la edicin que queremos instalar. El
programa instalador es el mismo para cualquiera de las ediciones, por
lo que deberemos elegir los componentes para los que disponemos de
la correspondiente licencia.
Nosotros elegiremos la edicin Personal Edition.

Instalacin

Tras elegir la edicin que queremos instalar, el asistente nos


solicita que indiquemos el nombre y ubicacin del directorio home de
la instalacin.
Oracle puede instalarse ms de una vez en el mismo equipo
siempre que se haga en directorios home distintos. De ah que no slo
tengamos que indicar dicha ubicacin sino un nombre descriptivo.

Seguidamente podemos indicar si queremos que durante el proceso


de instalacin se cree una base de datos inicial. Podemos hacerlo ahora
o ms tarde, una vez instalado el software del servidor de bases de
datos.
Nosotros instalaremos nicamente el software de base de datos
para crear la base de datos despus y que vea cmo hacerlo.
Finalmente, se muestra un resumen de la instalacin que se
efectuar a continuacin por si necesitramos cambiar algn detalle.
Deberemos pulsar en el botn Instalar para que se inicie la instalacin
completa.
Con estos sencillos pasos nalizaremos la instalacin del
software del servidor de bases de datos. Despus, podremos crear las
correspondientes bases de datos.

Copyright Computer Aided Education, S.A.

Instalacin

4. ASISTENTE DE CONFIGURACIN DE RED

na vez instalado el software del servidor de bases de datos


Oracle, el siguiente paso previo a crear cualquier base de
datos (si no se ha creado una base de datos durante la instalacin
anterior) es congurar adecuadamente la red.
Para ello, se utiliza el Asistente de Conguracin de Red.
Esta herramienta la encontrar en la carpeta Herramientas de
Conguracin y de Migracin del grupo de programas de Oracle del
men de Inicio.
Tendr un grupo de este tipo por cada instalacin o directorio
home de Oracle.

Aunque ahora no entraremos en detalles, es necesario congurar


un listener para que las aplicaciones cliente puedan solicitar servicios
del servidor de bases de datos. Esto lo podemos hacer fcilmente con
este asistente.
El detalle ms importante a la hora de crear un listener es el
protocolo o protocolos de red que se utilizarn.
Como el propsito del listener es encargarse de las conexiones
remotas, es decir, de aplicaciones situadas en equipos distintos al
servidor, lo ms habitual es congurar nicamente el protocolo TCP/
IP.
Esto lo podemos ver en la gura de la pgina siguiente.

Instalacin

El servidor de
Oracle deber poder
atender las
solicitudes en
dicho puerto,
o lo que es lo
mismo, deber
tenerlo abierto
si se utiliza un
firewall para
proteger la
red.

Si elige el protocolo TCP/IP, podr indicar en qu puerto atender


el listener las solicitudes. El puerto predeterminado es el 1521.

Es muy importante recordar que se debe crear al menos un


listener antes de crear cualquier base de datos. Si se eligi crear una
base de datos inicial durante la instalacin del servidor, esto se hace
automticamente.

Copyright Computer Aided Education, S.A.

Instalacin

5. CREAR BASES DE DATOS

urante la instalacin del software de servidor de bases de


datos Oracle podemos hacer que se cree una base de datos
inicial o decidir crearla ms tarde.
Nosotros hemos elegido esta ltima opcin para que pueda ver
ahora cmo creara una base de datos en cualquier momento utilizando
la herramienta Asistente de conguracin de bases de datos.

Este asistente est disponible en el grupo de programas del


directorio home o raz de Oracle que acaba de instalar. En nuestro caso,
el grupo se llamar Oracle - OraDb10g_home1. Busque el asistente
en la carpeta Herramientas de Conguracin y Migracin.

Si durante una instalacin estndar de Oracle 10g decidimos crear


una base de datos, el asistente que acabamos de lanzar es ejecutado
automticamente sin necesidad de ninguna interaccin con nosotros.
Esto no permite que podamos anar un poco las caractersticas de
nuestra base de datos, crendose una base de datos de carcter general.
8

Instalacin

Si deseamos personalizar la base de datos que vamos a crear,


podemos elegir la instalacin avanzada o ejecutar el asistente de
conguracin de la base de datos que puede ver en la gura anterior.
Una vez seleccionamos crear una nueva base de datos deberemos
indicar el tipo de base de datos. Principalmente disponemos de dos
opciones especiales o crear una base de datos de carcter general.
Las opciones especiales son:
Crear una base de datos preparada como Almacn de datos:
para tareas de anlisis de datos OLAP.
Crear una base de datos preparada para respaldar aplicaciones
de Procesamiento de transacciones OLTP, como aplicaciones
de comercio electrnico, procesamiento de pedidos, banca
electrnica, etc.
Al elegir uno u otro tipo de base de datos, sta se congurar con
las propiedades ms adecuadas para esos propsitos, aunque siempre
podremos cambiar dicha conguracin ms tarde. Nosotros elegiremos
crear una base de datos de carcter general.

En el siguiente paso debemos indicar el nombre de la base de datos.


Este nombre consta de dos partes: su nombre en s y su dominio.

Copyright Computer Aided Education, S.A.

Instalacin

El dominio suele corresponderse con el dominio de la red


de ordenadores de la empresa aunque esto no es obligatorio. La
combinacin de ambos detalles forman el Nombre de la Base de
Datos Global, que tiene que ser nico en cada instancia del servidor.
Por ejemplo, crearemos una base de datos para una tienda
de comercio electrnico cticia de Internet. La tienda se llamar
Tiendadetalles.com, por lo que el nombre global ser:
bd.tiendadetalles.com
Fjese que el nombre de la base de datos es bd y el nombre del
dominio tiendadetalles.com. En la parte inferior vemos el SID o
identicador de la instancia del servidor.

Seguidamente accedemos a la pgina de opciones de gestin


de la base de datos que estamos creando, donde indicaremos qu
herramientas queremos utilizar para ello.
Una de las herramientas incorporadas en cualquier instalacin de
Oracle 10g es Enterprise Manager Database Control (DC).
Esta herramienta slo permite gestionar una base de datos en
particular, mientras que Enterprise Manager Grid Control (GC)
permite gestionar ms de una a la vez.
Nosotros utilizaremos Database Control, que es la opcin
activada por defecto.
10

Instalacin

En este paso tambin podremos congurar ahora detalles respecto


a las noticaciones de correo electrnico y a la forma de realizar copias
de seguridad de la base de datos, pero lo veremos ms tarde.

En un entorno
de produccin
es conveniente
utilizar contraseas distintas
para cada
cuenta administrativa.

En el paso nmero 5 del asistente debe crear la contrasea o


contraseas para las cuentas de usuario de la base de datos. Por defecto
se crean cuatro usuarios de carcter administrativo: SYS, SYSTEM,
DBSNMP y SYSMAN.
Aqu puede establecer la misma contrasea para todos ellos o una
distinta para cada uno.

En el paso nmero 6 podemos congurar la forma en que se


administrar el espacio en disco donde se almacenar la base de
datos.
Tenemos la opcin ms comn, que es almacenarla en un
determinado sistema de archivos (por ejemplo, en cualquier particin
formateada del disco duro) o dos opciones ms avanzadas, que delegan
esta tarea en Oracle: Gestin de Almacenamiento Automatizada y
Dispositivos Raw.
En el paso nmero 7 elegiremos la ubicacin donde se guardarn
los archivos de la base de datos. Podemos establecer una ubicacin
determinada o elegir la predeterminada de la plantilla que hemos
utilizado (base de datos de carcter general, en este caso).

Copyright Computer Aided Education, S.A.

11

Instalacin

En el paso nmero 8 se establece el rea donde se crearn las


copias de seguridad, conocida como rea de Recuperacin de Flash.
Ya lo veremos.
En el paso 9 el asistente tambin permite instalar ejemplos de
bases de datos reales: de recursos humanos, procesamiento de rdenes
o pedidos, historial de ventas, etc.

Utilizar el paso 10 del asistente para denir varios ajustes


o parmetros de la conguracin de la base de datos referentes a la
memoria, al tamao de la base de datos, al juego de caracteres utilizado
y al modo de conexin.
Por ejemplo, en la cha o pestaa Juego de Caracteres podemos
elegir el juego de caracteres de nuestro sistema operativo o Unicode,
que permite almacenar caracteres de cualquier idioma.
Si la aplicacin o aplicaciones que utilizarn la base de datos se
pueden ejecutar en distintos idiomas, sera adecuado elegir almacenar
la informacin de la base de datos en Unicode.
Tambin podremos especicar el idioma por defecto de la base de
datos y cmo se almacenarn las fechas. El formato de Espaa es dames-ao (dd-mm-aaaa).
En el paso nmero 11 podremos revisar y cambiar la ubicacin de
los archivos que la componen: archivos de control, archivos de datos y
archivos de recuperacin (logs).
12

Instalacin

Como todava no conocemos estos conceptos, no cambiaremos


ningn detalle aqu.
Finalmente, el asistente nos pregunta si queremos crear una base
de datos con todos los ajustes establecidos o guardarlos como una
plantilla o modelo para crear bases de datos a partir de ella.
Pulsando el botn Terminar, crear la base de datos. Veremos que
muchos de los detalles que hemos tenido que elegir durante el asistente
se pueden ajustar ms tarde, cuando tengamos ms conocimientos para
ello.

Copyright Computer Aided Education, S.A.

13

Arquitectura de una base de datos


Oracle
1. INSTANCIAS

na base de datos Oracle est compuesta por una serie de


archivos que se almacenan en un sistema de archivos u otro
medio de almacenamiento, segn como se haya congurado la base de
datos.
Pero para poder acceder a la informacin almacenada en estos
archivos, es necesario que en el servidor de bases de datos se ejecute
unos determinados procesos y que se reserve memoria del servidor
para ello.
El conjunto de esos procesos y de la memoria reservada recibe
el nombre de instancia y es la parte lgica de una base de datos que
permite acceder a los datos almacenados en sta.
Como tal, la instancia de la base de datos tiene que estar iniciada
para poder acceder a los datos. Si no es as, los datos seguirn estando
disponibles en los correspondientes archivos pero no habr forma
de acceder a ellos hasta que la instancia vuelva a levantarse.
En Windows todo esto se corresponde con servicios, que son
aplicaciones que actan de forma similar al sistema operativo, ya que
se ejecutan normalmente en un segundo plano, sin que el usuario se d
cuenta de ello.

Aqu podemos ver los servicios de Windows que se generan al


crear una base de datos y, por lo tanto, que representan una determinada
instancia de la base de datos:
OracleServiceSID: donde SID es el identicador de la base de
datos (en este caso BD). Representa la instancia propiamente
dicha.
Copyright Computer Aided Education, S.A.

Arquitectura de una base de datos Oracle

OracleORACLE_HOMETNSListener: representa un listener


que atiende las solicitudes del acceso a la base de datos.
OracleDBConsoleSID: el cual permite conectarse a la principal
herramienta de administracin de Oracle, Enterprise Manager.
Como puede ver, estos tres servicios estn iniciados actualmente
y tienen su inicio como automtico, lo que quiere decir, que se inician
al hacerlo el sistema operativo.
Por lo tanto, la instancia de nuestra base de datos bd.tiendadetalles.
com est disponible y el listener que atender las peticiones tambin.
Slo nos falta utilizar una aplicacin cliente para acceder a la base
de datos y que solicitar estos servicios al listener.
Por otra parte, durante la instalacin de Oracle se crea el grupo de
Windows ora_dba, cuyos miembros reciben los privilegios necesarios
para realizar tareas administrativas en el servidor (role SYSDBA, como
despus veremos).
Si necesita que un determinado usuario de Windows pueda realizar
estas tareas, adalo al grupo ora_dba.

Arquitectura de una base de datos Oracle

2. ARQUITECTURA DE RED

na de esas tareas administrativas es congurar adecuadamente


la forma en que se comunica el servidor (o una instancia de
base de datos) con las aplicaciones cliente.
Aunque vimos que esto era sencillo conseguirlo con el Asistente
de Conguracin de Red, debemos conocer la existencia de otras
herramientas que nos permitirn modicar posteriormente dicha
conguracin. Una de ellas, aunque no la nica, es Net Manager.
Net Manager est disponible entre las herramientas de
conguracin del grupo de programas de Oracle del men Inicio.

El nombre Net Manager no es casual, ya que permite congurar


la tecnologa conocida como Oracle Net.
Oracle Net es un componente de software que se instala tanto
en el servidor como en los equipos cliente y que es el responsable de
establecer y mantener la comunicacin (conexiones) entre ellos. Para
ello, se basa principalmente en dos aspectos o conceptos:
El listener o proceso del servidor que espera las solicitudes de
los clientes.
Un mtodo para describir el servicio al que los clientes desean
conectarse.
Copyright Computer Aided Education, S.A.

Arquitectura de una base de datos Oracle

Net Manager permite establecer ambos aspectos. En la carpeta


Perl podemos indicar qu mtodos queremos poner a disposicin de
las aplicaciones cliente para que puedan describir el servicio de base de
datos Oracle al que desean acceder.
Tenemos varios mtodos, aunque el ms utilizado es TNSNAMES,
que consiste en la existencia de un archivo especial (tsnames.ora) donde
se describe cmo realizar la conexin con el servidor. Normalmente no
es necesario modicar los mtodos seleccionados.

En la carpeta Nomenclatura de Servicios describimos las


conexiones con las bases de datos disponibles en el servidor. Es una
forma sencilla de indicar todo lo que tiene que conocer la aplicacin
cliente para conectarse con dicha base de datos.
Por ejemplo, vemos que aqu aparece un servicio con el nombre
bd. Pues con el nombre de servicio bd, lo que realmente estamos
describiendo es la forma de acceder a la base de datos bd.tiendadetalles.
com del equipo SERVIDORBD a travs del puerto TCP/IP 1521.
Qu quiere decir esto? Pues que las aplicaciones slo necesitan
utilizar la descripcin del servicio bd para conectarse a esta base de
datos.

Arquitectura de una base de datos Oracle

Si ms tarde cambiara la forma de conectarse con la base de datos,


simplemente tendramos que cambiar la descripcin del servicio, pero
las aplicaciones seguiran funcionando perfectamente.

Si las carpetas anteriores describen la forma o mtodos en que las


aplicaciones cliente intentarn conectarse con el servidor, la carpeta
Listener muestra justamente lo contrario.
Es decir, qu recursos (o listeners) estn congurados en el
servidor para ello. La conguracin del listener se efecto al ejecutar el
Asistente de Conguracin de Red, donde indicamos que se utilizara
el protocolo TCP/IP a travs del puerto 1521.
Tambin puede aparecer que se utiliza el protocolo IPC para
conexiones en que el servidor y la aplicacin cliente estn en el mismo
equipo.
stos son los protocolos de red que se pueden congurar en
un listener:
IPC: para conexiones locales (servidor y cliente en el mismo
equipo).
Canalizaciones con nombre (Named pipes), TCP/IP y
TCP/IP on SSL (comunicacin segura) para las conexiones
remotas.
Copyright Computer Aided Education, S.A.

Arquitectura de una base de datos Oracle

La conguracin del listener queda reejada en otro archivo


especial (listener.ora).

Vemos, por lo tanto, que esta herramienta nos permite descubrir


y congurar apropiadamente tanto la forma en que las aplicaciones
cliente intentarn establecer conexin con el servidor (pudiendo
congurar una nomenclatura de servicio) como la forma en que el
servidor aceptar dichas conexiones (a travs de un listener).
La buena noticia es que la conguracin de todo esto suele realizarse
automticamente con el Asistente de Conguracin de Red y al crear
las bases de datos, por lo que slo tendremos que preocuparnos de ello
cuando necesitemos congurar los equipos cliente.
3. ENTERPRISE MANAGER

ero sin lugar a dudas, la herramienta que ms utilizaremos


tanto como administrador como para lo que ms nos preocupa
ahora, que son las labores de diseador/programador de bases de datos,
es Enterprise Manager.
Se trata de una aplicacin web a la que podr acceder desde el
grupo de programas de Oracle. Busque un elemento como Database
Control - SID, donde en nuestro caso SID sera bd.
6

Arquitectura de una base de datos Oracle

Enterprise Manager est disponible en dos versiones:


Database Control: versin en la que slo se puede administrar
una base de datos.
Grid Control: versin capaz de administrar muchas bases de
datos (grid computing).
Nosotros utilizaremos la ms sencilla, esto es, Enterprise
Manager Database Control, para administrar y crear nuestra base de
datos.
Debemos identicarnos en la pgina de inicio, utilizando una
de las cuentas de usuario creadas durante la creacin de la base de
datos bd.tiendadetalles.com. Por ejemplo, el usuario SYS, que es
administrador de la base de datos.
Una vez introducidos el nombre de usuario, la correspondiente
contrasea y cmo queremos conectarnos, pulsaremos en el botn
Conectar y accederemos al entorno de Database Control. Obsrvelo
en la gura de la pgina siguiente.
EM Database Control sirve tanto para administrar la instancia y
base de datos como de cara al diseador o programador de la misma,
permitiendo crear tablas, ndices, procedimientos almacenados, etc. La
ventaja que tiene es que se puede utilizar desde cualquier equipo donde
se disponga de un navegador web, ya que es lo nico que se necesita.
Copyright Computer Aided Education, S.A.

Arquitectura de una base de datos Oracle

4. ARCHIVOS DE UNA BASE DE DATOS

a sabemos que la instancia es la parte lgica de una base


de datos, ya que acta de intermediario entre las solicitudes
realizadas al listener y los datos propiamente almacenados en ella.
Ahora debemos conocer de qu archivos fsicos est formada
una base de datos Oracle. Y para ello, podemos utilizar EM Database
Control en su cha o pestaa Administracin.
En esta cha encontramos una seccin denominada
Administracin de la Base de Datos. Aqu podremos encontrar todos
los detalles de la base de datos.
Una base de datos Oracle consta de:
Al menos un archivo de control: donde se almacena informacin
importante de la instancia, como su nombre, la fecha en la que
fue creada y el estado de los archivos de copia de seguridad y
recuperacin.
Es necesario disponer de un archivo de control operativo, por lo
que normalmente se dispone de ms de una copia.

Arquitectura de una base de datos Oracle

Aqu podemos ver que nuestra base de datos dispone de tres


archivos de control. Podemos ver sus nombres y la ubicacin de cada
uno de ellos.
Archivos de recuperacin o Redo Logs: mantienen el
seguimiento de las transacciones realizadas en la base de datos,
de forma que pueda ser recuperada en caso de fallo o estado
inconsistente de los datos.
Ya que son cruciales para el buen funcionamiento de una base de
datos, normalmente se mantiene ms de un grupo de archivos de
recuperacin.
Y, nalmente, archivos de datos: donde realmente se
almacenarn los datos a los que tienen acceso las distintas
aplicaciones que lo solicitan.
En la gura siguiente podemos ver los archivos de datos de que
consta la base de datos. Sin embargo, los archivos de datos no son
una unidad de administracin, es decir, que no podemos realizar
tareas de copia de seguridad o recuperacin de los archivos de
datos sino de otro concepto superior, que son los tablespace.
Cada archivo de datos pertenecer a un tablespace, pero en un
tablespace podremos encontrar ms de un archivo de datos.

Copyright Computer Aided Education, S.A.

Arquitectura de una base de datos Oracle

Oracle permite administrar los tablespace, estableciendo


caractersticas como el tamao de bloque o unidad mnima que se
puede leer/escribir de una base de datos; se pueden realizar tareas de
copia de seguridad y restauracin de los tablespace; se puede poner
como slo lectura el contenido de un tablespace o incluso ofine, etc.
Utilizando el concepto de tablespace se facilita la labor del
administrador, ya que ste no tiene que preocuparse de cmo se crean
los archivos donde realmente se almacena la informacin.
Como diseador o programador de bases de datos puede que se
est preguntando para qu necesita conocer todo esto.
No se preocupe, pronto entraremos a estudiar los objetos lgicos
de una base de datos, como las tablas, ndices, vistas, procedimientos
almacenados, etc.
Sin embargo, es necesario conocer algunos aspectos de la
arquitectura de una base de datos Oracle ya que, inevitablemente, nos
los encontraremos al crear estos ltimos objetos.

10

Tablas
1. INTRODUCCIN

as tablas son el objeto principal de una base de datos relacional


como Oracle, aunque no el nico.

En las tablas es donde se guarda la distinta informacin,


almacenndola en forma de registros o las que se componen de
columnas o campos.
As, si disponemos de una tabla para almacenar la informacin
de los clientes de nuestra empresa, tendremos que en ella cada la o
registro representa un determinado cliente, mientras que cada columna
o campo de dicha la es un determinado detalle de dicho cliente: su
nombre, sus apellidos, direccin, telfono, etc.

El conjunto de tablas es algo que tenemos que crear con cuidado


y detenimiento para que la base de datos sea eciente.
Para ello, existen tcnicas de anlisis y diseo que se deben aplicar.
En todo proyecto medianamente serio esto es necesario y slo en
aquellos ejemplos muy sencillos no har falta (pero entonces, tampoco
tiene sentido utilizar una herramienta tan potente como Oracle).
Por lo tanto, supondremos que disponemos de un buen diseo de
tablas (y ms tarde veremos que tambin de relaciones) y que deseamos
crearlo en Oracle.
Ese diseo se corresponder, en nuestro caso, con la base de
datos necesaria para respaldar la aplicacin web de la tienda virtual
de Internet TiendaDetalles.com, as que debe esperar tablas para
almacenar los detalles de los clientes, de los productos que se venden,
de los pedidos, etc.
La herramienta adecuada para crear tablas y otros objetos es
Enterprise Manager Database Control, ya que facilita esta labor de
una forma totalmente visual.

Copyright Computer Aided Education, S.A.

Tablas

Puede acceder a esta herramienta desde el men Inicio de Windows,


ya que aparece en el grupo de programas de Oracle. Tambin puede
hacerlo escribiendo directamente en su navegador la URL:
http://NombreEquipo:1158/em/
donde aqu se indica el puerto 1158, que es el predeterminado,
pero puede ser cualquier otro que se asign al crear la base de datos.
Para acceder a esta herramienta como administrador de la base de
datos, puede utilizar el usuario SYS (con su correspondiente contrasea)
y el rol SYSDBA en la lista Conectar como.

Antes de crear cualquier tabla u otro tipo de objeto, es importante


conocer que se almacenan en un determinado esquema o espacio de
nombres.
Los esquemas se corresponden con los usuarios de una base de
datos, por lo que para poder guardar los objetos en un determinado
esquema, deberemos haber creado previamente dicho usuario.
Al crear la base de datos tambin se ha creado una serie de
esquemas que podramos utilizar, pero que no es conveniente hacerlo,
ya que se crearon con nes administrativos.
As, las tablas, vistas y dems que encontraremos en un esquema
como SYS son objetos del sistema y no tienen el propsito de guardar
objetos de usuario.
2

Tablas

Por lo tanto, crearemos un usuario para utilizar su esquema y


almacenar en l los distintos objetos.
Para ello, sitese en la cha o pestaa Administracin y haga
clic en el enlace a Usuarios en el apartado Usuarios y Privilegios de
la seccin Esquema. Seguidamente, pulse en el botn
.
Cada cuenta de usuario viene protegida por una contrasea. Es
decir, que si no se conoce sta, no se podr utilizar el usuario para
acceder a la base de datos. De ah que sea muy importante utilizar
contraseas lo sucientemente complejas.

Adems, este usuario deber tener una determinada cuota en


su tablespace para crear objetos. Como hemos elegido el tablespace
predeterminado, ste ser USERS. Aplique dicha cuota de disco en la
cha Cuotas.

Copyright Computer Aided Education, S.A.

Tablas

Una vez creado el usuario (y, por lo tanto, el esquema),


podremos empezar a pensar en las tablas que necesitamos para nuestra
aplicacin.

2. CREAR TABLAS

tablas.

n la seccin Esquema encontramos enlaces para crear y editar


los objetos ms importantes de una base de datos, como las

Esta pgina representa la estructura habitual que encontraremos


al trabajar en Database Control. Normalmente dispondremos de un
campo de bsqueda y, debajo de l, la lista de objetos con los que
estamos trabajando.
En dicha lista podremos encontrar botones para crear, editar y
eliminar dichos objetos.

Por ejemplo, para crear una tabla, pulsaremos en el botn Crear


de la lista de tablas (que inicialmente aparece vaca).
En ocasiones nos encontraremos que en la misma pgina aparecen
dos botones iguales: uno en la parte superior de una lista y otro en la
parte inferior. Ambos botones realizan la misma funcin por lo que
podemos utilizar cualquiera de ellos. Esto est pensado para facilitar el
trabajo con listas largas de objetos.
4

Tablas

Lo primero que tenemos que indicar al crear una tabla es si ser de


tipo estndar u organizada por ndices. Nosotros elegiremos estndar.
Seguidamente, accedemos a una pgina que se divide en dos
partes: en la parte superior indicaremos caractersticas generales de la
tabla, como su nombre, esquema o tablespace.
Y en la parte inferior la lista de columnas o campos de la tabla,
con todas sus caractersticas.
Oracle transformar los
nombres
introducidos
a maysculas,
siempre que
no lo hayamos
introducido
entre comillas dobles,
en cuyo caso
respetar la
combinacin
de maysculas
y minsculas
utilizada y
exactamente
igual tendrn
que ser referenciados posteriormente.

Adems del nombre de cada campo, tambin debemos indicar el


tipo de datos de los campos o columnas de la tabla.
sta es sin duda la propiedad ms importante de un campo ya que
determina o limita la informacin que puede almacenar.
Oracle proporciona tipos de datos para prcticamente cualquier
tipo de informacin que deseemos guardar. As, si se trata de texto,
podremos utilizar tipos de datos de texto; si se trata de valores
numricos, utilizaremos un tipo de datos adecuado para ello; si son
fechas, lo mismo...
Por ejemplo, para los campos de tipo NUMBER podremos
especicar la precisin (columna tamao) y escala. La precisin
representa el nmero total de dgitos que podr representarse
(incluyendo la parte decimal), mientras que la escala es el nmero
mximo de decimales.
Finalmente, debemos indicar si se permiten o no los valore nulos
(NULL).
Un valor nulo o NULL es un valor especial ya que representa un
valor desconocido o indeterminado. Por lo tanto, es diferente al valor
0 o a la cadena de texto vaca, ya que estos dos ltimos son valores
vlidos.
En algunos campos de una tabla tendr sentido permitir valores
nulos. Por ejemplo, si no queremos exigir que nuestros clientes
proporcionen su fecha de nacimiento, permitiremos los valores nulos
en ese campo para que simplemente no necesiten indicarlo.
Sin embargo, en otros casos esto no es posible. El identicador
del cliente es tan importante (distingue un cliente de otro) que no puede
ser NULL, por lo que no tiene sentido permitirlo.

Copyright Computer Aided Education, S.A.

Tablas

Si desea incluir
caracteres que
no aparecen
en el alfabeto
ingls u otros,
como espacios
en blanco,
delimite el
identificador
con comillas
dobles (").

Aunque Oracle acepta acentos y caracteres latinos (como la ), no


es conveniente utilizarlos en general en los nombres de bases de datos,
tablas o campos. Tampoco es conveniente utilizar espacios en blanco,
ya que diculta posteriormente las consultas.
Adems, pasar a maysculas tanto el nombre de las tablas como
de las distintas columnas.
Finalmente, debemos aadir un detalle ms a la tabla, que es su
clave principal o primaria.
La clave principal de una tabla es aquel campo o conjunto de
campos cuyos valores identican unvocamente cada registro. Es decir,
que son distintos para cada uno de ellos.
En ocasiones podemos encontrar un detalle que tiene estas
caractersticas (podramos haber pensado utilizar el nmero del carn
de identidad de nuestros clientes, por ejemplo) y en otros lo creamos
nosotros mismos.
Esto es lo que hemos hecho en esta tabla de Clientes con el
campo IdCliente, as que vamos a indicar que es su clave principal o
primaria.
Para establecer la clave principal de una tabla, acceda a la
cha Restricciones de la denicin de la tabla, seleccione el tipo de
restriccin PRIMARY y pulse en Agregar.

Tablas

Acceder a una nueva pgina donde debe seleccionar la columna


que formar la clave principal y pasarla desde la lista de Columnas
Disponibles a la de Columnas Seleccionadas.

La clave principal puede constar de ms de un campo, en cuyo caso


situaramos todos esos campos en la lista Columnas Seleccionadas.
Adems, al establecer un campo como clave principal, ya no se
permiten valores nulos en l.
RECUERDE: Durante la creacin de una tabla se aaden
campos y se eligen sus tipos de datos. Finalmente, no debemos olvidar
establecer su clave principal.
3. TIPOS DE DATOS NUMRICOS

ara continuar, he creado algunas tablas ms ya que ahora sabe


cmo hacerlo:

Tabla CarritoCompra: en esta tabla almacenaremos los


detalles de los productos que el cliente ha decidido aadir a su
compra (junto a las cantidades para cada uno de ellos).
Recuerde que se trata de una aplicacin de comercio electrnico,
donde el usuario aade productos en una especie de carrito o cesta
de la compra para nalmente decidirse por comprarlos.
Tabla Categorias: incluye la descripcin de cada categora de
productos que tenemos en nuestra tienda virtual. Por ejemplo,
artculos de decoracin, utensilios de cocina, etc.
Tabla Ordenes: representa un pedido en rme efectuado por
un cliente.
Copyright Computer Aided Education, S.A.

Tablas

Tabla Productos: permite almacenar los detalles descriptivos


sobre los productos que tenemos en la tienda virtual.
En Oracle 10g disponemos de dos tipos principales de datos:
los tipos del sistema y los tipos denidos por el usuario utilizando
herramientas de programacin, como PL/SQL o Java.
En cuanto a los tipos del sistema, podremos encontrar tipos
numricos, de texto, fecha y hora, para datos grandes y otros.
Empecemos con los tipos numricos.
Oracle dispone de dos tipos de datos numricos: NUMBER para
valores que se almacenan de forma exacta y con una determinada
precisin; y el par BINARY_DOUBLE / BINARY_FLOAT para
almacenar valores de coma otante.
Esto quiere decir que normalmente utilizaremos el tipo NUMBER
para representar la mayora de valores numricos, tanto enteros como
con decimales.
Al denir una columna o variable como NUMBER, podemos
especicar dos caractersticas del tipo de datos: su precisin y escala.

Por ejemplo, en la tabla Productos vemos que el campo


IDPRODUCTO es de tipo NUMBER(6) o NUMBER(6, 0), donde el
primer nmero representa la precisin o nmero mximo de dgitos del
valor (contando tanto a la izquierda como a la derecha del separador
decimal), y el segundo la escala o el nmero mximo de decimales del
valor.
Como en este caso queremos representar un valor entero, hemos
indicado 0 para la escala. Oracle tambin acepta otros sinnimos de
tipos enteros, como INT o INTEGER, pero siempre se almacenan como
NUMBER.
8

Tablas

Para el caso del campo PESO permitiremos que ste tenga como
mximo 8 dgitos de los cuales 3 sern para la parte decimal del valor.
Finalmente, en el caso del campo PRECIO vemos cmo podemos
almacenar valores monetarios. Como se puede necesitar gran precisin
y los valores pueden ser muy grandes, se utiliza una precisin de 19
dgitos, de los cuales 4 sern para la parte decimal.
A continuacin se muestran algunos ejemplos:

Valor

123.89
123.89
123.89
123.89
123.89
123.89

Tipo de datos

NUMBER
NUMBER(3)
NUMBER(6, 2)
NUMBER(6, 1)
NUMBER(4, 2)
NUMBER(6, -2)

Se almacena como

123.89
124
123.89
123.9
Supera la precisin
100

Fjese que si la escala es negativa, realmente representa el


nmero de dgitos signicativos a la izquierda del separador
decimal.

Para valores de coma otante, utilizaremos BINARY_DOUBLE


y BINARY_FLOAT para ello.
Tambin se admite el sinnimo FLOAT para representarlos.
El uso ms frecuente de este tipo de datos lo encontramos cuando
trabajamos con valores cientcos o tcnicos.
La diferencia entre BINARY_DOUBLE y BINARY_FLOAT
radica en el rango de valores que se pueden representar y, por
lo tanto, tambin en el espacio que ocupan.

BINARY_DOUBLE utiliza 9 bytes de almacenamiento (de los


cuales 1 es para la longitud) y BINARY_FLOAT 5 bytes de
almacenamiento (de los cuales 1 es para la longitud).

4. TIPOS DE DATOS DE TEXTO

ara almacenar cadenas de caracteres o texto en nuestra


base de datos, disponemos de hasta cuatro tipos de datos:
CHAR y VARCHAR2; y las correspondientes versiones para
caracteres Unicode: NCHAR y NVARCHAR2.

Copyright Computer Aided Education, S.A.

Tablas

Para aplicaciones que pueden ejecutarse


en distintos
pases o distintos idiomas,
utilice los tipos
de datos Unicode.

Los tipos de datos que empiezan por una n almacenan las cadenas
de caracteres con el formato o codicacin Unicode, lo que permite
representar prcticamente cualquier carcter de cualquier idioma.
Esto se consigue almacenando cada carcter como 2 bytes en
lugar de un byte, que es la forma de almacenamiento de los tres tipos
no Unicode.
En resumen: se pueden representar ms caracteres en Unicode
(adems de que se sabe con seguridad que el carcter se representar
siempre de la misma forma, independientemente de la conguracin
del servidor) pero tambin el nmero mximo de caracteres que puede
almacenar un campo Unicode es justamente la mitad que uno no
Unicode.
Aclarado esto, tenemos el tipo CHAR para representar texto de
longitud ja y el tipo VARCHAR2 para representar texto de longitud
variable.
En la tabla Productos puede ver dos campos de texto de longitud
variable. En la columna Tamao se indica el nmero mximo de
caracteres admitido.
Tambin puede ver un campo de tipo CLOB. Este tipo se utiliza
para almacenar grandes fragmentos de texto. VARCHAR2 admite un
mximo de 4000 caracteres, por lo que si necesita ms, deber utilizar
CLOB.
Por ejemplo, hemos utilizado CLOB como el tipo de datos del
campo DESCRIPCION de un producto.

10

Tablas

Se puede
utilizar el
tipo CHAR(1)
para representar valores
booleanos;
esto es, que
son o verdadero ('1') o falso
('0').

Mientras que en la tabla Clientes (tal como vemos en la gura de la


pgina anterior) tambin podemos encontrar el campo CODPOSTAL
como un campo de tamao jo, con 5 caracteres como mximo. Por
lo tanto, independientemente de lo que introduzcamos, siempre se
guardarn 5 bytes o caracteres, rellenndose con espacios en blanco a
su derecha, si es necesario.

5. TIPOS DE DATOS DE FECHA Y HORA

racle permite almacenar datos que representan fechas y


horas. Estos valores se conocen como datetime.

La ventaja de esto es que posteriormente se puede aplicar aritmtica


o comparacin de fechas. Por ejemplo, se puede aadir un da, un mes,
minutos, segundos, etc. a una fecha u hora.
Si en lugar de ello se almacenan como cadenas de caracteres,
entonces esto puede ser ms dicultoso de conseguir.
Para representar fechas y horas, se utilizan los tipos de datos DATE
y TIMESTAMP.
En la tabla Clientes tenemos un campo de tipo DATE para
almacenar la fecha y hora de nacimiento. Si no se indica la hora, se
entiende que es la 00:00:00 del da en cuestin.
Usualmente se introducen o se hace referencia a fechas/horas a
travs de cadenas de texto. Por ejemplo, podramos utilizar la cadena
13/08/1971 para representar el 13 de agosto de 1971.
Sin embargo, veremos que esto puede representar problemas ya
que depender de la conguracin local del servidor el que se interprete
una cadena de una forma u otra.
Como regla general es mejor producir fechas con las funciones
que para ello nos proporcione nuestro lenguaje de programacin que
introducirlas directamente como cadenas de texto.
Por su parte, el tipo TIMESTAMP se utiliza para marcar
momentos precisos en el tiempo, ya que permite guardar hasta
fracciones de segundo.

Copyright Computer Aided Education, S.A.

11

Tablas

stos son los principales tipos de datos que utilizar en las bases
de datos Oracle, aunque es necesario comentar tambin la posibilidad
de introducir datos XML.
Oracle incorpora un tipo de datos para almacenar informacin
en formato XML. Esto se podra hacer tambin mediante tipos de
texto, pero con un tipo especco para ello conseguimos mayor
funcionalidad.
En Oracle 10g podremos hacer que el servidor interprete y valide
los documentos XML de forma que se encargue de comprobar si estn
bien formados e incluso si son vlidos respecto a un esquema XSD
donde se especican los tipos de datos del documento XML y sus
restricciones. Todo esto, como algo propio de la base de datos.
Otros tipos de datos disponibles en Oracle 10g:
TIMESTAMP WITH TIMEZONE: es una variante del tipo
de datos TIMESTAMP en el que se incluye la zona horaria del
servidor.

TIMESTAMP WITH LOCAL TIMEZONE: en este caso


la fecha y hora se almacena normalizada, lo que quiere decir
que cuando se extrae de la base de datos, se proporciona
transformada a la zona horaria del cliente que la recibe.

INTERVAL YEAR TO MONTH: este tipo de datos es til

INTERVAL DAY TO SECOND: este tipo de datos es til

cuando deseamos representar la diferencia entre dos fechas


en las que nicamente el ao y el mes son importantes.

cuando deseamos representar la diferencia entre dos fechas


concretas. Almacenan perodos de tiempo que incluyen das,
horas, minutos y segundos.

RAW: para almacenar informacin en formato binario, como


imgenes, documentos, sonidos, vdeos, etc.

12

LOB: permiten almacenar grandes cantidades de


informacin. Un subtipo de LOB es CLOB (o NCLOB) para
almacenar grandes cantidades de texto.

BFILE: permite el acceso a datos binarios que no se


almacenan en la propia base de datos, sino como archivos
independientes.

Tablas

6. SECUENCIAS

n muchas ocasiones deseamos que los valores que se


almacenan en un campo sean nicos para cada registro, como
ocurre en el caso de las claves principales de una tabla.
Oracle puede encargarse de generar valores enteros nicos a travs
del concepto de secuencia.
Una secuencia es un objeto ms de un esquema, que podemos
utilizar a la hora de generar nmeros enteros nicos.
Por ejemplo, en lugar de tener que llevar la cuenta de los
clientes que introducimos en una tabla, por qu no hacemos que sea
Oracle el que se encargue de ello?
Esto es tan fcil como crear una secuencia y solicitar los
identicadores de cada registro en el momento de su creacin.
Para crear secuencias, acceda al correspondiente enlace en
el apartado Objetos de Base de Datos de la seccin Esquema.
Seguidamente, pulse en el botn
.

Debemos indicar el nombre de la secuencia, que ser utilizado


posteriormente cuando solicitemos un valor de la secuencia, el valor
inicial y mximo, el intervalo entre cada valor generado y opciones de
cach.
En la seccin Valores podemos indicar:
- El valor mnimo y mximo de la secuencia.
- El valor inicial.
- El intervalo entre cada valor generado.
Copyright Computer Aided Education, S.A.

13

Tablas

Finalmente, vemos una seccin de opciones y otra de cach. En


la de opciones podremos indicar qu debe ocurrir cuando se alcance el
lmite impuesto (es decir, el valor mximo en una secuencia ascendente
o mnimo en una descendente); y si deseamos que los nmeros se
generen ordenadamente.
Normalmente los valores de una secuencia se generan
ordenadamente, por lo que no es necesario activar esta opcin.
La seccin cach es muy importante, ya que permite que
establezcamos (o no) la cach para la secuencia. La idea de la cach
es que la primera vez que se utiliza la secuencia, no slo se reserva el
valor devuelto sino un conjunto de valores (20 por defecto).
Ms tarde, cuando se vuelve a solicitar un nmero, se coge de
esta cach con lo que el proceso es ms rpido al no tener que acceder
de nuevo a la secuencia hasta que se agoten los valores de la cach,
momento en el que se vuelven a coger ms nmeros.
A cambio de esta ventaja en las prestaciones, hay que tener en
cuenta que si la base de datos es reiniciada por cualquier motivo, como
un fallo en el servidor, los valores libres en cach se perdern, por
lo que podramos tener huecos entre los valores generados por una
secuencia. Si no se desea tener esos huecos, lo mejor es desactivar la
cach.
Ms tarde veremos cmo podemos solicitar valores de la secuencia.
Normalmente crearemos una secuencia por cada campo clave principal
donde lo necesitemos. Adems, es importante darse cuenta de que las
secuencias y las tablas son objetos distintos e independientes.

14

Relaciones
1. INTRODUCCIN

n todo diseo de una base de datos relacional nos encontramos


con dos conceptos fundamentalmente: las tablas y las
relaciones.
Las tablas permiten almacenar la informacin necesaria, mientras
que las relaciones tienen dos objetivos: facilitar la extraccin o consulta
de dicha informacin y asegurar su integridad, es decir, mantener la
base de datos en un estado coherente.
Para esto ltimo se utiliza lo que se conoce como restricciones de
integridad referencial. Aunque el nombre puede parecer complicado,
veremos que no lo es tanto.
Supondremos que disponemos del diseo de nuestra base de datos,
por lo que no slo conocemos las tablas requeridas sino tambin qu
relaciones existen entre ellas. Veamos pues, cmo implementar esta
parte del diseo utilizando Oracle Enterprise Manager.
2. RELACIONES 1 A MUCHOS

o primero que tenemos que conocer es que podemos encontrar


dos tipos de relaciones: 1 a muchos y Muchos a muchos.

Una relacin 1 a muchos entre dos tablas promociona una de las


tablas como principal y otra como secundaria.
Qu quiere decir esto? Es mejor verlo con un ejemplo.
Cojamos el caso de la relacin entre las tablas Categorias y
Productos. Si piensa en ello, comprobar que una categora puede tener
muchos productos relacionados, en el sentido de que estn clasicados
dentro de la misma; y, sin embargo, un producto slo puede pertenecer
a una determinada categora.
Vemos, por lo tanto, que aqu la tabla principal o parte 1 es la de
Categorias y la tabla secundaria o parte muchos es la de Productos.
Este tipo de relaciones es muy fcil de representar en una base de
datos Oracle:
1.- Debe crear un campo adicional en la tabla secundaria que haga
referencia a la tabla principal.
2.- Debe establecer la relacin.
Copyright Computer Aided Education, S.A.

Relaciones

Aunque no es
obligatorio,
por claridad
le recomendamos que utilice
el mismo nombre en ambas
tablas. As,
si el campo
clave principal
de la tabla
Categorias es
IDCATEGORIA,
cree un nuevo
campo con
las mismas
caractersticas
y nombre en la
tabla Productos.

Aqu lo que estamos haciendo ahora es representar la relacin 1 a


muchos entre las tablas Categorias y Productos con el nuevo campo
IdCategoria. De esta forma, para cada producto ser muy fcil conocer
en qu categora est clasicado.
El dato que se guardar en este nuevo campo es justamente el
identicador o clave principal de la categora (tabla principal de la
relacin), por lo que este campo debe ser del mismo tipo que aquel o,
al menos, de un tipo de datos compatible.
Finalmente, debemos decidir si permitiremos valores nulos para el
campo que hace referencia a una categora o no. Esto depende mucho
de la naturaleza de la relacin.
Debe preguntarse: tiene sentido disponer de un producto del
que no conocemos su categora? Si la respuesta puede ser s, entonces
permita los valores nulos; en caso contrario, no lo permita.
Y cundo puede tener sentido en este caso? Bien, imagine que se
elimina una categora.
Si desea que los productos de esa categora sigan existiendo en
la base de datos, tal vez sea conveniente permitir valores nulos en el
campo IdCategoria de la tabla Productos. De esta forma, se podra
representar un producto de una categora eliminada.
Como puede ver, permitir los valores nulos suele complicar el
diseo (y programacin) de la base de datos. Pero es algo que tenemos
que estudiar para ver si lo necesitamos.

Relaciones

Tras aadir el campo que representa la relacin, debemos denirla


realmente. Esto se consigue creando una restriccin del tipo FOREIGN
KEY en la estructura de la tabla secundaria.
Para ello, nos situaremos en la cha Restricciones, elegiremos el
tipo FOREIGN y pulsaremos en el botn Agregar.

En la nueva pgina web se nos explica la naturaleza de una


restriccin FOREIGN, haciendo referencia a la posibilidad de reejar
la relacin existente entre dos tablas.
Si no especicamos un nombre, Oracle genera uno automtica
mente. Sin embargo, en este tipo de restricciones es mucho mejor
introducir un nombre descriptivo, ya que posteriormente podremos
necesitarlo.
Por ejemplo, con FK_Productos_Categorias reejamos que se
trata de una relacin de clave externa (Foreign Key), de forma que la
tabla Productos (tabla secundaria) hace referencia a la tabla Categorias
(tabla principal).

Ve cmo es
til que ambos
campos tengan
el mismo nombre? De esta
forma, es fcil
identificarlos.

Seguidamente debemos indicar las columnas de la tabla secundaria


y principal que establecen la relacin. En la gura anterior vemos que
se establece una relacin entre las tablas Categorias y Productos a
travs del campo IdCategoria de ambas tablas.
De esta forma ira creando las relaciones entre las distintas
tablas.

Copyright Computer Aided Education, S.A.

Relaciones

3. RESTRICCIONES DE INTEGRIDAD REFERENCIAL

emos comentado que uno de los objetivos de las relaciones


es mantener la base de datos en un estado coherente.

Tal vez no ha entendido muy bien a qu nos estbamos reriendo


y tiene razn. Bien, lo que esto quiere decir es que los datos que se
almacenan en las distintas tablas deben cumplir una serie de restricciones
y no poder almacenar cualquier valor.
Con el ejemplo de las tablas Categorias y Productos se ve muy
bien. Imagine que est introduciendo un nuevo producto en el catlogo
de la tienda.
Lgicamente necesita conocer en qu categora lo incluir y, lo
que es incluso ms importante, que esa categora exista en la tabla
Categorias.
Puede desactivar una restriccin FOREIGN
accediendo a
su edicin en
EM Database
Control.

Por qu? Porque si no es as, incluira un producto de una


categora inexistente.
Para que esto lo controle la propia base de datos, la restriccin de
tipo FOREIGN tiene que estar activada.

Es decir, que la columna Desactivado de dicha restriccin debe


indicar el valor No. Por defecto, la restriccin se crea de esta forma,
pero posteriormente podramos desactivarla temporalmente si as lo
necesitamos.
Adicionalmente, podemos indicar qu ocurre cuando se modican o
eliminan registros de la tabla principal. Volvamos a nuestro ejemplo:
---> Qu debe ocurrir cuando se modica el valor del
identicador de una categora en la tabla Categorias?
Si est activada la restriccin FOREIGN y dicha categora dispone
de productos relacionados, Oracle no permitir la modicacin.
4

Relaciones

---> Qu debe ocurrir cuando se elimine una categora en la


tabla Categorias?
En este caso tenemos hasta tres opciones:
No permitirlo si la categora tiene productos relacionados.
Eliminar tambin esos productos relacionados (en cascada).
Establecer a NULL el campo IDCATEGORIA de los productos
relacionados.
Si deseamos aplicar la operacin ON DELETE CASCADE u
ON DELETE SET NULL, no podremos hacerlo directamente aqu
sino que ser necesario indicarlo mediante un comando SQL de
modicacin de la tabla.
Una forma de ejecutar un comando SQL directamente contra el
motor de base de datos es hacerlo mediante la herramienta sqlplus. Esta
herramienta aparece en el grupo de programas de Oracle - Desarrollo
de aplicaciones, pero si desea acceder a ella como administrador de
la base de datos (SYSDBA), es mejor ejecutarla directamente con el
comando sqlplusw /nolog.
Con ello, acceder a una ventana o consola donde lo primero es
conectarse con el usuario oportuno y despus ejecutar los distintos
comandos SQL que necesite. Obsrvelo en la gura adjunta.

Copyright Computer Aided Education, S.A.

Relaciones

Si desea aplicar ON DELETE CASCADE u ON DELETE SET


NULL, deber hacerlo mediante un comando ALTER TABLE o en
el momento de crear la tabla de la misma forma, pero con el comando
CREATE TABLE.
Desgraciadamente EM Database Control no lo permite hacer
visualmente.
La sintaxis sera:
ALTER TABLE tablaSecundaria
ADD CONSTRAINT restriccion
FOREIGN KEY (campo)
REFERENCES tablaPrincipal (campo)
ON DELETE CASCADE;

Al exigir las restricciones de integridad referencial, nos aseguramos


de que la base de datos se mantendr en un estado coherente.
Adems, podemos indicar qu queremos que ocurra cuando se
elimina un registro que tiene registros relacionados en otras tablas.
Por defecto, esto no se permitir, pero podremos indicar que
tambin se eliminen esos registros relacionados si activamos la opcin
de hacerlo en cascada.
Esta opcin no est disponible para las actualizaciones en cascada,
algo que s que est disponible en otras bases de datos.
Otras relaciones 1 a muchos que puede encontrar en esta base de
datos son:
- Los carritos de la compra contienen productos (tablas
CarritoCompra y Productos).
- Los clientes realizan rdenes de compra (tablas Clientes y
Ordenes).
- ...

Relaciones

4. RELACIONES MUCHOS A MUCHOS

ontinuamos la leccin estudiando otro tipo de relacin menos


frecuente pero que tambin puede aparecer en una base de
datos: las relaciones muchos a muchos.
Por ejemplo, piense que en una orden de compra pueden aparecer
varios productos (junto a la cantidad en que se compran) y, adems, un
producto puede aparecer en varias rdenes de compra.
Por lo tanto, estamos identicando una relacin muchos a muchos
entre las tablas Productos y Ordenes.
Las relaciones muchos a muchos no se pueden representar
directamente en una base de datos relacional, sino que se tienen que
seguir estos pasos:
1.- Crear una nueva tabla en la que aparecern dos campos
representando las claves principales de las tablas relacionadas.
Estos dos campos constituirn la clave principal de la nueva
tabla.
Adicionalmente pueden aparecer ms campos en esta tabla,
propios de la relacin.
2.- Una vez creada la tabla adicional, establecer una relacin 1 a
muchos entre la nueva tabla y cada una de las tablas implicadas.
Aqu puede ver la tabla LineasOrden, que reeja justamente
la relacin Muchos a muchos entre las tablas Ordenes y Productos.
Fjese que la clave principal de esta nueva tabla es el par (IdOrden,
IdProducto), es decir, las claves de las tablas implicadas.

Copyright Computer Aided Education, S.A.

Relaciones

Fjese cmo se utiliz la herramienta sql*plus para generar las


dos restricciones FOREIGN, estableciendo la eliminacin en cascada.

Recuerde que si no desea aplicar las operaciones ON DELETE


CASCADE u ON DELETE SET NULL, podr crear las restricciones
de integridad referencial ms fcilmente desde EM Database Control.
Fjese todo lo que estamos consiguiendo con las relaciones y la
integridad referencial:
Al aadir nuevos registros, nos aseguramos de que los valores
de las claves externas existen en las tablas principales a las que
hacen referencia.
Al eliminar un registro en la tabla principal, ocurrir lo mismo
en los registros relacionados de la tabla secundaria.
Aunque denir las relaciones y exigir la integridad referencial va
a dicultar la programacin, ya que se tienen que cumplir todas estas
restricciones, facilitamos que no se pueda dejar la base de datos en un
estado inconsistente.

Propiedades de tabla
1. VALORES PREDETERMINADOS

urante el diseo de las tablas en Oracle, vemos que


principalmente tenemos que hacer dos cosas: crear las
columnas que las constituyen (indicando el tipo de datos de cada una
de ellas) y establecer su clave principal.
Despus, cuando comprobamos que necesitamos algo ms
para poder extraer resultados tiles de la informacin almacenada
en la base de datos y para mantener su integridad, establecemos las
correspondientes relaciones o restricciones de clave externa.
Oracle permite anar todava ms el diseo de las tablas,
incluyendo conceptos que nos permiten representar lo ms elmente
posible la naturaleza de la informacin que en ellas se almacena.
Valores predeterminados, restricciones de valor, restricciones de
unicidad, etc. hacen que la base de datos incluya por s misma cierta
lgica y no slo datos.
Como resultado de todo esto, tendremos que la propia base de datos
se encargar de comprobar y exigir la coherencia de la informacin
almacenada independientemente de la aplicacin que interacta con
ella.
Una caracterstica que podemos establecer siguiendo este
razonamiento es incluir el valor predeterminado de las columnas o
campos de una tabla.
Qu es esto? Pues el valor que se insertar en el campo si no
se indica ninguno. El valor predeterminado debe ser acorde al tipo de
datos de la columna.
Por ejemplo, uno de los campos de la tabla Productos es
IMAGEURL, donde se indica la ubicacin y nombre de una pequea
imagen representativa del producto.
Podramos preparar una imagen genrica para los casos en que
no se disponga de ninguna imagen particular del producto. Pues esa
imagen puede ser el valor predeterminado de este campo.
El valor predeterminado de un campo se establece en la columna
Valor por Defecto, como puede ver en la gura de la pgina
siguiente.

Copyright Computer Aided Education, S.A.

Propiedades de tabla

El valor predeterminado puede ser tanto una constante como una


expresin, pero debe ser de un tipo acorde al tipo de datos del campo
de la tabla.
Fjese: como el campo IMAGEURL es de tipo VARCHAR2,
espera una cadena de texto, por lo que debe incluirse entre comillas
simples. Es decir, que si no se indica una imagen particular, cada
producto tendr la imagen sinfoto.gif por defecto.
Si el campo fuera numrico, incluiramos un nmero; si fuera de
tipo fecha y hora, una fecha correcta.
Veamos otro ejemplo. Como se ha comentado anteriormente,
podemos utilizar una expresin para obtener el valor predeterminado.
Lo importante es que esa expresin se evale a un valor correcto para
el campo en cuestin. En la gura de la pgina siguiente vemos que se
ha utilizado la funcin SYSDATE para obtener la fecha y hora actual
del servidor. Estos detalles sern el valor predeterminado del campo
FechaOrden de la tabla Ordenes.
Por lo tanto, cuando se cree una orden, tendr como fecha la de
ese momento. Esto no quiere decir que no podamos insertar un valor
distinto. Aunque un campo tenga valor predeterminado, siempre
podremos insertar uno distinto.
La cuestin es que si no lo hacemos, tendr el valor
predeterminado.

Propiedades de tabla

2. RESTRICCIONES CHECK

Check.

tra caracterstica asociada con una columna que podemos


utilizar son las restricciones de valor o restricciones

El concepto es parecido al de las restricciones de integridad


referencial, ya que estas ltimas restringen el valor que pueden tener
ciertas columnas a los valores almacenados en otra columna de una
tabla distinta (un producto debe tener una categora existente en la
tabla Categorias, por ejemplo).
Las restricciones Check son parecidas a esto pero los valores que
puede albergar una columna de tabla no hacen referencia a otra columna
de otra tabla, sino a un conjunto de valores conocidos y establecidos
directamente en la restriccin.
Con un ejemplo se ve todo ms claro. Fjese en la tabla Ordenes.
Vemos que para cada orden nos guardamos tanto la fecha de expedicin
de la orden (campo FechaOrden) como la fecha real del envo de la
orden (campo FechaEnvio).
Como ambos campos son del tipo DATE, pueden albergar
cualquier fecha/hora correcta. Pero, tiene sentido que la fecha de
envo de la orden sea anterior a la fecha de expedicin?

Copyright Computer Aided Education, S.A.

Propiedades de tabla

Claramente no, ya que no deberamos permitir que se guarde una


fecha de envo anterior a la fecha en la que realmente se crea la orden.
Para establecer esta restriccin, debemos utilizar una restriccin
Check. Podr hacerlo en la cha Restricciones de la tabla, desplegando
el tipo de restriccin, eligiendo CHECK y despus pulsando el botn
Agregar.

Con esta restriccin queremos asegurar que nunca se guardar


una fecha de envo posterior a la fecha de creacin de la orden.
Fjese que se indica un nombre descriptivo (utilizaremos el prejo
CK para las restricciones de Check) y el campo Condicin de Control
establece dicha restriccin.
Es intersante darse cuenta de que aqu podemos comparar dos fechas
directamente porque tanto el campo FechaOrden como FechaEnvio
son de tipo DATE. Si las hubisemos guardado como caracteres, esto
no sera tan sencillo, teniendo que convertirlas previamente a un tipo
de fecha.
La Condicin de Control no puede incluir referencias a
funciones no deterministas, es decir, que no devuelven siempre
el mismo valor con los mismos parmetros. Por ejemplo, no
puede utilizar la funcin SYSDATE, ya que devuelve un valor
distinto (la fecha y hora actual) cada vez que se invoca.

Adicionalmente, con el atributo Validar podremos indicar si


queremos aplicar la restriccin incluso para los datos que ya pudieran
almacenarse en la tabla.
Adems tambin podemos activar o desactivar la restriccin.

Propiedades de tabla

Si desea
deshabilitar
temporalmente
una restriccin
Check, active
el atributo
Desactivado.
Esto puede ser
necesario, por
ejemplo, cuando se importan
datos provenientes de otra
base de datos
donde la informacin puede
no respetar
la restriccin
establecida.

En la gura siguiente aparece la restriccin Check que acabamos


de crear junto a otras de este tipo que genera Oracle automticamente.
Por ejemplo, cada vez que indicamos que un campo no puede
tener valores nulos, Oracle implementa esta caracterstica con una
restriccin Check.

Veamos otro ejemplo de restriccin Check. Vamos a exigir que


la direccin de correo electrnico que introduce cada cliente tiene que
incluir siempre el carcter arroba (@).
Una expresin que podramos utilizar como Condicin de control
de la restriccin sera:
INSTR(EMAIL, '@') <> 0
En este caso utilizamos la funcin INSTR, que devuelve la
posicin inicial de una expresin en una cadena de caracteres. Nosotros
buscamos el carcter arroba @ en el campo Email.
La restriccin comprueba que la posicin inicial de este carcter
sea distinto de cero; es decir, que exista el carcter arroba en el valor
del campo Email.
En resumen vemos que las restricciones Check permiten introducir
restricciones o limitaciones de sentido comn en la propia denicin
de la tabla.
Al guardarlas como parte de la tabla, es Oracle el que se encarga de
aplicarlas cuando se insertan nuevos registros o cuando se actualizan los
existentes, por lo que nuestras aplicaciones no tienen que preocuparse
de ello.

Copyright Computer Aided Education, S.A.

Propiedades de tabla

Otros ejemplos de restricciones Check que podramos utilizar


en nuestra base de datos:
- Cantidad > 0: para exigir que la cantidad comprada de un
producto en cierta orden sea siempre positiva.
- Edad BETWEEN 18 AND 120: La edad de los clientes tiene
que estar entre los 18 y 120 aos.
- Sexo IN ('Masculino', 'Femenino'): El campo Sexo slo puede
almacenar la palabra Masculino o Femenino.
En resumen, podemos utilizar constantes, funciones y
operadores del lenguaje propio de Oracle, conocido como PL/
SQL.

3. RESTRICCIONES UNIQUE

uando estudiamos la forma de establece la clave principal


de una tabla, indicamos que, de esta forma, cada registro se
identicaba unvocamente, ya que no poda haber valores repetidos
para la clave principal.
Las restricciones UNIQUE son parecidas en este aspecto, ya que
no permiten que en un campo haya valores repetidos, pero se diferencian
de las claves principales en que s que pueden admitir valores NULL.
Adems, podemos denir varias restricciones UNIQUE en una tabla,
pero sta slo podr tener una clave principal (compuesta por uno o
ms campos).
Por lo tanto, podemos utilizar restricciones UNIQUE para
garantizar que no se introducen valores duplicados en campos que no
forman la clave principal de la tabla.
Por ejemplo, en la tabla Clientes podra tener sentido garantizar
que los clientes no introducen direcciones de correo electrnico
repetidas.
Crear una restriccin de este tipo es igual que en el resto de los
casos. Accederemos a la cha Restricciones de la correspondiente tabla,
elegiremos UNIQUE en la lista de tipo de restriccin y pulsaremos en
el botn Agregar.

Propiedades de tabla

Deber elegir el campo o conjunto de campos que se vern


afectados por la restriccin UNIQUE en la lista Columnas Disponibles
y pasarlo a la lista de Columnas Seleccionadas mediante el botn
Mover.
Para este tipo de restricciones, utilizaremos un nombre que
empiece con el prejo UN, como puede ver en la gura anterior.
Tenga en cuenta que Oracle no evala como iguales dos campos
con el valor NULL, por lo que aceptar ms de un valor NULL
almacenado en el campo EMAIL de esta tabla.
Este comportamiento puede ser distinto en otras bases de datos,
como Microsoft SQL Server.
Y es que el valor NULL es distinto a cualquier otro, por lo que
slo puede preguntarse si es nulo o no, pero no compararlo con otro,
aunque sea otro valor nulo.

Copyright Computer Aided Education, S.A.

ndices
1. INTRODUCCIN

os ndices son uno de los objetos de una base de datos que


menos frecuentemente se utilizan, y que, sin embargo, pueden
determinar en gran medida las prestaciones de la base de datos.
Los ndices son estructuras que se utilizan para acceder rpidamente
a la informacin almacenada en las tablas. La idea principal es evitar
recorrer la tabla para lo que, en lugar de ello, se accede al ndice.
Debido a esto, durante el diseo inicial de las tablas podemos
anticipar la utilizacin de alguno de los ndices pero no de todos.
Normalmente, el diseador de bases de datos debe estar atento
al uso que se est haciendo de la base de datos; es decir, a las consultas
ms frecuentes, y generar nuevos ndices si ello contribuye a mejorar
su rendimiento.
Sin embargo, aunque pueda parecer que la creacin de ndices es
algo que mejora las prestaciones de la base de datos, no tiene por qu
ser siempre as.
Si pensamos que normalmente ser ms rpido consultar un ndice
que recorrer toda una tabla, entendemos que los ndices son tiles
cuando queremos consultar la informacin de una tabla.
Sin embargo, si pensamos en lo que ocurre cada vez que insertamos
nuevos registros o que modicamos/eliminamos los existentes en
una tabla, veremos que la presencia de ndices puede ralentizar estos
procesos ya que tambin tienen que ser actualizados.
Esto nos debe hacer pensar que un buen diseo de ndices es
crucial en nuestra base de datos y que segn las caractersticas de sta,
ser adecuado utilizarlos en mayor o menor medida.
Como regla general, aunque sin poder tomarla al pie de la letra,
podemos pensar en la creacin de ndices cuando la operacin ms
frecuente contra la tabla es la consulta de sus datos; por otra parte,
deberemos evitar crear muchos ndices si lo ms frecuente es insertar,
actualizar o eliminar registros en dicha tabla.
En esta leccin veremos qu considerar durante el diseo de los
ndices y ofreceremos toda una serie de directrices que nos pueden
ayudar en este proceso, pero teniendo en cuenta que muchas veces es
necesario realizar pruebas del rendimiento de la base de datos para
encontrar el mejor conjunto de ndices.
Copyright Computer Aided Education, S.A.

ndices

2. CREAR NDICES

o primero que tenemos que saber es que Oracle utiliza


los ndices para llevar a cabo algunas de las restricciones
que establecemos en nuestras tablas, como las de clave principal y
restricciones UNIQUE.

Aqu vemos que la tabla Clientes tiene un ndice asociado con la


columna IdCliente porque sta es la clave principal de la tabla, y un
ndice establecido para la columna Email, que se cre automticamente
tambin al establecer la restriccin UNIQUE en dicho campo.
Las restricciones de clave principal y UNIQUE generan
automticamente ndices en la denicin de la tabla, ya que es la forma
que tiene Oracle de implementarlas.
Sin embargo, usted establece restricciones desde un punto de vista
lgico y para mantener la integridad de los datos, mientras que crea
ndices cuando est estudiando la optimizacin de la base de datos.
En la pgina siguiente podemos ver la estructura de un ndice.
Se trata del ndice segn el campo IdCliente de la tabla
Clientes.
En un ndice encontramos tres tipos de registros o nodos: el
nodo raz, los nodos intermedios (ramas) y los nodos hoja.

ndices

El nodo raz es desde donde parte toda la estructura, que


se ampla con los nodos intermedios y que llega a las hojas
de datos o donde encontramos los enlaces a la informacin
almacenada en la tabla.

Por ejemplo, imagine la consulta todos aquellos clientes cuyo


IdCliente est contenido entre el 158 y el 271.
Cuando Oracle recibe esta consulta, comprueba qu valor
almacenado en el nodo raz del ndice es el ms apropiado para
empezar a buscar y elige el 157.
Fjese que en el ndice slo se almacena el valor de IdCliente
(columna clave del ndice) y no el resto de detalles que tenemos
en la tabla Clientes.
Este valor apunta a un nodo intermedio que nalmente da paso
a las hojas donde se incluye un puntero o enlace a los datos
buscados en la tabla.
Como el ndice se mantiene ordenado, las consultas en las que
solicitamos rangos de datos continuos, como la del ejemplo, se
benecian en gran medida del ndice.

Veamos cmo podramos crear nosotros los ndices que estimemos


oportuno. Para ello, si se encuentra editando una tabla, sitese en la
cha ndices y elija Crear ndice en la lista de Acciones. Finalmente,
pulse en el botn Ir.

Copyright Computer Aided Education, S.A.

ndices

Tambin puede crear ndices independientemente de las tablas,


utilizando el enlace adecuado en el apartado Objetos de Base de Datos
de la pgina de administracin.
Imagine que es frecuente consultar la base de datos para conocer
los productos de una determinada categora. Por ejemplo, podramos
incluir un ltro en la aplicacin web que accede a la base de datos
para que el usuario elija el tipo o categora de productos que quiere
comprar.
En este caso, disponer de un ndice segn el identicador de
la categora en la tabla Productos podra acelerar el acceso a dicha
informacin, ya que en el ndice dispondramos de la ubicacin exacta
de cada producto de dicha categora.
Seguramente utilizar este ndice sea ms efectivo que recorrer
toda la tabla, sobre todo si sta tiene muchos productos.

A la hora de crear un ndice debemos indicar su nombre, la


tabla a la que har referencia y sobre qu columnas actuar o tendr
almacenadas en su estructura (claves del ndice).
Podemos elegir entre dos tipos de ndice: Estndar (B-Tree) o
Bitmap.

ndices

Los ndices que se utilizan en una base de datos OLTP, como la


nuestra, son los ndices Estndar o B-TREE. Los ndices Bitmap se
utilizan en bases de datos OLAP.
En la parte inferior de la pgina es donde indicaremos la tabla y
qu columna o conjunto de columnas formarn parte del ndice.
Siempre debe
poner el orden
anterior en
las columnas
que ms se
utilicen.

Vemos que hemos escrito un 1 para la columna IDCATEGORIA.


De esta forma indicamos que el ndice se formar a partir de esta
columna o campo de la tabla.
En el caso de que en el ndice se incluya ms de una columna,
deberemos indicar el orden (1, 2, 3, ....) en que queremos utilizarlas.
Esto es muy importante, ya que puede determinar que se utilice o
no el ndice ante una consulta.
En general, utilice ndices en aquellas tablas en las que no sea
muy frecuente la insercin o modicacin de datos, sino ms bien su
consulta. Pero, adems, recuerde las siguientes indicaciones:
Tener en cuenta campos en los que sus valores tengan un alto
grado de unicidad. Por ejemplo, no es adecuado crear un ndice
en un campo donde se almacene el sexo de una persona, ya que
slo puede haber dos posibles valores: hombre o mujer.
Tener en cuenta campos en los que se realicen consultas de
intervalos: IdProducto entre el 10 y el 35, Ordenes enviadas
durante el mes de agosto, etc. Se reeren a consultas en las
que se utilizan la clusula BETWEEN o los operadores <, >,
<= y >= del lenguaje SQL.
Campos que aparecen en clusulas ORDER BY o GROUP BY
del lenguaje SQL. Ya que estos comandos ordenan el resultado
de la consulta, es til tener un ndice en dichos campos porque
los enlaces a los registros ya estarn ordenados.
Utilice ndices para mejorar el rendimiento de consultas con
clusulas JOIN o GROUP BY del lenguaje SQL.
Los campos que acten como clave externa en una relacin con
otra tabla son candidatos para establecer ndices.

Copyright Computer Aided Education, S.A.

ndices

3. OPCIONES DE NDICE

a sea durante la creacin del ndice o, posteriormente al


editarlo, podemos establecer una serie de propiedades y
opciones del ndice que debemos conocer.
La primera de ellas la tenemos aqu en la cha General del
ndice. Junto a la columna o columnas que lo forman, podemos indicar
cmo deben mantenerse ordenados los valores del ndice: ascendente
o descendentemente.
Por defecto, el orden es ascendente. En nuestro caso esto signica
que en el ndice se guardar el identicador de la categora de cada
producto ascendentemente.
Este detalle debe concordar con el orden en que normalmente
se utilizarn los valores clave del ndice: si las consultas reclaman un
determinado orden en su resultado, ese orden es el que debera elegir
para el ndice.
Con el botn Agregar Expresin de Columna podemos hacer
que se guarde el resultado de una determinada expresin en la que
interviene la columna indizada en lugar de su valor real.
Esto se utiliza mucho en columnas de texto para evitar la necesidad
de utilizar funciones a la hora de comparar cadenas de caracteres.
Para que
se utilice el
ndice, debe
escribir la misma expresin
en su consulta
SQL que en la
definicin del
ndice.

Por ejemplo, una forma rpida de asegurarnos de comparar dos


cadenas sin tener en cuenta la combinacin de maysculas y minsculas
que tienen es pasarlas ambas a maysculas o a minsculas.
Para ello podemos utilizar las funciones UPPER y LOWER,
respectivamente.
Pues bien, si utiliza esta estrategia en sus consultas SQL,
seguramente ser mejor guardar los valores de la columna en maysculas
(o minsculas) en el ndice.
De esta forma, se utilizar el valor almacenado en el ndice en
lugar de tener que ejecutar la funcin UPPER o LOWER para cada
registro afectado por la consulta SQL
Podemos utilizar cualquier funcin, incluso aquellas que nosotros
mismos creemos, pero siempre que sean deterministas.

ndices

En la cha Opciones encontraremos otras propiedades del


ndice.

Si el campo o conjunto de campos que usted ha elegido para crear


el ndice tiene la caracterstica de ser nico para los registros de la
tabla, debe especicarlo en la propiedad nico.
Oracle utiliza un ndice nico cuando establecemos restricciones
UNIQUE.
Oracle no almacena entradas en el ndice para aquellos registros
con el valor NULL.
Por lo tanto, aunque establezcamos la propiedad nico para el
ndice, podra existir una tabla con mltiples valores NULL en
el campo del ndice.

La propiedad Inverso se utiliza cada vez menos. Sirve para


almacenar, en forma inversa, los valores en el ndice con el objetivo de
que est balanceado.
Qu signica esto? Bien, para entenderlo es mejor pensar en el
ndice como en un rbol. Si el rbol crece siempre de un lado (por
ejemplo, de su lado derecho), entonces el rbol no est balanceado.
Esto puede ocurrir cuando los registros que se crean en la tabla
tienen valores del ndice ascendentes (por ejemplo, cuando en el
ndice se incluye un campo cuyos valores provienen de una secuencia
ascendente).
En este caso, y para facilitar el que el rbol se mantenga balanceado,
podramos guardar los valores de forma inversa en el ndice.

Copyright Computer Aided Education, S.A.

ndices

Sin embargo, esto tena ms sentido en versiones anteriores de


Oracle, ya que actualmente el servidor utiliza tcnicas para que el rbol
que representa un ndice se mantenga siempre balanceado.
En Paralelo podremos especicar que se cree el ndice utilizando
ms de un proceso. Esto puede acelerar la creacin de un ndice en una
tabla con muchos registros.
A cambio, la necesidad de almacenamiento aumenta conside
rablemente (aunque nicamente durante la creacin del ndice).

Es conveniente crear los


ndices una
vez insertadas
grandes cantidades de datos
en una tabla
y no antes, de
forma que no
sea necesario
actualizar tambin el ndice
cada vez.

Con la propiedad En Lnea podremos indicar si durante la


creacin del ndice se aceptan operaciones DML, es decir, si la tabla
est operativa o no durante la creacin del ndice.
Tenga en cuenta que la creacin de un ndice puede ser una tarea
que consuma bastante tiempo, por lo que mantener operativa la tabla
es una ventaja muy importante.
Con la propiedad Calcular Estadsticas podremos hacer que
se recopilen estadsticas de uso del ndice durante su creacin. Estas
estadsticas son las que pueden hacer que Oracle decida utilizar el
ndice o no durante las consultas.
Puede ser interesante cuando se crea un ndice respecto de una
tabla con muchos registros.
La ltima propiedad del ndice, Sin ordenar, es til cuando
sabemos que los valores que se incluyen en el ndice ya estn ordenados
de por s. Entonces no hace falta que se realice este paso durante la
creacin del ndice.
Esto puede suceder con tablas organizadas por ndice, como
despus veremos, o cuando los valores del ndice son generados
mediante una secuencia.
Por ltimo, cabe comentar que es importante tambin en qu
tablespace se crea el ndice. Por defecto, se crea en el mismo que
la tabla a la que hace referencia, como puede comprobar en la cha
General del ndice.
Esto tiene la ventaja de que es ms fcil realizar la copia de
seguridad de una tabla y todas sus estructuras relacionadas, como los
ndices.

ndices

Sin embargo, de cara a conseguir mejores prestaciones en el


acceso a los datos de la tabla, si el ndice se crea en una tablespace
distinto puede ser mejor.
Si los tablespaces se almacenan fsicamente en discos duros
distintos, acceder (en paralelo) al ndice y a la tabla puede aumentar
signicativamente las prestaciones del servidor ante consultas
complejas.
Crear los ndices ms adecuados para nuestra base de datos no es
una tarea ni muchos menos sencilla. Normalmente es necesario realizar
pruebas con datos reales para ello.

4. TABLAS ORGANIZADAS POR NDICES

uando Oracle decide utilizar un ndice para acceder a la


informacin solicitada en una consulta, tiene que encontrar la
entrada apropiada en el ndice y despus utilizar su enlace para obtener
la ubicacin real de los datos en la tabla.
Incluso realizando estos dos pasos (encontrar la entrada en el ndice
y seguir el enlace hasta los datos en la tabla), normalmente el acceso a
la informacin es mucho ms rpido que recorrer toda la tabla.
Oracle permite aprovechar la idea del ndice en la propia
organizacin de las tablas, creando lo que se conoce como una tabla
organizada por ndice.
Una tabla de este tipo almacena los registros de la misma forma
que un ndice B-Tree, pero en el que cada hoja no slo incluye la
columna clave del ndice, sino todas las columnas de la tabla.
El orden en que quedan almacenados los registros de la tabla viene
dado por el campo que es la clave principal de la tabla, por lo que es
obligatorio establecer esta restriccin.
A diferencia de una tabla estndar, en que los registros se
almacenan en el orden en que se crean, una tabla organizada por ndice
almacena sus registros ordenados por su clave principal.
Est claro, por lo tanto, que esto puede venir muy bien en ciertos
tipos de aplicaciones donde es habitual solicitar informacin ordenada
por el campo que es clave principal de la tabla y donde los registros se
crean ordenadamente.
Copyright Computer Aided Education, S.A.

ndices

Por ejemplo, la tabla Ordenes de nuestra base de datos es un claro


ejemplo de esto. Los registros de dicha tabla se crean ascendentemente
segn el campo IdOrden.
Esto quiere decir que no vamos a provocar gran sobrecarga en el
servidor por mantener ordenados fsicamente esos registros si creamos
una tabla organizada por ndice, y, sin embargo, s que podemos obtener
todas las ventajas que implica tener un ndice para acceder a los datos
de la tabla.
Otra ventaja de este tipo de tablas es que no se duplica la
informacin, ya que no es necesario crear un ndice explcitamente
para los valores de su clave principal.
Usted debe indicar el tipo de la tabla en el primer paso del asistente
de creacin de tablas. Obsrvelo en la gura adjunta.

Dependiendo de las caractersticas de la tabla, es conveniente una


cosa u otra. As, en nuestra base de datos tendra bastante sentido haber
elegido la organizacin por ndice para las tablas, ya que los valores de
las claves principales vienen generados por secuencias ascendentes.
Sin embargo, debe tener en cuenta las tres operaciones de
manipulacin de datos, INSERT, UPDATE y DELETE, a la hora de
decidirse por un tipo de tabla u otro.
Usted conoce las ventajas y desventajas de los ndices, pues
aplquelas a las tablas.
10

ndices

Las tablas organizadas por ndice tambin aceptan otros ndices


adicionales, por lo que no slo podemos obtener la ventaja del acceso
segn su clave principal, sino todas las ventajas de los ndices en s.

5. CUNDO SE UTILIZAN LOS NDICES?

a confeccin del conjunto de ndices apropiado no es sencilla


por lo que slo entender lo mejor posible cmo funcionan nos
puede ayudar a realizarla.
Debemos entender que los ndices tienen el objetivo de acelerar el
acceso a los datos, por lo que son de especial utilidad en aquellas tablas
donde lo ms frecuente es la seleccin o extraccin de informacin y
no su modicacin.
Los ndices se utilizan cuando Oracle recibe la solicitud de una
consulta. En ese momento tiene dos opciones: bien recorrer la tabla o
bien utilizar el ndice.
Cuando la tabla tiene muchos registros, es lgico pensar que ser
mucho ms rpido utilizar el ndice, ya que normalmente ser mucho
ms pequeo y, adems, dispondr de cierto orden.
Sin embargo, si la consulta realizada afecta a un porcentaje elevado
de registros de la tabla, no obtendremos ninguna ventaja al utilizar el
ndice, ya que nalmente tendremos que acceder a la mayora de los
datos de la tabla.
Oracle decide qu hacer consultando las estadsticas de uso de
los distintos ndices y en funcin del tamao de la tabla. La mayora
de las veces elegir utilizar el ndice (sobre todo cuando en la consulta
intervienen varias tablas en las que hemos denido ndices para las
claves externas).
Como contrapartida a esta situacin en la que los ndices pueden
ser de gran utilidad, tenemos las operaciones de insercin (INSERT),
modicacin (UPDATE) y eliminacin (DELETE) de registros.
En estos casos no slo se ve afectada la tabla, sino tambin los
ndices. Adems, en el caso de una tabla organizada por ndice esto
puede ser incluso peor, ya que puede implicar modicar la ubicacin
de almacenamiento de los registros para seguir mantenindolos
ordenados.
Copyright Computer Aided Education, S.A.

11

ndices

Esta circunstancia, junto al hecho ineludible de que los ndices


tambin ocupan espacio ya que, al n y al cabo, estn almacenando
informacin que ya disponemos en las tablas, hacen que veamos la
necesidad de analizar con cuidado cada situacin y experimentar hasta
conseguir un buen diseo de ndices.

12

El lenguaje SQL (I)


1. INTRODUCCIN

l lenguaje SQL es un lenguaje estndar para el acceso y


manipulacin de bases de datos relacionales como Oracle.

Esto quiere decir que aprender SQL es algo indispensable para


cualquier programador o administrador de bases de datos, ya que se va
a encontrar constantemente con la necesidad de consultar o modicar
los datos almacenados.
Oracle no es una excepcin, aunque dispone de una versin un
poco personalizada del lenguaje SQL que acepta que en lo fundamental
es compatible con el estndar ANSI.
Por otra parte, el lenguaje SQL no slo nos va a permitir consultar
o modicar los datos, sino que tambin es el lenguaje que podremos
utilizar para crear bases de datos, tablas, etc. si no disponemos de una
herramienta visual como Oracle Enterprise Manager.
Por ello es tan importante conocerlo. Sin embargo, nosotros nos
vamos a centrar en el estudio de SQL para realizar consultas, tanto de
seleccin como de actualizacin.
Adems, con ello tendremos la oportunidad de comprobar que
Oracle utiliza los ndices de las tablas cuando lo necesita.
Realizaremos las consultas en el editor de SQL que nos ofrece
iSQL*Plus. Para ello, pulse en el enlace a dicha herramienta que
aparece al nal de la pgina de Administracin de Enterprise Manager
y acceda como un usuario normal (por ejemplo, el usuario TIENDA,
que creamos expresamente para esta base de datos).
Otra forma de acceder directamente a esta herramienta es con
la URL http://NombreEquipo:5560/isqlplus/ donde aqu 5560 es el
puerto utilizado por iSQL*Plus.
Para que las consultas produzcan resultados, las tablas ya disponen
de algunos datos de ejemplo.
2. LA SENTENCIA SELECT
a sentencia SELECT es la ms importante del lenguaje SQL.
Sirve para crear consultas de seleccin, es decir, consultas en
las que extraemos resultados de la base de datos sin modicarla.

La sentencia SELECT puede ser muy sencilla o llegar a ser


realmente complicada.
Copyright Computer Aided Education, S.A.

El lenguaje SQL (I)

Si durante la
instalacin de
Oracle no se
estableci el
inicio automtico del serviocio ISQL*Plus,
puede iniciarlo
manualmente
con el comando isqlplussvc
-start 5560,
donde se ha
utilizado el
puerto predeterminado
5560.

Si el nombre
del campo
o expresin
que utiliza
en el cdigo
SQL incluye
espacios en
blanco, entonces encirrelo
entre comillas
dobles. En otro
caso, esto no
es necesario,
pero tampoco
es incorrecto.

Su objetivo es seleccionar registros de la base de datos que


cumplan ciertos criterios. Por ejemplo:
SELECT *
FROM Clientes;

Utilizando el asterisco (*) estamos indicando que queremos


recuperar todos los campos de la tabla o tablas que se indiquen en la
clusula FROM. Adems, toda consulta SQL naliza en Oracle con un
punto y coma.
Una vez escrita la consulta, pulse en el botn
iSQL*Plus y obtendr su resultado.

de

La consulta se ejecuta contra la tabla Clientes, proporcionndonos


todos los registros que en ella se almacenan con todos sus detalles. Este
conjunto de datos se muestra en la parte inferior de la pgina.
Normalmente no se desea extraer toda la informacin de la base
de datos, sino slo algunos campos. Para ello, lo que tiene que hacer es
indicar la lista de campos tras la palabra SELECT:
SELECT Idcliente, Nombre, Telefono
FROM Clientes;

Adems, podemos utilizar la clusula WHERE para establecer


los criterios de seleccin.
2

El lenguaje SQL (I)

Por ejemplo, nos gustara obtener slo los clientes de la provincia


de Valencia...
SELECT Idcliente, Nombre, Telefono
FROM Clientes
WHERE Provincia = 'Valencia';

En esta consulta vemos las tres partes fundamentales:


Puede escribir
las sentencias
SQL con la
combinacin
de maysculas
y minsculas
que desee,
aunque en
los ejemplos siempre
aparecern en
maysculas.

En la clusula SELECT se indica el conjunto de campos que


queremos extraer.
En la clusula FROM se indica sobre qu tablas actuar la
consulta.
En la clusula WHERE establecemos los criterios de
seleccin.
Observe cmo se utilizan las comillas simples (') para indicar una
cadena de texto. Adems, en funcin de la intercalacin utilizada, se
distinguir entre maysculas/minsculas o letras acentuadas.
En ocasiones, la informacin que deseamos obtener proviene de
ms de una tabla. Por ejemplo, queremos conocer aquellos clientes que
han comprado alguna vez en nuestra tienda.
Esto no es ni mucho menos descabellado, ya que podramos tener
informacin sobre clientes que todava no han comprado, por ejemplo,
conseguidos durante campaas promocionales.
SELECT Clientes.IdCliente, Clientes.Nombre, Clientes.Email
FROM Clientes, Ordenes
WHERE Clientes.IdCliente = Ordenes.IdCliente;

Esta consulta es muy interesante, por varios detalles:


Primero: si utiliza ms de una tabla en la consulta, es conveniente
indicar el nombre de la tabla en la clusula SELECT, sobre
todo si existen campos que tienen el mismo nombre en ms de
una tabla implicada.
Por ello hemos escrito Clientes.IdCliente para especicar que
queremos la informacin desde la tabla Clientes y no desde la
tabla Ordenes, donde tambin hay un campo con ese nombre.
Copyright Computer Aided Education, S.A.

El lenguaje SQL (I)

Si los nombres de las tablas son complejos o muy largos, lo mejor


es utilizar alias:
SELECT c.IdCliente, c.Nombre, c.Email
FROM Clientes c, Ordenes o
WHERE c.IdCliente = o.IdCliente;
Si utiliza alias,
tiene que hacerlo siempre
en la consulta.
Es decir, no
puede utilizar
el nombre de
la tabla unas
veces y el alias
en otras.

De esta forma estamos indicando que en lugar de escribir Clientes,


utilizaremos el alias que consiste en una nica c. Lo mismo
referente a la tabla Ordenes, que se sustituir por la letra o.
Segundo: todas las tablas implicadas en la consulta aparecen en
la clusula FROM separadas por comas. Aqu podemos denir
los alias utilizados.
Tercero: en la clusula WHERE se construye el criterio de
seleccin. En este caso, elegimos aquellos registros de Clientes
cuyo IdCliente est presente en la tabla Ordenes.
Fjese que las tablas Clientes y Ordenes poseen un campo de
nombre IdCliente con el que se estableci una relacin 1 a
muchos.

Ahora conseguimos aquellos clientes que han realizado algn


pedido. Adems, pueden aparecen en ms de una ocasin porque
realmente han realizado ms de un pedido.

El lenguaje SQL (I)

Podemos solucionar este detalle utilizando la palabra DISTINCT


en la clusula SELECT:
SELECT DISTINCT c.IdCliente, c.Nombre, c.Email
FROM Clientes c, Ordenes o
WHERE c.IdCliente = o.IdCliente;

til.

Ahora slo aparecen una vez, por lo que la consulta es mucho ms

Vamos a complicar un poco la consulta construyendo un


criterio de seleccin ms completo. Obtengamos aquellos clientes
que han realizado pedidos por un valor superior a las 300 unidades
monetarias.
SELECT DISTINCT c.IdCliente, c.Nombre, c.Email
FROM Clientes c, Ordenes o
WHERE ((c.IdCliente = o.IdCliente) AND (o.Total > 300));

Es conveniente encerrar entre parntesis los distintos criterios de


la clusula WHERE.
Utilizando los operadores AND, OR, NOT y otros menos
conocidos, podremos crear criterios complejos de seleccin que nos
permitan obtener resultados interesantes.
Por ejemplo, podramos enviar un bono promocional para comprar
en la tienda a estos clientes por haber superado las 300 unidades
monetarias en sus compras anteriores.

3. SELECCIONES COMPLEJAS

SELECT.

ontinuamos construyendo consultas de seleccin conociendo


otros operadores que podemos utilizar con la sentencia

Copyright Computer Aided Education, S.A.

El lenguaje SQL (I)

Por ejemplo, vamos a consultar aquellos productos cuyo precio de


venta est entre 15 y 50 unidades monetarias.
SELECT IdProducto, Nombre, Precio
FROM Productos
WHERE Precio BETWEEN 15 AND 50
ORDER BY Precio;

En esta consulta utilizamos un operador nuevo: BETWEEN...


AND.
Con este operador podemos seleccionar registros que cumplan
que el valor de uno de sus campos se encuentre entre un valor y otro.
Adicionalmente, vemos la clusula ORDER BY, que permite
indicar cmo se ordenar el resultado. En este caso, indicamos que se
ordene segn el precio de venta del producto.
Si necesita que
el resultado
de la consulta
est ordenado segn un
determinado criterio,
utilice siempre
la clusula
ORDER BY, ya
que, en otro
caso, es Oracle
el que decide
el orden en
que muestra
las filas del
resultado
y usted no
puede conocer,
de antemano,
cul ser.

Este orden puede ser ascendente (por defecto) o descendente si


indicamos la palabra DESC.

Compruebe que el precio est en el intervalo de valores


indicado.
Otro operador interesante es LIKE. Con este operador podemos
buscar cadenas de texto. Por ejemplo, nos interesan los clientes cuyo
nombre empieza por E.
SELECT Nombre
FROM Clientes
WHERE Nombre LIKE 'E%';

Utilizamos el carcter de porcentaje (%) para indicar que despus


de la E puede aparecer cualquier conjunto de caracteres (incluso
ninguno).
6

El lenguaje SQL (I)

Tambin se puede utilizar el carcter _ para especicar un nico


carcter en cierta posicin. Por ejemplo, un criterio como LIKE 'o_a'
devolvera valores como ola, osa, etc.
El operador IS NULL permite seleccionar registros que tengan
campos nulos. A este respecto es muy importante recordar que el valor
NULL es un valor indeterminado, por lo que no se puede comparar
con ningn otro.
Por lo tanto, no debe utilizar el operador de igualdad para comparar
un valor NULL sino el operador IS NULL.
SELECT IdProducto, Nombre, Peso
FROM Productos
WHERE Peso IS NULL

Observe cmo el campo Peso aparece vaco en todos los registros


del resultado de la consulta. sta es la forma de representar el valor
NULL por parte de esta herramienta, pero no signica que el valor
NULL sea equivalente a la cadena vaca.
Con la consulta anterior, buscamos los productos para los que
no disponemos de su peso. Si lo que quisiramos es justamente lo
contrario, podramos utilizar IS NOT NULL.
4. FUNCIONES AGREGADAS

datos.

l lenguaje SQL proporciona una serie de funciones que


podemos utilizar para realizar clculos sobre la base de

Estas funciones se conocen como funciones agregadas, ya que lo


que hacen es realizar alguna operacin en una o ms columnas sobre
un conjunto de las.

Copyright Computer Aided Education, S.A.

El lenguaje SQL (I)

Las funciones agregadas de SQL son:


COUNT: obtiene el nmero de registros o las que devuelve
una consulta.

AVG: obtiene el valor medio de un conjunto de valores.

MAX: obtiene el valor mximo de un conjunto de valores.

MIN: obtiene el valor mnimo de un conjunto de valores.

SUM: obtiene la suma de un conjunto de valores.

Por ejemplo, podr calcular el nmero de las que devuelve una


consulta, el mximo valor en una columna, la suma de determinadas
las, etc.
Vemoslo. Vamos a obtener el nmero de registros de la tabla
Productos:
SELECT COUNT(*) AS "Nmero de Productos"
FROM Productos;

Cuando se utiliza una funcin agregada, es conveniente asociar


un alias para el resultado de dicha funcin. Esto se consigue con la
palabra AS seguida del nombre que desee dar al campo del resultado
de la consulta.
Como en este caso, ese alias tiene espacios en blanco, se incluye
entre comillas dobles.
Se nos indica que
tenemos 21 registros en la
tabla Productos.
Observe que el nombre de la columna es el nombre que hemos
establecido en el cdigo SQL.
Las funciones agregadas son mucho ms tiles cuando se puede
agrupar el resultado obtenido.
Por ejemplo, podramos desear conocer el nmero de veces que se
ha vendido cada producto del catlogo de la tienda.
En este caso, el resultado debe ser un valor calculado a partir de
una funcin agregada, pero agrupndolo por los distintos productos.
Para agrupar resultados, se utiliza la clusula GROUP BY.
8

El lenguaje SQL (I)

SELECT p.Nombre, p.Precio, COUNT(l.IdProducto) AS Ventas


FROM Productos p, LineasOrden l
WHERE p.IdProducto = l.IdProducto
GROUP BY p.Nombre, p.Precio;

Debe agrupar los resultados por cada uno de los campos indicados
en la clusula SELECT, excepto por los correspondientes al uso de las
funciones agregadas.

En el resultado vemos que slo aparecen los productos que han


tenido ventas, ya que la clusula WHERE determina este criterio de
seleccin (que estn en la tabla LineasOrden). Para cada producto,
obtenemos su nombre, precio y el nmero de ventas realizado hasta el
momento.
Tambin podemos aplicar criterios de seleccin a los grupos. Por
ejemplo, si slo le interesan aquellos productos vendidos en ms de
una ocasin, dnde indica este criterio de seleccin?
No puede hacerlo en la clusula WHERE, ya que esta clusula
slo afecta a los registros sin agrupar.
La clusula HAVING acta de la misma forma que WHERE,
pero respecto de los valores ya agrupados.
SELECT p.Nombre, p.Precio, COUNT(l.IdProducto) AS Ventas
FROM Productos p, LineasOrden l
WHERE p.IdProducto = l.IdProducto
GROUP BY p.Nombre, p.Precio
HAVING COUNT(l.IdProducto) > 1;
Copyright Computer Aided Education, S.A.

El lenguaje SQL (I)

5. CONVERSIN ENTRE TIPOS DE DATOS

inalizamos la leccin listando una serie de funciones que podr


utilizar para convertir valores de un tipo de datos a otro.

Oracle realiza conversiones de tipo implcitas siempre que stas


tienen sentido (por ejemplo, puede convertir a DATE una cadena de
texto que representa una fecha vlido) y no se utilicen las funciones
que vamos a estudiar.
Sin embargo, es recomendable utilizar las funciones que
a continuacin encontrar para realizar la conversin de tipo
explcitamente.
De esta forma, el proceso no es slo ms claro para el programador
o persona que lee el cdigo PL/SQL, sino que tambin es ms rpido
y seguro.
Por ejemplo, en el caso de convertir una cadena que representa una
fecha al tipo de datos DATE, nos podramos encontrar con sorpresas,
ya que la misma cadena podra interpretarse como fechas distintas
en funcin de la cultura local de la instancia, base de datos o sesin
particular del usuario.
Las siguientes funciones devuelven siempre el tipo de datos
VARCHAR2.
TO_CHAR(char): convierte desde NCHAR, NVARCHAR2,
CLOB o NCLOB a VARCHAR2.
10

El lenguaje SQL (I)

TO_CHAR(datetime, formato): convierte desde DATE o


TIMESTAMP a VARCHAR2.
TO_CHAR(number): convierte desde NUMBER, BINARY_
FLOAT o BINARY_DOUBLE a VARCHAR2.
Fjese cmo se
ha expresado
una fecha concreta siguiendo el formato
ANSI:
DATE 'aomes-da'.

Por ejemplo, la expresin:


TO_CHAR(DATE '2007-02-12', 'DD-MM-YYYY');

se evaluara como 12 - Febrero - 2007 en espaol.


Las siguientes funciones son equivalentes a las anteriores pero
conviertiendo al tipo de datos NVARCHAR2:
TO_NCHAR(char)
TO_NCHAR(datetime, formato)
TO_NCHAR(number)
La funcin TO_DATE(char, formato, nlsparam) convierte
una cadena de caracteres al tipo de datos DATE.
En este caso, el parmetro formato indica cmo debe interpretarse
la cadena a convertir, de forma que slo pueda haber una
interpretacin. Se utiliza DD para los das, MM para los meses y
YYYYY o RRRR para los aos.
Por ejemplo, la expresin:
TO_DATE('02-12-2007', 'MM-DD-YYYY')

se interpretara como el 12 de febrero de 2007.


La funcin TO_NUMBER(...) permite convertir un valor
de tipo BINARY_FLOAT, BINARY_DOUBLE, CHAR,
VARCHAR2, NCHAR o NVARCHAR2 a NUMBER.
En el caso de los valores de cadena de texto, stas tienen que tener
una representacin numrica vlida.
En general, el prototipo y nombre de las funciones de conversin
indican desde qu tipo de datos se parte y a qu tipo de datos se
convierte.

Copyright Computer Aided Education, S.A.

11

El lenguaje SQL (I)

Le recomendamos que
obtenga la
gua de SQL
y de PL/SQL,
ya que es la
mejor referencia de ambos
lenguajes en
Oracle.

12

Puede obtener mucha ms informacin respecto a este asunto y


a cualquier otra caracterstica del lenguaje PL/SQL en la gua SQL
Reference, disponible para su descarga desde el sitio web de Oracle.

El lenguaje SQL (II)


1. EL OPERADOR INNER JOIN

n la mayora de ocasiones, la informacin que necesitamos no


est almacenada en una nica tabla, sino que es la combinacin
de varias tablas de la base de datos.
Utilizando las clusulas FROM y WHERE de una consulta de
seleccin podemos acceder a la informacin de distintas tablas, como
vemos en esta consulta:
SELECT Clientes.IdCliente, Clientes.Nombre,
Clientes.Email
FROM Clientes, Ordenes
WHERE Clientes.IdCliente = Ordenes.IdCliente;

As, separando mediante comas las tablas en la clusula FROM y


estableciendo el criterio de seleccin adecuado en la clusula WHERE,
hemos escrito una consulta que permite conocer qu clientes han
realizado alguna vez un pedido en la tienda virtual de Internet.
Fjese que esa informacin no est disponible nicamente en la
tabla Clientes, ya que all aparecen todos los clientes, hayan comprado
o no alguna vez.
Debemos combinar dicha informacin con la disponible en la tabla
Ordenes para conseguirlo, ya que en esta tabla es donde podremos
encontrar el identicador de los clientes que realmente nos interesan.
Aunque esta forma de combinar varias tablas es la ms tradicional
y aceptada prcticamente por cualquier sistema gestor de bases de datos
relacional, no es la ms correcta.
El estndar ANSI SQL recomienda una sintaxis distinta en la que
se utiliza el operador INNER JOIN.
Este operador empareja o combina los registros de las distintas
tablas segn la condicin que apliquemos. Esta condicin coincidir
con la que hemos utilizado en la clusula WHERE si realizamos la
combinacin de forma tradicional:
SELECT Clientes.IdCliente, Clientes.Nombre,
Clientes.Email
FROM Clientes INNER JOIN Ordenes
ON Clientes.IdCliente = Ordenes.IdCliente;

Como puede ver no hay gran diferencia entre una sintaxis y la


otra, pero sta es la forma ms correcta.

Copyright Computer Aided Education, S.A.

El lenguaje SQL (II)

El hecho de utilizar el operador INNER JOIN no nos impide seguir


renando el resultado de la consulta con otros criterios de seleccin en
la clusula WHERE:
SELECT Clientes.IdCliente, Clientes.Nombre,
Clientes.Email, Ordenes.FechaOrden
FROM Clientes INNER JOIN Ordenes
ON Clientes.IdCliente = Ordenes.IdCliente
WHERE Ordenes.FechaOrden > '30/09/2006';

De esta forma estamos solicitando slo aquellos clientes que han


realizado rdenes despus del 30 de septiembre de 2006. Fjese cmo
he indicado la fecha.

El problema que podemos tener con esta consulta es la forma en


que hemos especicado una determinada fecha.
En muchos casos, escribimos una fecha literalmente, es decir,
utilizando una cadena de texto para representarla (fjese como aparece
entre comillas simples).
Cul es el problema? Pues que dependiendo del formato de fecha
activo para nuestra sesin, sta se puede interpretar como una u otra
fecha.
En este caso no ha habido ningn problema porque el formato
activo en la sesin actual se corresponde con Espaa, por lo que ha sido
capaz de convertir esta cadena en la fecha 30 de septiembre de 2006.
Sin embargo, si el formato esperado para las fechas fuera el
que se utiliza en USA, esta cadena no habra podido interpretarse
correctamente, ya que no hay ningn mes nmero 30 (en USA se utiliza
el formato mes/da/ao).
Para evitar estas situaciones, es mejor proporcionar las fechas que
escribimos de una forma que sepamos que siempre se interpretarn
correctamente.
Una forma de conseguirlo es utilizando funciones que nos
devuelvan valores de fecha, como la funcin SYSDATE, que devuelve
la fecha actual.
2

El lenguaje SQL (II)

Otra forma es indicar cmo realizar la conversin de la cadena


con la funcin TO_DATE:
Ordenes.FechaOrden > TO_DATE('30/09/2006, 'DD/MM/RRRR');

Utilizando la funcin TO_DATE indicamos que queremos


convertir la cadena '30/09/2006' en el tipo de datos DATE pero teniendo
en cuenta el segundo parmetro, que est indicando el formato con el
que escribimos dicha cadena: primero escribimos el da con dos dgitos
(DD), despus el mes con dos dgitos (MM) y, nalmente, el ao con
cuatro cifras (RRRR), utilizando el separador / entre ellos.
De forma parecida podramos incluir tambin la hora. Para
ello, utilice HH para las horas, MM para los minutos y SS para los
segundos.
Otra forma de indicar un literal de fecha es utilizar el mtodo que
se especica en el estndar ANSI:
Ordenes.FechaOrden > DATE '2006-09-30';

Aqu el formato para especicar una determinada fecha es incluir


la palabra DATE y, entre comillas simples, la fecha utilizando la
plantilla ao-mes-da. Se utilizan cuatro cifras para el ao y dos para
el mes y da.
De la misma forma, el estndar ANSI proporciona un formato
para los valores de tipo TIMESTAMP. Es el siguiente:
TIMESTAMP 'YYYY-MM-DD HH:MM:SS[.fraccin de segundo]'.

Por ejemplo, TIMESTAMP '2007-01-10 10:09:35' representa la


hora 10 con 9 minutos y 35 segundos del da 10 de enero de 2007.
Si se especica un literal de fecha sin su componente de
hora, se utiliza la media noche (00:00:00).
Si se especica un literal de fecha sin su componente de
fecha, se utiliza el primer da del mes en curso.

Finalmente, veamos cmo utilizaramos el operador INNER


JOIN cuando necesitamos acceder a datos que aparecen en ms de dos
tablas.
Copyright Computer Aided Education, S.A.

El lenguaje SQL (II)

Por ejemplo, qu consulta se le ocurre escribir para conocer el


nombre y direccin del cliente que ha realizado la orden nmero 3,
junto con la fecha de envo y los productos comprados en esta orden?
Complicado? No lo es tanto. Lo primero que vemos es que la
informacin se almacena en distintas tablas:
De la tabla Clientes obtendremos el nombre, apellidos y
direccin del cliente.
De la tabla Ordenes necesitaremos la fecha de envo de la
orden.
Y de la tabla LineasOrden deberemos averiguar qu productos
inclua la orden nmero 3.
Ahora viene lo que es un poco ms difcil porque tenemos que ir
combinando la informacin de las tres tablas, para lo que se utilizan las
claves externas de cada una.
SELECT c.Nombre, c.Apellidos, c.Direccion,
o.FechaEnvio, l.IdProducto
FROM Clientes c
INNER JOIN Ordenes o ON c.IdCliente = o.IdCliente
INNER JOIN LineasOrden l ON o.IdOrden = l.IdOrden
WHERE o.IdOrden = 3;

Con el primer operador INNER JOIN nos aseguramos de que el


cliente es el que realiz la orden y con el segundo, que las lneas de la
orden son de la orden determinada en la clusula WHERE.
Vemos que incluimos el operador INNER JOIN cada vez que
necesitamos combinar dos tablas o el resultado de un INNER JOIN
anterior con otra tabla.

El resultado nos indica que se trata de la cliente Mara Oliva


Paz, que la orden se envo el 15 de agosto de 2006 y que inclua los
productos 18, 20 y 21.
Si est acostumbrado a escribir consultas SQL de combinacin de
tablas sin utilizar el operador INNER JOIN, puede seguir hacindolo,
pero es ms correcto utilizar este operador.

El lenguaje SQL (II)

2. EL OPERADOR OUTER JOIN

n el caso de una combinacin INNER JOIN, las tablas que


aparecen a la izquierda y a la derecha de este operador son
tratadas por igual, ya que el objetivo es encontrar coincidencias entre
ellas.
Sin embargo, en ocasiones no necesitamos esto sino que
queremos obtener todos los registros de una de las tablas aunque no
tengan pareja en la otra tabla.
En estos casos, debemos utilizar el operador OUTER JOIN
pero en alguna de sus modalidades: LEFT OUTER JOIN o RIGTH
OUTER JOIN, que indican cul es la tabla de la que queremos todos
los registros.
Con el operador LEFT OUTER JOIN, lo que queremos hacer
es que el resultado incluya todos los registros de la tabla de la parte
izquierda (LEFT), tengan o no registros coincidentes con la tabla de
la derecha.
SELECT c.Nombre, o.IdOrden
FROM Clientes C LEFT OUTER JOIN Ordenes o
ON c.IdCliente = o.IdCliente;

Copyright Computer Aided Education, S.A.

El lenguaje SQL (II)

En el ejemplo anterior, obtendremos todos los clientes aunque no


hayan realizado ninguna orden. Vemos que hay tres clientes que no han
realizado todava ninguna orden, por lo que aparece vaca la columna
IdOrden del resultado de la consulta.
sta es la diferencia entre una operacin INNER JOIN, que limita
el resultado, y una operacin OUTER JOIN, que ampla el resultado
con todos los registros de una de las tablas de la combinacin.

Despus veremos que esta


misma informacin la podemos obtener
mediante una
subconsulta.

La combinacin LEFT OUTER JOIN que hemos escrito nos


vendra ahora muy bien, por ejemplo, para conocer cules son los
clientes que todava no han realizado ninguna orden.
SELECT c.Nombre, o.IdOrden
FROM Clientes C LEFT OUTER JOIN Ordenes o
ON c.IdCliente = o.IdCliente
WHERE o.IdOrden IS NULL;

Si el operador LEFT OUTER JOIN devuelve todos los registros


de la tabla de la parte izquierda, tengan o no registros relacionados en la
tabla de la derecha, RIGHT OUTER JOIN hace justo lo contrario.
SELECT p.Nombre, ct.Descripcion
FROM Productos p RIGHT OUTER JOIN Categorias ct
ON p.IdCategoria = ct.IdCategoria;

Con la nueva consulta vamos a obtener todos los registros de la


tabla Categorias, tengan o no algn producto relacionado en la tabla
Productos.

El lenguaje SQL (II)

Vemos que en la tabla Categorias aparecen dos registros ms que


no se mostraban antes. Se trata de las categoras Ropa y Perfumes de las
que la tienda no tiene ningn producto disponible en estos momentos.
Como hemos utilizado el operador RIGHT OUTER JOIN,
obtenemos todas las categoras (tabla de la derecha), aunque no tengan
registros relacionados en la tabla Productos.
Ahora sera fcil obtener slo las dos categoras de los que no hay
productos disponibles comprobando que p.IdCategoria IS NULL.
Sin lugar a dudas, el operador que ms se utiliza es INNER JOIN,
ya que normalmente buscamos los registros que se emparejan con los
de otra tabla: el cliente que realiza tal orden, la categora de este
producto, los productos de una determinada categora, el detalle
de una orden, etc.
Sin embargo, debemos conocer la existencia de los operadores
OUTER JOIN por si los necesitamos.
Finalmente, puede utilizar el operador
para obtener:

FULL OUTER JOIN

Los registros de la tabla de la izquierda que se emparejan


con los de la derecha.
Los registros de la tabla de la izquierda que no tienen
registros relacionados en la tabla de la derecha. En este
caso, tendrn el valor NULL, como si fuera una operacin
LEFT OUTER JOIN.
Los registros de la tabla de la derecha que no tienen
registros relacionados en la tabla de la izquierda. En este
caso, tendrn el valor NULL, como si fuera una operacin
RIGTH OUTER JOIN.

3. SUBCONSULTAS

as subconsultas son sentencias SELECT que se encuentran


en el interior de otra consulta.

La consulta interior puede devolver un nico valor o una lista de


valores por lo que puede ser utilizada de una forma u otra.

Copyright Computer Aided Education, S.A.

El lenguaje SQL (II)

No olvide
incluir la subconsulta entre
parntesis.

Por ejemplo, cmo escribira una consulta para conocer quin es


el cliente que ha realizado el pedido ms elevado?
Vemos que aqu no slo tendremos que preguntar los detalles del
cliente sino tambin cul es la orden con el importe total ms elevado.
SELECT c.Nombre, c.Apellidos, o.Total
FROM Clientes c INNER JOIN Ordenes o
ON c.IdCliente = o.IdCliente
WHERE o.Total = (SELECT MAX(Total) FROM Ordenes);

Vemos que el criterio de bsqueda que aparece en la clusula


WHERE es, a su vez, otra consulta de seleccin.
As pues, como necesitamos que la orden sea la que tenga el
importe ms elevado, utilizamos una subconsulta para conocer dicho
importe.
En lugar de igualar o utilizar otro operador de comparacin en la
clusula WHERE con el resultado de la subconsulta, podemos utilizar
el operador IN cuando sta devuelve ms de un valor.
El ejemplo que se suele utilizar en estos casos lo hemos visto al
estudiar la operacin OUTER JOIN.
Recuerda que averiguamos qu clientes no haban realizado
ninguna orden todava? Este resultado se puede conseguir tambin con
una subconsulta:
SELECT Nombre, Apellidos
FROM Clientes
WHERE IdCliente NOT IN (SELECT IdCliente FROM Ordenes);

La idea es muy sencilla: seleccionar aquellos clientes cuyo


identicador (IdCliente) no aparece en la tabla Ordenes.
Utilizando el operador IN, indicamos que queremos buscar
aquellos registros cuyo IdCliente est en el resultado de la subconsulta.
Si antecedemos el operador NOT, obtenemos los que no estn, que es
lo que estamos buscando.
En muchas ocasiones existe una forma alternativa de escribir la
subconsulta mediante los operadores JOIN.
8

El lenguaje SQL (II)

Normalmente esta ltima forma es ms eciente, pero seguramente


la sintaxis de la subconsulta deja ms claro lo que estamos solicitando
de la base de datos.
Adems, Oracle optimiza las consultas antes de ejecutarlas, por lo
que puede que las realice internamente de la misma forma.

4. EL OPERADOR EXISTS

l ltimo operador de este tipo que vamos a estudiar en esta


leccin es EXISTS.

Este operador es muy importante porque su uso puede hacer que


las consultas se ejecuten rpidamente.
Como el resultado de utilizar este operador slo puede ser verdadero
(True) o falso (False), en el momento en que se encuentre un registro
que cumpla (o no) la condicin, la consulta naliza y se devuelve el
resultado sin recorrer el resto de la tabla o ndice utilizado.
En el ejemplo que estamos siguiendo para conocer qu clientes
todava no han realizado ningn pedido tambin se podra utilizar
EXISTS en lugar de IN:
SELECT Nombre, Apellidos
FROM Clientes c
WHERE NOT EXISTS (SELECT IdOrden FROM Ordenes o
WHERE o.IdCliente = c.IdCliente);

La ventaja de EXISTS respecto a utilizar operaciones de


combinacin JOIN es que no se necesita recorrer completamente una
de las tablas para incorporar un registro al resultado. En el momento en
que se cumpla (o no) la condicin, es suciente.
En el ejemplo, no tiene por qu recorrerse completamente la tabla
Ordenes para cada cliente, ya que en el momento en que se encuentra
una orden del cliente, ya se sabe que ese cliente ha realizado rdenes.
Los nicos valores que puede devolver el operador EXISTS son
verdadero (True) o falso (False).

Copyright Computer Aided Education, S.A.

El lenguaje SQL (III)


1. EL OPERADOR UNION
En esta leccin continuamos estudiando el lenguaje SQL,
prestando especial atencin a las consultas que permiten modicar la
base de datos.
Pero antes de ello, conoceremos un tipo de consulta que, aunque
no es muy frecuente su uso, puede ser la nica forma de conseguir un
determinado resultado. Se trata de las consultas de unin.
Para ello, utilizaremos una nueva base de datos llamada Libreria,
en la que nos encontramos con tablas para representar los libros y las
revistas de la librera; los temas que tratan estos libros; los proveedores
y las ventas realizadas.

En una consulta de unin se utilizan dos o ms sentencias


SELECT. Cada una de las sentencias SELECT se necesita para
devolver el mismo nmero de campos y en el mismo orden.
Por ejemplo, la informacin almacenada en las tablas Libros y
Revistas es muy parecida, ya que proporciona detalles descriptivos de
estos productos.
SELECT Titulo, Existencias, Precio
FROM Libros
WHERE CodigoEditorial = '0352'
UNION
SELECT Titulo, Existencias, Precio
FROM Revistas
WHERE CodigoEditorial = '0352'
ORDER BY Existencias;
Copyright Computer Aided Education, S.A.

El lenguaje SQL (III)

Las rdenes de SQL indican que la consulta debe ofrecer los


campos Ttulo, Existencias y Precio de aquellos registros de las tablas
Libros y Revistas que tienen en el campo CodigoEditorial el valor
0352.
Fjese que como la informacin de libros y revistas est en tablas
distintas, no podramos obtener esta informacin de otra manera en
una misma consulta.
Utilizamos la clusula ORDER BY para presentar los registros
ordenados en el panel de resultados. sta clusula no puede aparecer
en las consultas individuales, sino al nal de las mismas, ya que afecta
al resultado de todas ellas.

Las consultas de unin no muestran los registros duplicados, al


revs de lo que ocurre con las consultas normales, donde tenemos que
utilizar DISTINCT si no deseamos los registros duplicados.
Si necesita ver todos los registros en una consulta de unin, deber
utilizar el operador UNION ALL en lugar de UNION.
A continuacin se muestran las reglas bsicas para combinar
los conjuntos de resultados de dos consultas con UNION:
El nmero y el orden de las columnas deben ser idnticos en
todas las consultas.
Los tipos de datos deben ser compatibles.

Tambin puede utilizar otros operadores de conjunto, como


INTERSECT, que proporciona las las que aparecen tanto en el
resultado de una como de la otra consulta (sin duplicados); y MINUS,
que proporciona las las del resultado de la primera consulta que no
aparecen en el resultado de la segunda consulta (sin duplicados).

El lenguaje SQL (III)

2. LA SENTENCIA INSERT

sencillas.

diferencia de las consultas de seleccin, las sentencias SQL


que permiten modicar la base de datos son mucho ms

La primera que vamos a estudiar es INSERT, que permite insertar


registros en una tabla.
Para ello, debemos indicar la tabla que se ver afectada, el conjunto
de campos y sus correspondientes valores. Deber incluir todos los
campos en los que no pueda haber un valor nulo.
En el caso de un campo cuyos valores vienen dados por una
secuencia previamente creada, veremos cmo acceder a ellos.
Vamos a escribir una consulta para insertar un nuevo producto
en la tienda virtual. Como se imaginar, la tabla que se ve afectada es
Productos:
INSERT INTO Productos (IdProducto, Nombre, Precio,
Descripcion, Peso, IdCategoria)
VALUES (PRODUCTOS_SEQ.NEXTVAL,'Lmpara de pie', 235.50,
'Robusta lmpara de pie con base de madera y tejido
traslcido de color verde.', 4.380, 3);

En la primera lnea incluimos, entre parntesis, el conjunto de


campos para los que proporcionaremos un valor, mientras que en la
segunda lnea se indican dichos valores.
Por ejemplo, para el campo IdProducto, obtenemos el valor a travs
de la secuencia PRODUCTOS_SEQ con su funcin NEXTVAL.
NEXTVAL representa el siguiente valor de la secuencia que est
libre. Fjese que no nos tenemos que preocupar de ello, ya que es Oracle
el que se encarga de generar el valor adecuado.
Si lo que queremos obtener es el ltimo valor utilizado, podremos
indicarlo mediante el nombre de la secuencia, un punto y la funcin
CURRVAL.
Los campos de texto van encerrados entre comillas simples y los
valores numricos con parte decimal separan dicha parte con un punto,
ya que aqu la coma siempre acta como separador de los valores que
se insertan.

Copyright Computer Aided Education, S.A.

El lenguaje SQL (III)

Fjese que no indicamos el campo ImageURL porque tiene un


valor predeterminado y no disponemos de una imagen del producto.

3. LA SENTENCIA UPDATE

odemos cambiar la informacin almacenada en la base de


datos a travs de la sentencia UPDATE.

UPDATE actualiza el contenido de uno o ms campos y en uno


o ms registros.
Debe tener mucho cuidado con esta sentencia, ya que, si no
limita el conjunto de registros que se ver afectado, puede cambiar el
contenido de toda la tabla.
Por ejemplo, ya que anteriormente hemos insertado el producto
nmero 22 en la tabla Productos, vamos a aprovecharlo para cambiar
alguna de sus propiedades.
En este caso,
podramos
haber utilizado
PRODUCTOS.
CURRVAL en
lugar de indicar el nmero
22.

Ahora ya tenemos una imagen de ese producto, por lo que vamos


a actualizar su campo ImageURL:
UPDATE Productos
SET ImageURL = 'decoracion/lamparapie.jpg'
WHERE IdProducto = 22;

Indicamos la tabla sobre la que actuamos, el conjunto de campos


que se ver afectado y el criterio de seleccin.
Si no se incluye la clusula WHERE, entonces UPDATE
actualiza toda la tabla.

4. LA SENTENCIA DELETE

inalmente, podemos utilizar la sentencia DELETE para


eliminar registros de una o ms tablas.

DELETE es una sentencia muy sencilla, pero tambin muy


peligrosa porque conlleva eliminar informacin de la base de datos.
Por ello, es conveniente utilizar siempre algn criterio de seleccin,
de la misma forma que hemos visto con la sentencia UPDATE.
4

El lenguaje SQL (III)

Vamos a eliminar los clientes que no han realizado ningn


pedido:
DELETE FROM Clientes
WHERE IdCliente NOT IN (SELECT IdCliente FROM Ordenes);

Se indica la tabla o conjunto de tablas a eliminar y el criterio de


seleccin que se aplica para conocer cules son los registros que se
vern afectados.
Tenga en cuenta que, si los registros que se eliminan o actualizan
tienen registros relacionados en otras tablas, entonces se aplicarn las
correspondientes restricciones de integridad referencial.
En nuestro caso, se activ la posibilidad de eliminar en cascada,
pero si no es as, Oracle no permitir modicar o eliminar registros que
tienen registros relacionados en otras tablas.

5. LA TABLA DUAL

racle dispone de una tabla especial que podemos utilizar


siempre que necesitemos obtener un resultado sin necesidad
de extraer datos de ninguna tabla.
Esta tabla es la tabla Dual y se utiliza en la clusula FROM de una
consulta de seleccin.
Por ejemplo, si queremos conocer la fecha actual del servidor,
podemos utilizar la funcin SYSDATE. Sin embargo, si dicha funcin
no aparece en el interior de una expresin ms compleja, deberemos
utilizar la tabla Dual.
SELECT SYSDATE
FROM Dual;

Otro ejemplo:
SELECT 'El usuario ' || USER || 'ha accedido al sistema.' AS LOGIN
FROM Dual;

En este caso se ha utilizado la funcin USER para obtener el


nombre del usuario actual que accede a la base de datos. Tambin se ha
utilizado el operador de concatenacin || para construir la frase.

Copyright Computer Aided Education, S.A.

El lenguaje SQL (III)

Siempre que necesite obtener un determinado resultado, ya sea


al aplicar algn operador, utilizar alguna funcin, etc., puede utilizar
la tabla Dual para completar la clusula FROM de una consulta
SELECT.
Esta tabla dispone nicamente de un registro con un nico campo.
Lo nico que necesita saber es que su contenido no es relevante para el
programador, sino nicamente para el sistema, ya que sirve para que el
resultado de la consulta devuelva nicamente un determinado valor.
En cualquier caso, no deber eliminar nunca dicho registro. Utilice
la tabla Dual nicamente como comodn para consultas de seleccin
de este tipo.

6. NDICES Y CONSULTAS

inalmente, ahora que conocemos tanto la sentencia SELECT


para escribir consultas de seleccin como las propias para las
consultas de actualizacin, comprobemos cmo se utilizan los ndices
denidos en las tablas.
Recuerde que, en general, un ndice acelera el acceso a datos
de una consulta de seleccin, mientras que empeora el rendimiento
durante las operaciones de actualizacin.
Para comprobar todo esto, podemos mostrar el plan de ejecucin
que llevar a cabo Oracle al ejecutar una consulta. Para ello, es necesario
tener este privilegio, por lo que nalizaremos nuestra sesin como
el usuario TIENDA y abriremos otra como administrador o usuario
SYSMAN.
Una vez hecho esto, para mostrar el plan de ejecucin, ejecute el
siguiente comando administrativo en iSQL*Plus: SET AUTOTRACE ON;
Vemoslo, pues, algunos ejemplos:
Seleccin de los detalles de los clientes.
SELECT *
FROM TIENDA.Clientes;

En este caso, el plan de ejecucin nos indica que se ha recorrido


completamente (TABLE ACCESS FULL) la tabla Clientes.
6

El lenguaje SQL (III)

Es decir, que realmente no se ha utilizado ningn ndice porque


en este caso no se ganara nada al tener que acceder a todos los datos
de la tabla Clientes.
Sin embargo, observe lo que ocurre si slo se solicita el campo
Email de la tabla Clientes.

La tabla Clientes tiene un ndice para el campo Email, por lo que


ya no se recorre completamente la tabla, sino que se utiliza dicho ndice
(UN_EMAIL).
Esto quiere decir que no se ha tenido que acceder a la informacin
de la tabla, ya que la consulta ha podido ser satisfecha con el ndice del
campo Email.
Nombre, precio y campo ImageURL de los productos de la
categora nmero 3.
SELECT Nombre, Precio, ImageURL
FROM TIENDA.Productos
WHERE Idcategoria = 3;

Copyright Computer Aided Education, S.A.

El lenguaje SQL (III)

Se ha utilizado el ndice IX_CATEGORIA de la tabla Productos


(INDEX RANGE SCAN) y, a partir de los enlaces existentes en ste, se
accede a la tabla Productos (TABLE ACCESS BY INDEX ROWID).
Finalmente, veamos esta nueva consulta, donde intervienen dos
tablas en una operacin INNER JOIN.
SELECT p.Nombre, p.Precio, ct.Descripcion
FROM TIENDA.Productos p INNER JOIN TIENDA.Categorias ct
ON p.IdCategoria = ct.IdCategoria
WHERE ct.IdCategoria = 2;

Se utiliza tanto el ndice IX_CATEGORIA de la tabla Productos


como el ndice de clave principal de la tabla Categorias para acceder
a la informacin solicitada.
Como puede ver, los ndices se utilizan siempre que se estima
conveniente en las consultas de seleccin, ya que suelen ser la forma
ms rpida de acceder a la informacin.
Como contrapartida, tendremos que las operaciones INSERT,
UPDATE y DELETE tendrn un coste superior si disponemos de
ndices, ya que stos tienen que ser actualizados.

Vistas
1. INTRODUCCIN

emos podido comprobar que, en ocasiones, llega a ser


complicado acceder a la informacin que necesitamos debido
a que sta se encuentra en varias tablas.
Esto es algo natural en una base de datos relacional como
Oracle, ya que creamos un conjunto de tablas y relaciones pensando
principalmente en la eciencia en cuanto a su almacenamiento, esto es,
en que no exista informacin redundante o repetida, que se mantenga
la consistencia de los datos, etc.
Desde el punto de vista del diseador de la base de datos OLTP
esto es correcto y as es como debe actuar. Sin embargo, desde el punto
de vista de un usuario, esto puede representar demasiada complejidad a
la hora de acceder a los datos que utiliza frecuentemente.
Oracle, como otras bases de datos, incorpora un tipo de objeto que
se puede utilizar para simplicar el acceso a los datos o incluso para
mantener la seguridad o condencialidad de los mismos.
Se trata de las vistas, que, en esencia, son sentencias SELECT
almacenadas como objetos individuales en la base de datos y que el
usuario puede utilizar exactamente igual que si fueran tablas.
En esta leccin estudiar cmo crear vistas, pero sobre todo,
encontrar escenarios o situaciones en las que pueden ser de utilidad.

2. UNA VISTA SENCILLA

omo se ha indicado, una vista (view en ingls) no es ms que


una sentencia SELECT que escribimos y almacenamos en la
base de datos. Podemos hacerlo a travs de Oracle Database Control.
Para ello, utilice el enlace Vistas de la cha Administracin. Lo
encontrar en la seccin Esquema - Objetos de Base de Datos.
Como ejemplo sencillo, crearemos una vista que simplemente
recoja algunos campos de la tabla Clientes, ocultando otros para ciertos
usuarios.
Por ejemplo, podramos preparar una vista accesible al personal
encargado del empaquetado y envo de los productos. Estos empleados
no tienen por qu disponer de informacin condencial de los clientes,
como su email o password.
Copyright Computer Aided Education, S.A.

Vistas

Normalmente es cmodo utilizar algn prejo o sujo en el


nombre de las vistas para identicarlas rpidamente. Sin embargo, si
no desea que los usuarios conozcan que estn accediendo a una vista y
no a las tablas subyacentes, elimine cualquier detalle en el nombre de
las vistas.
En el campo Texto de la Consulta deber escribir el cdigo SQL
de la consulta a la que dar acceso la vista.
Con el nombre, esquema y consulta SELECT es suciente para
crear una vista. Sin embargo, tambin disponemos de un campo Alias
y de la opcin de sustituir la vista si existe.
En el campo Alias podremos indicar el nombre con el que
queremos que se muestren las columnas del resultado de la consulta
SELECT. Debe indicar los alias en el orden en que aparecen en la
consulta y separados por comas.
Por ejemplo, si en lugar del campo CodPostal preere que aparezca
un alias como Cdigo postal, podra utilizar esta caracterstica de la
vista.
Esto es mucho ms til cuando la consulta SELECT incluye
columnas calculadas en su resultado, como la utilizacin de funciones
agregadas de SQL o de PL/SQL.
En el caso de que alguna de las columnas que devuelve la vista
sea resultado de una expresin, deber incluir su alias en dicho campo
o en la propia consulta SQL.
Por su parte, la opcin Sustituir la vista si existe es til cuando
queremos modicar la denicin de una vista existente.
2

Vistas

Una vez creada la vista, podremos utilizar el nombre vClientes


como si nos estuviramos reriendo a una tabla. Y de hecho, los
usuarios no tendran que notar ninguna diferencia en ello.
Con esto, habremos conseguido ocultar cierta informacin
condencial, ya que permitiremos el acceso a la vista pero no a la tabla
o tablas en s.
Adems, en este caso tambin nos sirve para ltrar la informacin,
ya que slo aparecern los clientes de la provincia de Ciudad Real.
Vemoslo.

Los usuarios que utilicen esta vista no slo ven nicamente los
detalles de los clientes que nosotros queremos poner a su disposicin,
sino tambin aquellos clientes que cumplen con el ltro establecido.
De esta forma no necesitan tener acceso a la tabla Clientes para
obtener la informacin que realmente necesitan.

3. UNA VISTA MS COMPLEJA

a vista vClientes ha servido para proteger u ocultar informacin


condencial de la tabla Clientes.

Otro escenario donde se utilizan las vistas es justamente para


facilitar el acceso a la informacin de la base de datos.
Un ejemplo lo tenemos cuando necesitamos obtener los detalles
de las rdenes realizadas.
La informacin que puede necesitar, por ejemplo, el departamento
de contabilidad, hace referencia tanto a los detalles del cliente que ha
realizado cada orden, como de los productos (y cantidades compradas)
que se incluyen en la orden.
Es decir, informacin que aparece en las tablas Clientes,
Productos, Ordenes y LineasOrden.
Copyright Computer Aided Education, S.A.

Vistas

Es lgico pensar que debemos facilitar el acceso a esta informacin


sin obligar a escribir una consulta SELECT tan compleja. Podemos
utilizar las vistas para ello.

Los empleados de contabilidad utilizaran la informacin como


si estuviera almacenada en una nica tabla en lugar de escribir esta
compleja sentencia SELECT para conseguirla.
Tal como hemos denido esta consulta, obtendremos la
informacin referente a todas las rdenes de la base de datos. Mejor
limitar la informacin a las rdenes de cada mes para que realmente
sea til para el departamento de contabilidad:
SELECT o.IdOrden, c.Nombre, c.Apellidos, p.Nombre AS
Producto, l.Cantidad, p.Precio, l.Subtotal
FROM Clientes c INNER JOIN Ordenes o
ON c.IdCliente = o.IdCliente INNER JOIN LineasOrden l
ON o.IdOrden = l.IdOrden INNER JOIN Productos p
ON l.IdProducto = p.IdProducto
WHERE (EXTRACT(MONTH FROM o.FechaOrden) = EXTRACT(MONTH
FROM SYSDATE));

As pues, con la expresin de la clusula WHERE de la consulta


SQL de la vista, limitamos el resultado a las rdenes efectuadas durante
el mes en curso.
Con la funcin EXTRACT indicamos qu parte de una fecha
nos interesa obtener. En este caso, con la palabra MONTH estamos
indicando que queremos el mes de la fecha en cuestin, que es el
campo FechaOrden de la tabla Ordenes o la fecha actual del servidor
(SYSDATE).

Vistas

A continuacin se detalla la sintaxis de la funcin EXTRACT,


tal como la podr encontrar en la gua de referencia del
lenguaje SQL de Oracle. Observe qu partes de un valor DATE
o TIMESTAMP puede obtener con esta funcin:

Es importante saber que una vista no puede ser editada una vez
ha sido creada sino que es necesario crearla de nuevo. Oracle Database
Control nos permite editar la vista realizando el proceso anteriormente
mencionado, ya que, al editarla, realmente estar crendola de nuevo
con la opcin Sustituir Vista si Existe.
Veamos cmo podramos utilizar esta vista como si se tratara de
una tabla ms. Para ello, utilizaremos iSQL*Plus.

De esta forma, se facilita mucho la confeccin de consultas para


acceder a la informacin deseada. Algo que agradecern los integrantes
del departamento de contabilidad.

Copyright Computer Aided Education, S.A.

Vistas

4. ACTUALIZACIN DE VISTAS

e forma similar a lo que ocurre cuando denimos ndices, las


vistas son tiles a la hora de realizar consultas de seleccin
en la base de datos, pero no as cuando las operaciones ms frecuentes
son las de insercin, modicacin o eliminacin de registros.
Principalmente porque lo que se guarda en la base de datos es la
denicin o sentencia SELECT de la vista y no los datos en s, que
siempre se extraen de las tablas subyacentes.
Despus veremos que existe una excepcin a esto, que son las
vistas materializadas.
Por lo tanto, si se realizan modicaciones a travs de las vistas, se
est produciendo una sobrecarga en el sistema, ya que primero se tiene
que ejecutar la sentencia SELECT de la vista para conocer la tabla que
debe ser actualizada.
Las vistas denidas sobre una nica tabla base suelen ser
actualizables. Sin embargo, las que acceden a ms de una tabla mediante
alguna operacin JOIN pueden serlo, pero con grandes limitaciones.
Vemoslo con un ejemplo.

En este caso, la nueva consulta inserta un registro en la vista


vOrdenesMes, especicando todos los campos y sus valores.
Fjese que en el resultado se nos indica que la insercin no se ha
realizado porque la vista no es actualizable por las caractersticas que
tiene.
Para que una vista basada en ms de una tabla sea actualizable
deben cumplirse varios requisitos que pasamos a explicar:
6

Vistas

Regla General: cualquier operacin INSERT, UPDATE o


DELETE sobre una vista tiene que afectar a una nica tabla
base.
Regla UPDATE: todas las columnas actualizables de una vista
multitabla tienen que pertenecer a una tabla reservada por clave
(key-preserved table).
Regla DELETE: se pueden eliminar las de una vista multitabla
en el caso de que haya exactamente una tabla reservada por
clave en la operacin JOIN.
Regla INSERT: la operacin de insercin no tiene que hacer
referencia a columnas de tablas no reservadas por clave.
Y qu es una tabla reservada por clave? Es un concepto un poco
complejo que es mejor explicar con el ejemplo que tenemos en la vista
vOrdenesMes.
Esta vista se basa, entre otras, en la tabla Ordenes. Esta tabla
dispone de una clave principal por lo que los valores de dicho campo
(IdOrden) son nicos en la tabla.
Pues bien, la tabla Ordenes es reservada por clave si en el resultado
al que da acceso la vista los valores clave siguen siendo nicos. Es
decir, si en el resultado de la vista vOrdenesMes el identicador de
cada orden puede aparecer slo una vez.
Como esto no ocurre en el caso de la tabla Ordenes (aparecen
rdenes repetidas si incluyen ms de un producto en las mismas), la
vista no puede actualizarse.
En esta explicacin es importante el texto el identicador
de cada orden puede aparecer slo una vez y es que no
tenemos que jarnos en el resultado sino en la denicin de
la vista.
Podra darse el caso de que el resultado no incluyera
identicadores de orden repetidos pero que, en funcin de la
denicin/consulta de la vista, esto s que pudiera ocurrir.

Pero es que incluso cuando slo se accede a una tabla, tambin


tenemos varias limitaciones, que tambin se aplicarn a las vistas
multitabla:

Copyright Computer Aided Education, S.A.

Vistas

Las columnas que semodicarn a travs de la vista deben hacer


referencia directa a los datos subyacentes de las columnas de la
tabla. No se pueden obtener de ninguna otra forma, como con
funciones agregadas (AVG, COUNT, SUM, MIN, MAX, etc.)
o expresiones que utilicen otras columnas.
Las columnas que se modican no pueden verse afectadas por
clusulas GROUP BY, HAVING o DISTINCT.
Se debe facilitar el valor de todas las columnas de la tabla
subyacente que no acepten valores NULL o que no tengan un
valor predeterminado.
Los datos modicados en las columnas de la tabla subyacente se
tienen que ajustar a las condiciones que afectan a esas columnas,
como la capacidad de aceptar valores NULL, las restricciones
Check, las deniciones DEFAULT (valores predeterminados),
etc. Por ejemplo, si se elimina una la, todas las restricciones
de integridad referencial de las tablas relacionadas deben
cumplirse para que pueda llevarse a cabo la eliminacin.
Finalmente, si la vista establece algn ltro, es posible que slo
podamos utilizarla para actualizar la tabla subyacente si los cambios
respetan ese ltro.
Por ejemplo, en el caso de la vista vClientes, establecimos que
slo deberan aparecer los clientes de la provincia de Ciudad Real.
Si se activa la propiedad WITH CHECK OPTION de la vista,
no se podr realizar ninguna operacin INSERT, UPDATE o DELETE
que no respete el ltro establecido, que en nuestro ejemplo, es que el
campo Provincia tenga el valor 'Ciudad Real'.
Hemos vuelto a Oracle Database Control para comprobar dnde
aparece la propiedad WITH CHECK OPTION de una vista.

Aqu podremos establecer la propiedad Con opcin de


comprobacin, que actualmente no est activada.
8

Vistas

Activando esta opcin hara que en la vista vClientes slo se


pudieran insertar aquellos clientes de la provincia de Ciudad Real,
siempre que el resto de restricciones se cumplieran positivamente.

5. VISTAS MATERIALIZADAS

uando se solicita informacin de una vista, Oracle se encarga


de ejecutar la consulta SQL de su denicin y proporcionar
sus resultados transparentemente al usuario.
Si el resultado incluye un gran volumen de datos y la vista se
utiliza frecuentemente, puede ser conveniente que dicho resultado
se almacene como un objeto ms en la base de datos, refrescndolo
peridicamente y no tener que ejecutar la consulta cada vez que se
utilice la vista. Esto es lo que se conoce como vista materializada.
Como se imaginar, el hecho de crear vistas materializadas busca
un objetivo muy claro, que es acelerar el acceso a los datos, ya que se
duplica parte de la informacin de la base de datos.
Para crear este tipo de vistas, acceda a la cha Administracin
de Oracle Database Control y utilice el enlace Vistas materializadas
de la seccin Esquema.
Crear una vista materializada es un proceso similar al de una
vista tradicional, pero con ms opciones, entre las que destacan cmo
y cundo se actualizar o refrescar el resultado al que da acceso la
vista.

Copyright Computer Aided Education, S.A.

Vistas

Entre las propiedades generales de la vista materializada destaca


la posibilidad de crearla a partir de una tabla existente. Es decir,
que la vista tome el papel de dicha tabla, que no queda accesible
directamente.

Al eliminar
una vista materializada que
se crea a partir
de una tabla
existente, esta
tabla "vuelve
a recuperar su
identidad como
tabla".

En este caso, el nombre de las columnas seleccionadas a travs


de la consulta de denicin de la vista tiene que coincidir con el
nombre de las columnas de la tabla a partir de la que se crea. Tambin
deben coincidir el nombre de dicha tabla y la vista, ya que sta la
reemplaza.
Adems, es conveniente incluir el esquema de las tablas base en
la denicin de una vista.
Con la vista anterior obtendremos, siempre que lo necesitemos,
los detalles de aquellos clientes que efectan pedidos con un montante
alto.
En el apartado Refrescar de la denicin de la vista materializada
indicaremos cmo y cundo se actualizar el resultado que se almacena
en la base de datos.

Por defecto, la vista se rellena inmediatamente al crearse y


se actualiza o refresca mediante tres mtodos: FORCE, FAST y
COMPLETE.
Normalmente el mtodo elegido es FORCE, ya que
automticamente Oracle intenta utilizar el mtodo ms conveniente en
cada caso.
10

Vistas

Una vez indicado el cmo, es el momento de indicar el cundo.


Podramos
programar el
refresco para
momentos del
da en el que
no haya mucha actividad
en el servidor.

En la seccin Intervalo de Refrescamiento podremos elegir


entre programar el refresco en intervalos de tiempo, hacerlo tras cada
conrmacin o actualizacin de las tablas base de la vista, o incluso
no hacerlo nunca, con lo que la vista materializada tendr siempre el
mismo contenido que se rellena al crearla.
La opcin predeterminada, y que no he comentado, es la de
refrescar la vista manualmente, es decir, a peticin.
Las vistas materializadas presentan muchas ms opciones o
propiedades, pero principalmente nos interesarn las propias de su
denicin y las correspondientes al refresco de los datos a los que dan
acceso.
Al crear una vista materializada, Oracle crea una tabla interna
donde almacena el resultado de la misma con al menos un ndice y
puede crear tambin una vista ordinaria. Todos estos objetos los
crea en el mismo esquema que la vista materializada y con nombres
relacionados con sta.

Copyright Computer Aided Education, S.A.

11

Procedimientos almacenados (I)


1. ORACLE SQL DEVELOPER

unque Oracle nos proporciona herramientas para consultar y


modicar la informacin de las bases de datos, como Oracle
Database Control, lo ms frecuente es que sirva de servidor de base de
datos para aplicaciones empresariales y que sean stas las que accedan
a la informacin.
Para ello, el programador de aplicaciones puede tomar dos
alternativas: realizar las consultas directamente contra la base de datos,
escribiendo el correspondiente cdigo SQL en su aplicacin; o utilizar
procedimientos almacenados.
Los procedimientos almacenados son una herramienta muy
potente para el programador, ya que se trata de cdigo SQL que se
almacena como parte de la propia base de datos.
Cuando el programador necesita obtener o modicar informacin de
la base de datos, simplemente utiliza un procedimiento almacenado.
Oracle ampla signicativamente las posibilidades de los
procedimientos almacenados, ya que pueden ser programados tambin
con el lenguaje Java.
Esto signica que tenemos toda la potencia de este lenguaje a
nuestra disposicin, aunque tambin podemos utilizar PL/SQL si es
suciente.
Es decisin del programador elegir en qu lenguaje escribe
los procedimientos almacenados. Como regla general, si se trata de
procedimientos para acceder a la base de datos o modicarla, utilizar
PL/SQL porque es ms rpido; sin embargo, si se trata de realizar algn
clculo complejo o proceso sobre un conjunto de resultados, utilizar
Java, ya que proporciona muchas ms posibilidades para estos casos.
A lo largo de las prximas lecciones veremos cmo crear
procedimientos almacenados utilizando PL/SQL y desde el punto
de vista de un programador de aplicaciones, pero para ello nos
decantaremos por utilizar una aplicacin gratuita que proporciona
Oracle: Oracle Sql Developer.
Oracle Sql Developer es una herramienta ms til y cmoda que
la que hemos utilizado hasta ahora, pero tiene el inconveniente de que
slo est (actualmente) disponible en ingls.

Copyright Computer Aided Education, S.A.

Procedimientos almacenados (I)

Despus de
instalar Oracle
Sql Developer,
es una buena
idea crear un
acceso directo
en el escritorio al archivo
sqldeveloper.
exe, ya que no
aparece en el
men de Inicio
de Windows.

Con Oracle Sql Developer podremos realizar todas las tareas de


un diseador, como crear tablas e ndices, establecer relaciones, denir
restricciones, etc.
Adems es de gran utilidad de cara al programador de base de
datos, ya que proporciona herramientas para escribir cdigo PL/SQL
y depurarlo.
Puede descargar gratuitamente esta herramienta desde el sitio
web de Oracle e instalarla posteriormente, ya que es un proceso muy
sencillo en el que deber descomprimir el archivo .zip descargado y
ejecutar el archivo sqldeveloper.exe.

Antes de empezar a escribir procedimientos almacenados en nuestra


base de datos, es necesario establecer la correspondiente conexin con
el servidor, como hemos hecho utilizando Oracle Database Control.
(nueva conexin)
Para ello, pulse en el botn New Connection
y establezca los detalles de la misma, como puede ver en la gura de
la pgina siguiente, donde vemos que:
- La conexin se llama TiendaDetallesADMIN.
- Se utiliza el usuario SYS y su contrasea.
- Se guarda la contrasea para que no sea necesario introducirla
cada vez que se quiera establecer la conexin.
- Se utiliza el role o papel SYSDBA para acceder como
administrador.
- Se accede a la base de datos BD del servidor SERVIDORBD
mediante el puerto 1521.
2

Procedimientos almacenados (I)

De la misma forma, la siguiente gura muestra otra conexin en


la que se utiliza la identidad del usuario TIENDA para acceder de
forma no administrativa.
Utilizaremos dicha conexin para crear los procedimientos
almacenados, ya que al crear un procedimiento almacenado, ste se
ejecuta, por defecto, con la entidad y privilegios del usuario propietario
del esquema donde se crea.
Esto quiere decir que ser mejor crearlo una vez nos hemos
conectado como el usuario TIENDA y en su esquema. Pero para ello,
es necesario otorgar el permiso de crear procedimientos a dicho usuario
(CREATE PROCEDURE), que por defecto, no lo tiene.

Ahora podemos empezar a trabajar con esta base de datos.

Copyright Computer Aided Education, S.A.

Procedimientos almacenados (I)

2. UN PROCEDIMIENTO SIMPLE

rear un procedimiento almacenado es muy sencillo, ya que


lo nico que tenemos que hacer es escribir el cdigo SQL
que se ejecutar cuando una aplicacin lo utilice, en el interior de una
instruccin CREATE PROCEDURE.
Adicionalmente, ya que estamos utilizando el dialecto PL/SQL
propio de este servidor de bases de datos, disponemos de otros conceptos
tradicionales de programacin, como la posibilidad de crear variables
para almacenar resultados, estructuras de control y de repeticin,
parmetros, etc.

Utilice la
convencin
que desee a
la hora de
nombrar los
procedimentos
almacenados, pero sea
consistente y
sgala siempre.
Por ejemplo, nosotros
utilizaremos
el prefijo usp
(user stored
procedure).

Para crear un procedimiento


almacenado desde Sql Developer, haga
clic con el botn derecho del ratn en la
carpeta Procedures (procedimientos)
y elija New Procedure (Nuevo
procedimiento).
Acceder a un nuevo cuadro de
dilogo donde debe indicar el nombre
del procedimiento, en qu esquema se
crear y sus parmetros.
Una vez aceptado dicho cuadro de dilogo, se crea una plantilla
con el cdigo necesario para crear un procedimiento almacenado.
CREATE OR REPLACE
PROCEDURE USPLISTARCLIENTES AS
cliente Clientes%ROWTYPE;
BEGIN
FOR cliente IN (SELECT * FROM Clientes)
LOOP
DBMS_OUTPUT.PUT_LINE(cliente.Nombre || ' ' ||
cliente.Apellidos);
END LOOP;
END USPLISTARCLIENTES;

Tras el comando CREATE PROCEDURE aparece el nombre de


ste y, opcionalmente, parmetros entre parntesis.
Seguidamente, encontramos la palabra AS (tambin es vlida IS)
y el cdigo del procedimiento, que queda delimitado por un bloque
BEGIN - END.
4

Procedimientos almacenados (I)

Nuestro procedimiento almacenado simplemente listar detalles


de los clientes de la base de datos, por lo que no necesita ningn tipo de
parmetro, por lo que tampoco deben escribirse los parntesis.

Debe declarar
cada variable
en una lnea
distinta.

Si utilizamos variables, debemos declararlas previamente. Esto se


hace tras la palabra AS y antes del bloque de cdigo que empieza con
BEGIN. En el cdigo anterior vemos que se ha declarado la variable
cliente.
Finalmente escribimos las instrucciones SQL y dems cdigo
entre las palabras BEGIN y END.
El lenguaje PL/SQL no es sensible a la combinacin de maysculas
y minsculas que utilicemos, excepto en el caso de los literales de
cadena, que van incluidos entre comillas simples y si los identicadores
se crearon, en su momento, entre comillas dobles.
Si los identicadores de tabla, campo y dems no se crearon entre
comillas dobles, Oracle los reconocer en cualquier caso (aunque los
convertir a maysculas).
La parte de este cdigo que va desde CREATE PROCEDURE
hasta la palabra AS se conoce como la especicacin del procedimiento,
donde pueden aparecer parmetros.
El resto del cdigo es el cuerpo del procedimiento: primero
podemos encontrar una seccin de declaracin y despus un bloque
BEGIN - END, donde escribimos el cdigo que se ejecutar al utilizar
el procedimiento almacenado.

Cuando utilizamos un procedimiento o


funcin se dice
que lo hemos
"llamado".

Una vez completado el cdigo del procedimiento, pulse en


el botn Compile
, con lo que se comprueba su sintaxis y otros
posibles errores de programacin. Adems, se almacena en la propia
base de datos para ponerlo a disposicin de las aplicaciones o usuarios
que desean obtener dicha funcionalidad.
Para esto ltimo es necesario enviar un comando SQL al servidor,
como si se tratara de cualquier otro tipo de consulta. Sin embargo,
en lugar de escribir el cdigo de la consulta, escribimos el nombre (y
opcionalmente los parmetros) del procedimiento.
Tambin puede ejecutar el procedimiento a travs del comando
Run (ejecutar) de su men contextual. Acceder a un nuevo cuadro de
dilogo donde puede comprobar el cdigo que llama al procedimiento
y cualquier otro detalle, como sus parmetros.

Copyright Computer Aided Education, S.A.

Procedimientos almacenados (I)

En la gura anterior vemos el resultado de ejecutar este


procedimiento almacenado. En este caso, se ha concatenado el nombre
y apellidos de cada uno de los clientes disponibles en la tabla Clientes.
Para ello se utiliza el operador de concatenacin o ||.
Las aplicaciones podran utilizar el identicador uspListarClientes
en su programacin para obtener este resultado.
Lgicamente cada lenguaje de programacin lo har de una
determinada forma, que tambin depender de la tecnologa
que utilice para acceder a la base de datos: ADO, ADO .NET,
ODBC, JDBC, OLE DB, etc.
Por ejemplo, el siguiente cdigo escrito en Visual Basic .NET
utiliza ADO .NET para ejecutar el procedimiento almacenado

uspListarClientes:

Private Sub Page_Load(...)


Dim ConTienda As New OracleConnection
Dim comando As New OracleCommand
.....
With comando
.Connection = ConTienda
.CommandType = CommandType.StoredProcedure
.CommandText = "uspListarClientes"
End With
Try
ConTienda.Open()
comando.ExecuteNonQuery()
.....
Catch ex As Exception
.....
Finally
ConTienda.Close()
End Try
End Sub

Procedimientos almacenados (I)

3. PARMETROS

os procedimientos almacenados tienen varias ventajas


respecto a las consultas directas contra la base de datos, pero
no seran de mucha utilidad si no pudiramos utilizar parmetros con
ellos.
Los parmetros sirven para particularizar el comportamiento del
procedimiento almacenado. En el ejemplo sencillo que hemos visto
anteriormente, obtenamos todos los clientes almacenados en la base
de datos, pero qu pasa si slo deseamos obtener los de la provincia de
Ciudad Real.
Existen tres tipos de parmetros en un procedimiento
almacenado:
Parmetros de entrada (IN), que sirven para comunicar algn
detalle al procedimiento almacenado para que ste pueda llevar
a cabo su labor.
Parmetros de salida (OUT), que sirven justamente para
lo contrario, para que el procedimiento almacenado pueda
devolver informacin al cdigo que lo ha ejecutado.
Parmetros de entrada/salida (IN OUT), que se pueden
utilizar con ambos propsitos.
Los parmetros se declaran despus del nombre del procedimiento
almacenado y entre parntesis.
create or replace
PROCEDURE USPLISTARCLIENTES (pprovincia VARCHAR2) AS
cliente Clientes%ROWTYPE;
BEGIN
FOR cliente IN (SELECT * FROM Clientes
WHERE Provincia = pprovincia)
LOOP
DBMS_OUTPUT.PUT_LINE(cliente.Nombre || ' ' ||
cliente.Apellidos);
END LOOP;
END USPLISTARCLIENTES;

Vemos que para declarar una parmetro se indica su nombre y, a


continuacin, su tipo de datos, que debe coincidir con alguno de los
tipos de datos de Oracle o uno de los propios de PL/SQL.
En este caso, declaramos el parmetro pprovincia del tipo de
datos VARCHAR2. Slo debe indicar el tipo de datos, no su tamao
o precisin.
Copyright Computer Aided Education, S.A.

Procedimientos almacenados (I)

Si tras el nombre del parmetro aparece inmediatamente el tipo


de datos, se entiende que se trata de un parmetro de entrada (tambin
puede incluir la palabra IN por claridad); si desea declarar un parmetro
de salida, incluya la palabra clave OUT y si tiene que ser de entrada/
salida, escriba IN OUT.
Vemos tambin que hemos utilizado este parmetro para
particularizar la sentencia SELECT a travs de su clusula WHERE.
Por lo tanto, a la hora de ejecutar el procedimiento almacenado,
deberemos indicar a qu provincia nos estamos reriendo; o lo que es
lo mismo, el valor que tomar este parmetro.
El valor de los parmetros puede indicarse de dos formas al llamar
al procedimiento:
- Por posicin: en este caso la posicin de los valores incluidos
entre parntesis tiene que coincidir con la posicin en la que se
han escrito en la denicin del procedimiento.
USPLISTARCLIENTES('Ciudad Real');

- Por nombre: en este caso se indica tanto el nombre del parmetro


como su valor. Ambos quedan enlazados por el operador =>. Si
el procedimiento dispone de muchos parmetros, sta es la forma
ms segura de especicarlos.
USPLISTARCLIENTES(pprovincia => 'Ciudad Real');

Gracias al parmetro, el mismo procedimiento nos sirve para


obtener distintos resultados:
USPLISTARCLIENTES('Barcelona');

Veamos otro ejemplo. Vamos a dar de alta un nuevo producto en


nuestra base de datos utilizando un procedimiento almacenado.
CREATE OR REPLACE
PROCEDURE USPNUEVOPRODUCTO
( pnombre IN VARCHAR2
, pprecio IN NUMBER
, pdescripcion IN CLOB
, pimageurl IN VARCHAR2 DEFAULT 'sinfoto.gif'
, ppeso IN NUMBER
, pcategoria IN NUMBER
, nuevoproducto OUT NUMBER
) AS
8

Procedimientos almacenados (I)

BEGIN
INSERT INTO Productos(IdProducto, Nombre, Precio,
Descripcion, ImageURL, Peso, IdCategoria)
VALUES (PRODUCTOS_SEQ.NEXTVAL, pnombre, pprecio,
pdescripcion, pimageurl, ppeso, pcategoria);
SELECT PRODUCTOS_SEQ.CURRVAL INTO nuevoproducto FROM Dual;
END USPNUEVOPRODUCTO;

En el nuevo procedimiento almacenado podemos encontrar


algunos detalles que todava no hemos comentado:
Fjese que se puede declarar ms de un parmetro, separndolos
mediante comas. Para todos ellos deberemos indicar, al menos,
su nombre y tipo de datos.
Adems, tambin podemos proporcionar un valor predeterminado
para los parmetros. Esto lo puede ver en el caso del parmetro
imageURL, que tiene el valor predeterminado sinfoto.gif.
El procedimiento termina con la palabra END + su nombre.
Este nombre slo tiene carcter de documentacin y para nada
es necesario escribirlo en la lnea END.
Utilizamos estos parmetros en la sentencia INSERT para dar
de alta el nuevo producto. Por ejemplo, utilizamos el siguiente valor
disponible de la secuencia PROUCTOS_SEQ para el identicador del
nuevo producto.
Pero, qu pasa si el cdigo que utiliza el procedimiento necesita
conocer cul es el identicador de ese producto que acaba de crearse?
Para esto utilizamos el parmetro de salida nuevoproducto, donde
guardamos el valor de la propiedad CURRVAL de la secuencia.
Si con la propiedad NEXTVAL de una secuencia obtenemos el
siguiente valor libre, con CURRVAL obtenemos el ltimo que ha sido
utilizado.
En este caso, CURRVAL es el valor que necesitamos conocer
para comunicarlo al cdigo que ha llamado al procedimiento.
Fjese cmo se ha utilizado la sentencia SELECT INTO para
almacenar dicho valor en el parmetro de salida nuevoproducto.
Vemos, por lo tanto, que el parmetro acta exactamente igual que si
se tratara de una variable.
Copyright Computer Aided Education, S.A.

Procedimientos almacenados (I)

Adems, se ha utilizado la tabla Dual, como comodn para


completar la consulta de seleccin.
Y ahora veamos cmo llamaramos o ejecutaramos este
procedimiento.
DECLARE
producto NUMBER(6, 0);
BEGIN
USPNUEVOPRODUCTO(
pnombre => 'Surtido bombones suizos',
pprecio => 43.80,
pdescripcion => 'Surtido de bombones de origen suizo.',
pimageurl => 'bombones/surtidosuizo.jp',
ppeso => 0.300,
pcategoria => 2,
nuevoproducto => producto);
DBMS_OUTPUT.PUT_LINE('El nuevo producto es el nmero '
|| producto || '.');
END;

En el caso
de los procedimientos o
funciones, no
debe escribir
la palabra
DECLARE en
su seccin de
declaracin.

10

En este caso, primero vemos un bloque de declaraciones


(DECLARE), donde declaramos una variable para que nos sirva
como recipiente del valor devuelto por el parmetro de salida del
procedimiento.
Adems, la llamada al procedimiento se ejecuta como una
instruccin ms, en el interior de un bloque BEGIN - END.
Tras la insercin del nuevo producto, obtenemos el valor del
parmetro de salida nuevoproducto. Seguramente nuestra aplicacin
utilizar esta informacin posteriormente.

Procedimientos almacenados (I)

Aqu podemos ver un ejemplo con Visual Basic .NET y ADO


.NET que utiliza este procedimiento almacenado.
Fjese cmo se declaran y se utilizan los distintos parmetros.
Tras la insercin del nuevo producto, se utiliza el valor del
parmetro de salida pNuevoProducto.

Private Sub Page_Load(.....)


Dim ConTienda As New OracleConnection
Dim comando As New OracleCommand
Dim pNombre, pPrecio, pDescripcion, pImageURL, pPeso,
pCategoria, pNuevoProducto As New OracleParameter
.....
With comando
.Connection = ConTienda
.CommandType = CommandType.StoredProcedure
.CommandText = "uspNuevoProducto"
End With
With pNombre
.ParameterName = "pnombre"
.DbType = DbType.String
.Direction = ParameterDirection.Input
.Value = "Surtido bombones suizos"
End With
.....
With pCategoria
.ParameterName = "pcategoria"
.DbType = DbType.Int32
.Direction = ParameterDirection.Input
.Value = 2
End With
With pNuevoProducto
.ParameterName = "nuevoproducto"
.DbType = DbType.Int32
.Direction = ParameterDirection.OutPut
End With
comando.Parameters.Add(pNombre)
comando.Parameters.Add(pPrecio)
comando.Parameters.Add(pDescripcion)
comando.Parameters.Add(pImageURL)
comando.Parameters.Add(pPeso)
comando.Parameters.Add(pCategoria)
comando.Parameters.Add(pNuevoProducto)
Copyright Computer Aided Education, S.A.

11

Procedimientos almacenados (I)

Try
ConTienda.Open()
comando.ExecuteNonQuery()
lblMensaje.Text = "Producto nmero " & pNuevoProducto.Value
& " insertado correctamente."
.....
Catch ex As Exception
.....
Finally
ConTienda.Close()
End Try
End Sub

12

Procedimientos almacenados (II)


1. VARIABLES

l lenguaje PL/SQL incorpora conceptos tradicionales de


programacin que no encontramos en el SQL estndar pero
s en la mayora de los dialectos o implementaciones del SQL que
realizan los fabricantes de bases de datos.
Entre estos conceptos de programacin podemos encontrar la
posibilidad de utilizar variables para almacenar resultados; ejecutar un
cdigo u otro en funcin de alguna condicin mediante estructuras de
decisin o de repeticin; la disponibilidad de funciones que facilitan
determinados clculos o procesos, etc.
El lenguaje PL/SQL no es tan potente como el lenguaje de
programacin Java, pero, para muchos casos, es suciente. En esta
leccin estudiaremos algunos de estos conceptos de programacin.
Y el primero que vamos a ver es la posibilidad de utilizar variables
para almacenar resultados. Para ello, es necesario declararlas.
A continuacin se detalla un nuevo procedimiento almacenado
llamado uspAgregarACarrito.
Este procedimiento se ejecutar cuando el cliente de la tienda
virtual navegue por el catlogo de productos y decida aadir algn
producto a su carrito de la compra. Recuerde que tenemos la tabla
CarritoCompra para almacenar estos detalles hasta que el cliente
decida conrmar su pedido.
CRATE OR REPLACE PROCEDURE USPAGREGARACARRITO
(carrito IN VARCHAR2
, producto IN NUMBER
, cantidadComprada IN NUMBER
, fecha IN DATE
) AS
existeProducto NUMBER(1);
cantidadAnterior NUMBER(4);
BEGIN
SELECT COUNT(IdProducto), Cantidad INTO
existeProducto, cantidadAnterior
FROM CarritoCompra
WHERE IdProducto = producto AND IdCarrito = carrito
GROUP BY Cantidad;
..................
END USPAGREGARACARRITO;

Copyright Computer Aided Education, S.A.

Procedimientos almacenados (II)

Aqu tiene la estructura de la tabla

CarritoCompra:

En este caso, la clave de la tabla es IdRegistro, cuyos


valores se rellenan a partir de una secuencia, pero realmente
nosotros identicaremos el carrito de cada cliente con el
campo IdCarrito, que puede tener dos valores: o bien un
valor aleatorio y generado automticamente si el cliente no se
ha identicado en la tienda virtual o bien el identicador de
dicho cliente si ya se ha identicado previamente a introducir
productos en su carrito de la compra.

El procedimiento recibir los detalles que necesita mediante


parmetros y lo que tiene que hacer es actualizar o crear el registro
apropiado en la tabla CarritoCompra.
Y en funcin de qu har una cosa u otra? Pues bien, si el cliente
ya haba introducido el producto en su carrito, lo que haremos es
actualizar ese registro sumando la nueva cantidad comprada.
Sin embargo, si es la primera vez que elige ese producto, crearemos
un nuevo registro.

Cada variable se tiene


que declarar
en una lnea
distinta. No
debe incluir
la palabra
DECLARE en el
interior de un
procedimiento
o funcin pero
s en un bloque de cdigo
annimo.

Vemos que se declaran dos variables locales del procedimiento:


existeProducto y cantidadAnterior. Se dice que son locales porque
slo se pueden utilizar en el interior de dicho procedimiento.
Vemos que especicamos su nombre y despus su tipo de datos.
El nombre de las variables y otros identicadores no es sensible a las
maysculas/minsculas en PL/SQL.
PL/SQL acepta todos los tipos de datos que disponemos en las
tablas de Oracle ms otros propios, como la posibilidad de declarar
valores booleanos o lgicos con el tipo BOOLEAN.
Por ejemplo, en este caso hemos declarado dos variables enteras
(fjese que no se indica la escala del tipo NUMBER, lo que quiere decir
que es 0). En el primer caso, slo con un dgito y en el segundo con 4
como mximo.

Procedimientos almacenados (II)

Es necesario declarar las variables antes de utilizarlas en el cdigo


del procedimiento, ya que, en caso contrario, se producir un error.
SELECT COUNT(IdProducto), Cantidad INTO
existeProducto, cantidadAnterior
FROM CarritoCompra
WHERE IdProducto = producto AND IdCarrito = carrito
GROUP BY Cantidad;

Ahora lo que estamos viendo es la forma de asignar un valor a una


variable. Es exactamente igual que para los parmetros.
En la variable existeProducto asignamos el valor de la funcin
agregada COUNT(IdProducto) de la tabla CarritoCompra,
lo que quiere decir que obtendremos si el producto en cuestin
ya aparece en el carrito de la compra del cliente.
En la variable cantidadAnterior guardamos la cantidad
anteriormente comprada, que estar disponible en el campo
Cantidad del registro de la tabla CarritoCompra.
Fjese que, como en ambos casos el valor a almacenar en las
variables proviene de una columna del resultado de una sentencia
SELECT, se utiliza SELECT INTO para asignar dicho valor; si se
trata de un valor literal, puede utilizar el operador de asignacin :=
Por ejemplo, cantidadAnterior := 5;
En resumen, tendremos un 0 en la variable existeProducto si el
producto no existe en el carrito del cliente o un 1 en caso contrario;
mientras que en la variable cantidadAnterior tendremos la cantidad
anteriormente comprada de ese producto.
Es importante entender que los parmetros se utilizan exactamente
igual que las variables en el interior del procedimiento.
Esto quiere decir que podramos asignar valores a los parmetros,
por ejemplo, si se trata de parmetros de salida.
2. ESTRUCTURAS DE DECISIN

ntendiendo el objetivo de este procedimiento almacenado,


estamos ahora en la coyuntura de realizar una operacin u
otra en funcin del valor de la variable existeProducto.
Copyright Computer Aided Education, S.A.

Procedimientos almacenados (II)

PL/SQL introduce las estructuras de decisin clsicas para ejecutar


un cdigo u otro en funcin de alguna condicin. La que ms se utiliza
es: IF ... THEN ... ELSE.
CREATE OR REPLACE PROCEDURE USPAGREGARACARRITO
( carrito IN VARCHAR2
, producto IN NUMBER
, cantidadComprada IN NUMBER
, fecha IN DATE
) AS
existeProducto NUMBER(1);
cantidadAnterior NUMBER(4);
BEGIN
SELECT COUNT(IdProducto), Cantidad INTO
existeProducto, cantidadAnterior
FROM CarritoCompra
WHERE IdProducto = producto AND IdCarrito = carrito
GROUP BY Cantidad;
IF (existeProducto = 1) THEN
UPDATE CarritoCompra
SET Cantidad = cantidadAnterior + cantidadComprada,
FechaRegistro = fecha
WHERE IdCarrito = carrito AND IdProducto = producto;
ELSE
INSERT INTO CarritoCompra (IdRegistro, IdCarrito,
IdProducto, Cantidad, FechaRegistro)
VALUES (CARRITO_SEQ.NEXTVAL, carrito, producto,
cantidadComprada, fecha);
END IF;
END USPAGREGARACARRITO;

Es decir que si la variable existeProducto vale 1, quiere decir


que en el carrito de la compra del cliente ya exista ese producto, por
lo que sumamos la cantidad comprada en esta ocasin a la anterior y
actualizamos la fecha del registro.
Sin embargo, si no es as, insertamos un nuevo registro en la tabla
CarritoCompra reejando la eleccin de un nuevo producto por parte
del cliente.
Por lo tanto, si se cumple la condicin, se ejecuta la instruccin
UPDATE y si no, la instruccin INSERT INTO.
Si ejecuta este procedimiento tal como est ahora, comprobar
que funciona perfectamente cuando se tiene que actualizar la cantidad
comprada de un producto existente en el carrito del usuario, pero no as
si se tiene que crear un nuevo registro en la tabla CarritoCompra.
4

Procedimientos almacenados (II)

El problema no est en la estructura de decisin IF - THEN ELSE sino en la sentencia SELECT INTO, donde toman valores las
variables existeProducto y cantidadAnterior.
Como el producto comprado no aparece en el carrito de la compra
del usuario, entonces tenemos que la consulta SELECT... INTO
Cantidad no va a producir ningn resultado sino una excepcin o
error.
La sentencia SELECT ... INTO tiene que proporcionar siempre
una nica la en su resultado. Si no obtiene ninguna, produce un error;
y si obtiene ms de una, tambin.
Podemos solucionar este problema aqu utilizando otra funcin
de agregacin. Por ejemplo, en lugar de solicitar la cantidad comprada
del producto, podramos utilizar la suma de dicha cantidad. En nuestro
caso, debera ser la misma. En este caso, ya no es necesario utilizar la
clusula GROUP BY:
SELECT COUNT(IdProducto), SUM(Cantidad) INTO
existeProducto, cantidadAnterior
FROM CarritoCompra
WHERE IdProducto = producto AND IdCarrito = carrito;
La estructura
sigue:

IF - THEN - ELSE puede ampliarse como


IF ... THEN
ELSIF ... THEN
ELSIF ... THEN
ELSE
END IF;

Donde cada ELSIF se comprueba nicamente si la anterior


clusula IF o ELSIF no ha sido satisfecha. La clusula ELSE slo
se ejecutara si ninguna condicin tiene xito.
En el ejemplo siguiente se utiliza esta estructura para establecer
la categora de los productos:
IF (IdCategoria = 1) THEN
Categoria := 'Flores';
ELSIF (IdCategoria = 2) THEN
Categoria := 'Bombones';
ELSIF (IdCategoria = 3) THEN
Categoria := 'Decoracin';
ELSE Categoria := 'Otros';
END IF;

Copyright Computer Aided Education, S.A.

Procedimientos almacenados (II)

Otra estructura de decisin que puede utilizar es CASE,


que funciona de forma similar que en otros lenguajes de
programacin. Aqu puede ver la sintaxis de esta estructura:
CASE <expresin de comparacin>
WHEN <valor de comparacin 1> THEN <acciones 1>;
WHEN <valor de comparacin 2> THEN <acciones 2>;
....
ELSE <acciones ELSE>;
END CASE;
Compruebe cmo quedara el ejemplo anterior:
CASE IdCategoria
WHEN 1 THEN Categoria := 'Flores';
WHEN 2 THEN Categoria := 'Bombones';
WHEN 3 THEN Categoria := 'Decoracin';
ELSE Categoria := 'Otros';
END CASE;

3. CURSORES Y ESTRUCTURAS DE REPETICIN

tro tipo de estructuras que puede modicar la ejecucin


de un procedimiento almacenado son las estructuras de
repeticin o bucles. Estas estructuras sirven para repetir un conjunto
de instrucciones.
En PL/SQL disponemos de las estructuras LOOP, WHILE LOOP y FOR - LOOP para este propsito.
Veamos cmo utilizar un bucle LOOP con un ejemplo: piense
en qu ocurrir cuando el cliente decida conrmar el pedido con los
productos que ha introducido en su carrito de la compra.
En este caso tenemos que:
1. Crear la correspondiente orden en la tabla Ordenes.
2. Crear las lneas de la orden (una por cada producto) en la tabla
LineasOrden.
3. Actualizar el total de la orden en la tabla Ordenes.
4. Vaciar el carrito de la compra eliminando los registros de la
tabla CarritoCompra.

Procedimientos almacenados (II)

Aqu el paso 2 implica recorrer cada uno de los registros en la


tabla CarritoCompra del carrito del cliente y crear una lnea por cada
uno de ellos en la tabla LineasOrden.
Con lo que sabemos hasta ahora no podramos conseguir este
propsito ya que no sabemos cmo recorrer el resultado de una consulta
de seleccin.
PL/SQL permite hacerlo utilizando el concepto de cursor y un
bucle de repeticin. Estudie el siguiente cdigo donde se utilizan
ambos conceptos. Lo explicaremos detalladamente.

Las lneas que


empiezan con
-- se toman
como comentarios. Si desea
englobar
ms de una
lnea como
comentario,
hgalo con los
delimitdores /*
y */.

CREATE OR REPLACE PROCEDURE USPDETALLEORDEN


(orden IN NUMBER, carrito IN VARCHAR2) AS
producto NUMBER(6, 0);
cantidadComprada NUMBER(4, 0);
precioProducto NUMBER(19, 4);
-- 1 Crear cursor
CURSOR lineas IS
SELECT cc.IdProducto, cc.Cantidad, p.Precio
FROM CarritoCompra cc INNER JOIN Productos p
ON cc.IdProducto = p.IdProducto
WHERE IdCarrito = carrito;
BEGIN
OPEN lineas; -- 2 Abrir cursor
-- 3 Recorrer el cursor
LOOP
FETCH lineas INTO producto, cantidadComprada,
precioProducto;
EXIT WHEN lineas%NOTFOUND OR lineas%NOTFOUND IS NULL;
INSERT INTO LineasOrden (IdOrden, IdProducto,
Cantidad, Subtotal)
VALUES (orden, producto, cantidadComprada,
cantidadComprada * precioProducto);
END LOOP;
CLOSE lineas; -- 4 Cerrar cursor
END USPDETALLEORDEN;

En el cdigo anterior vemos cmo declarar y crear un cursor. Se


trata de un tipo de datos que nos permite almacenar el resultado de una
consulta de seleccin.
CURSOR lineas IS
SELECT cc.IdProducto, cc.Cantidad, p.Precio
FROM CarritoCompra cc INNER JOIN Productos p
ON cc.IdProducto = p.IdProducto
WHERE IdCarrito = carrito;
Copyright Computer Aided Education, S.A.

Procedimientos almacenados (II)

El resultado es la sentencia SELECT que se incluye en la


declaracin del cursor y que aparece tras la palabra clave IS.
En este caso se estn solicitando los campos IdProducto,
Cantidad y Precio de cada uno de los productos del carrito de la
compra del cliente.
Fjese que el tipo de datos es CURSOR y que se utiliza la
palabra clave IS para indicar qu sentencia SELECT le proporciona
el resultado.
Es decir, en el cursor lineas dispondremos de los detalles de los
productos del carrito de la compra indicado por el parmetro carrito
del procedimiento almacenado.
Una vez creado el cursor, lo siguiente es abrirlo, para lo que se
utiliza la instruccin OPEN. Esta instruccin necesita el nombre del
cursor.
OPEN lineas;

Seguidamente, encontramos el cdigo que permite recorrer este


cursor, para lo que se utiliza el bucle LOOP.

Si no se establece correctamente la
condicin de
salida, podra
crearse un
bucle infinito,
que nunca
terminara.

LOOP
FETCH lineas INTO producto, cantidadComprada,
precioProducto;
EXIT WHEN lineas%NOTFOUND OR lineas%NOTFOUND IS NULL;
INSERT INTO LineasOrden (IdOrden, IdProducto,
Cantidad, Subtotal)
VALUES (orden, producto, cantidadComprada,
cantidadComprada * precioProducto);
END LOOP;

Los pasos que se siguen son:


1.- Se utiliza la instruccin FETCH INTO para obtener los valores
de una la del cursor. Estos valores se almacenan en las variables
producto, cantidadComprada y precioProducto, para lo que se
utiliza la palabra clave INTO.
2.- El bucle LOOP debe repetirse hasta o mientras se cumpla
cierta condicin. Dicha condicin queda representada aqu por la
instruccin EXIT WHEN ...

Procedimientos almacenados (II)

Con EXIT salimos inmediatamente del bucle. Para ello, se indica


qu condicin debe cumplirse, que queda representada tras la
palabra WHEN. Es decir que salimos cuando ....
Para generar la condicin de salida necesitamos saber que todo
cursor dispone de cuatro propiedades:
%ISOPEN: tiene valor TRUE cuando el cursor est abierto y
FALSE en caso contrario.
%FOUND: tiene valor TRUE cuando la anterior instruccin
FETCH ha devuelto al menos una la en el resultado. Y tiene
valor FALSE cuando ya no lo ha hecho, es decir, que ya hemos
recorrido todo el conjunto de registros o las al que da acceso
el cursor.
%NOTFOUND: Justamente al contrario de %FOUND.
%ROWCOUNT: devuelve el nmero de registros que ha
proporcionado hasta el momento el cursor (por lo que no tiene
por qu coincidir con el nmero mximo de registros al que da
acceso).
Fjese en la condicin de salida: la expresin lineas%NOTFOUND
es equivalente a lineas%NOTFOUND = TRUE.
Adems, siempre se ejecutar al menos una vez la instruccin
FETCH, ya que la instruccin de salida del bucle aparece despus
de ella.
Lo que no es seguro es que se ejecute el resto de instrucciones que
aparecen tras EXIT si la primera vez se cumple dicha condicin.
En nuestro caso hemos utilizado la condicin de que se saldr
del bucle LOOP cuando %NOTFOUND tenga el valor TRUE o
NULL.
La propiedad %NOTFOUND podra tener el valor NULL si la
primera instruccin FETCH no se ejecutara correctamente, por lo
que es adecuado comprobarlo tambin.
3.- Para cada uno de los registros a los que da acceso el
cursor se ejecuta una instruccin INSERT INTO, creando el
correspondiente registro en la tabla LineasOrden.
Lo nico que tenemos que hacer, para este caso, es indicar
correctamente el valor de los campos para cada uno de los
productos del carrito de la compra.
Copyright Computer Aided Education, S.A.

Procedimientos almacenados (II)

Es muy importante cerrar


y liberar los
recursos del
cursor porque
son recursos
consumidos
en el servidor
de bases de
datos, que es
el que est
atendiendo
todas las consultas de las
aplicaciones
cliente.

Como todo este cdigo se ejecuta en el interior del bucle LOOP,


se repetir una y otra vez, adelantando la posicin del registro actual
del cursor y hasta que se llegue al nal de ste.
Al salir del bucle LOOP cerramos el cursor con CLOSE,
liberando los recursos consumidos por ste.
CLOSE lineas;

Vemos, por lo tanto, que aqu necesitbamos recorrer el resultado


de una consulta de seleccin y realizar algn proceso. Para ello,
utilizamos un nuevo tipo de datos (CURSOR) y el bucle LOOP.
Es importante darse cuenta de que, de esta forma, realizamos el
proceso en el propio servidor de bases de datos, por lo que la aplicacin
cliente no se encarga de ello e incluso, no tiene por qu saber que se
est haciendo.
A continuacin se detalla la sintaxis de los otros dos bucles LOOP
disponibles en PL/SQL. En todos los casos, se puede utilizar la
instruccin EXIT o EXIT WHEN para salir anticipadamente del
bucle:
WHILE condicin
instrucciones
END LOOP;
Fjese que, en este caso, la condicin se evala al principio del
bucle, por lo que puede darse el caso de que las instrucciones
del cuerpo no lleguen a ejecutarse si no se cumple la condicin
la primera vez.
FOR VariableContador IN LmiteInferior..LmiteSuperior LOOP
instrucciones
END LOOP;
En este caso, el bucle se repite un nmero conocido de veces
(desde LmiteInferior hasta LmiteSuperior). En cada iteracin,
la variable contador aumenta en una unidad. Fjese en la
utilizacin de los dos puntos seguidos (..) para separar ambos
lmites.
Es posible hacer que la cuenta sea descendente (que vaya desde
el lmite superior al inferior) incluyendo la palabra REVERSE:
FOR Contador IN
LOOP
instrucciones
END LOOP;

10

REVERSE

LmiteInferior..LmiteSuperior

Procedimientos almacenados (II)

4. CURSORES IMPLCITOS

n el ejemplo que estamos siguiendo vemos que hemos


declarado y creado expresamente un cursor para despus
recorrer las las a las que da acceso a travs de la consulta de su
denicin.
Oracle siempre crea un cursor para cualquier sentencia de
manipulacin de datos, es decir, para las instrucciones SELECT,
INSERT, UPDATE y DELETE.
Y lo hace aunque dichas instrucciones produzcan nicamente una
la en su resultado. Esto es lo que se conoce como un cursor implcito,
que podemos utilizar igualmente en nuestro cdigo.
Es decir, que se trata de un cursor que no es necesario crear
(declarar), abrir, recorrer ni cerrar, ya que Oracle hace todo esto por
nosotros.
Ya hemos visto un ejemplo de ello con anterioridad:
CREATE OR REPLACE PROCEDURE USPLISTARCLIENTES
(pprovincia VARCHAR2) AS
cliente Clientes%ROWTYPE;
BEGIN
FOR cliente IN (SELECT * FROM Clientes
WHERE Provincia = pprovincia)
LOOP
DBMS_OUTPUT.PUT_LINE(cliente.Nombre || ' ' ||
cliente.Apellidos);
END LOOP;
END USPLISTARCLIENTES;

Para crear el cursor implcito se ha utilizado la estructura:


FOR variable IN (consulta SELECT)
LOOP
END LOOP;
Y cmo debemos interpretar esta estructura del cdigo?
Pues es sencillo: con el bucle FOR IN LOOP estamos creando
un cursor implcito con todas las las resultantes de la consulta de
seleccin que aparece entre parntesis.
Como esto se crea en el interior de un bucle LOOP, lo que
realmente conseguimos es recorrer completamente dicho cursor,
abrindolo y cerrndolo automticamente.
Copyright Computer Aided Education, S.A.

11

Procedimientos almacenados (II)

Por eso no vemos que se utilice la instruccin OPEN para abrir


el cursor, FETCH para recorrerlo ni CLOSE para cerrar y liberar los
recursos que consume el cursor.
Adicionalmente, podemos acceder a las propiedades del cursor
implcito utilizando el nombre SQL:
SQL%ISOPEN
SQL%FOUND
SQL%NOTFOUND
SQL%ROWCOUNT
Todas estas propiedades hacen referencia a la ltima instruccin
FETCH realizada respecto de cualquier cursor.

Otra cosa interesante aqu es ver que la variable cliente (que se


utiliza para recorrer el cursor implcito) es de un tipo de datos especial:
%ROWTYPE.
En este caso ni siquiera hubiese hecho falta declarar la variable
cliente, ya que si no lo hacemos, se crea una variable adecuada para
recorrer el cursor implcito.
El tipo de datos %ROWTYPE representa una la o registro cuyas
columnas coinciden con la tabla o cursor que se anteponga. En la
declaracin anterior vemos que la variable cliente tendr la estructura
de columnas de la tabla Clientes, ya que dicho nombre aparece delante
de %ROWTYPE.
Por eso nos ha servido tan bien en las lneas siguientes para
recorrer el cursor implcito y acceder a las columnas de su resultado:
cliente.Nombre o cliente.Apellidos, por ejemplo.
Vemos que simplemente utilizamos el nombre de la variable
(cliente), un punto y la columna a la que queremos acceder (cliente.
Nombre).
Si el tipo de datos %ROWTYPE permite declarar variables
con la estructura exacta de una tabla o que devuelve una consulta,
con %TYPE podremos hacer lo mismo para una determina columna.
Vemoslo en el procedimiento uspDetalleOrden:
PROCEDURE USPDETALLEORDEN
(orden IN NUMBER, carrito IN VARCHAR2) AS
producto CarritoCompra.IdProducto%TYPE;
cantidadComprada CarritoCompra.Cantidad%TYPE;
precioProducto Productos.Precio%TYPE;
12

Procedimientos almacenados (II)

Por ejemplo, aqu vemos que en la seccin de declaracin del


procedimiento se han declarado tres variables cuyo objetivo no es otro
que almacenar la informacin disponible en campos o columnas de
alguna tabla.
As, con la variable producto queremos guardar el identicador
del producto de la lnea de la orden; con cantidadComprada
justamente la cantidad comprada de dicho producto y lo mismo con
precioProducto.
Est claro, por lo tanto, que el tipo de datos de estas variables
debe coincidir con el tipo de datos de las columnas a las que hacen
referencia.
Nosotros inicialmente hemos utilizado los tipos de datos de dichas
columnas explcitamente (NUMBER), pero ahora hemos utilizado el
tipo de datos %TYPE.
Por ejemplo, con la expresin
producto CarritoCompra.IdProducto%TYPE;

estamos indicando que el tipo de datos de la variable producto es el


mismo que el de la columna IdProducto de la tabla CarritoCompra.
La ventaja de utilizar los tipos de datos %ROWTYPE y %TYPE
es que realmente no necesitamos conocer el tipo de datos exacto de un
registro o columna concreta.
Incluso si despus cambian, la declaracin seguir sirviendo
perfectamente, ya que se actualizar el tipo de datos de dichas
variables.

Copyright Computer Aided Education, S.A.

13

Procedimientos almacenados (III)


1. INSERT INTO ... SELECT

n el procedimiento uspDetalleOrden hemos utilizado un


cursor para recorrer el carrito de la compra de un determinado
cliente y plasmarlo en la tabla LineasOrden, entendiendo que el pedido
u orden ha sido efectuado.
No ha sido casualidad estudiar conjuntamente el concepto de
cursor y los bucles de repeticin, ya que recorrer un cursor en el
servidor para realizar alguna tarea es algo que normalmente requiere
de un bucle LOOP.

Sin embargo, justamente para este caso tenemos una alternativa


al cursor, ya que la instruccin INSERT INTO de PL/SQL dispone de
una sintaxis distinta a la que hemos visto hasta ahora.
La sintaxis alternativa de la instruccin INSERT INTO no utiliza
la clusula VALUES, ya que permite insertar ms de un registro a la
vez.
Para ello, en lugar de escribir la clusula VALUES, utilizamos
una consulta de seleccin. El resultado de dicha consulta es lo que se
inserta en la tabla que indicamos en INSERT INTO.
INSERT INTO LineasOrden (IdOrden, IdProducto, Cantidad,
Subtotal)
SELECT orden, cc.IdProducto, cc.Cantidad,
cc.Cantidad * p.Precio
FROM CarritoCompra cc INNER JOIN Productos p
ON cc.IdProducto = p.IdProducto
WHERE cc.IdCarrito = carrito;
Copyright Computer Aided Education, S.A.

Procedimientos almacenados (III)

En el cdigo anterior ocurre lo que hemos comentado. El resultado


de la consulta SELECT ser un conjunto de las, que es el que se
insertar a travs de la sentencia INSERT INTO.
Esta sintaxis INSERT INTO .... SELECT permite insertar ms
de un registro a la vez, exactamente los que devuelva la consulta
SELECT.
Fjese que para el valor del campo IdOrden se est utilizando el
parmetro orden. Lo mismo podemos decir del parmetro carrito, que
se utiliza en la clusula WHERE.
Ahora podramos completar el procedimiento almacenado para
actualizar el campo Total de la orden y eliminar los registros de la tabla
CarritoCompra que ya han pasado a formalizar una orden en rme.
CREATE OR REPLACE
PROCEDURE USPDETALLEORDEN
(orden IN NUMBER, carrito IN VARCHAR2) AS
producto CarritoCompra.IdProducto%TYPE;
cantidadComprada CarritoCompra.Cantidad%TYPE;
precioProducto Productos.Precio%TYPE;
BEGIN
INSERT INTO LineasOrden (IdOrden, IdProducto, Cantidad,
Subtotal)
SELECT orden, cc.IdProducto, cc.Cantidad,
cc.Cantidad * p.Precio
FROM CarritoCompra cc INNER JOIN Productos p
ON cc.IdProducto = p.IdProducto
WHERE cc.IdCarrito = carrito;
-- Actualizar total de la orden
UPDATE Ordenes
SET Total = (SELECT SUM(Subtotal) FROM LineasOrden
WHERE IdOrden = orden)
WHERE IdOrden = orden;
-- Eliminar registros de CarritoCompra
DELETE FROM CarritoCompra
WHERE IdCarrito = carrito;
END USPDETALLEORDEN;

Como puede ver, los procedimientos almacenados pueden llegar


a ser todo lo complejos o completos que necesite, realizando distintas
operaciones en la base de datos.

Procedimientos almacenados (III)

En este caso, a partir del identicador de una orden (que deber


haberse creado con anterioridad) y de un carrito de la compra, creamos
todas las lneas de la orden necesarias, actualizamos el total de la orden
y vaciamos el carrito de la compra.

2. EXCEPCIONES

de datos.

racle utiliza una forma potente y moderna de tratar los


errores que se pueden producir durante el acceso a las bases

Oracle utiliza el concepto de excepcin para detectar y manejar


situaciones o condiciones en las que se puede producir un error.
Es el propio motor de PL/SQL el que se encarga de lanzar o
generar las excepciones, aunque nosotros tambin lo podemos hacer
manualmente en nuestro cdigo.
Sin embargo, lo ms frecuente es escribir cdigo para manejar las
excepciones internas de Oracle. Dicho cdigo se encarga de realizar las
acciones oportunas cuando ocurre la excepcin.
El siguiente procedimiento almacenado crea una orden cuando el
cliente decide conrmar el pedido de los productos que ha introducido
en su carrito de la compra.
CREATE OR REPLACE
PROCEDURE USPNUEVAORDEN
(pcliente IN NUMBER,
pfechaOrden IN DATE,
pfechaEnvio IN DATE DEFAULT NULL,
pidOrden OUT NUMBER) IS
BEGIN
INSERT INTO Ordenes (IdOrden, IdCliente, FechaOrden,
FechaEnvio, Total)
VALUES (ORDENES_SEQ.NEXTVAL, pcliente, pfechaOrden,
pfechaEnvio, 0);
SELECT ORDENES_SEQ.CURRVAL INTO pidOrden FROM Dual;
END;

Vemos que esto se materializa creando un nuevo registro en la


tabla Ordenes a partir de los parmetros que recibe el procedimiento
almacenado.
Copyright Computer Aided Education, S.A.

Procedimientos almacenados (III)

Finalmente, el procedimiento devuelve el identicador de la


nueva orden mediante el parmetro de salida pidOrden. Este valor
lo necesitamos despus, por ejemplo, para crear las correspondientes
lneas de la orden.
Bien, visto esto, podemos entender que al insertar un nuevo
registro en la tabla Ordenes podra producirse un error.
Puede ocurrir, por ejemplo, que el cliente indicado no exista en
la tabla Clientes, que la fecha de la orden sea posterior a la de envo,
etc.
Teniendo en cuenta estos casos, podemos blindar la instruccin
INSERT INTO aadiendo un bloque EXCEPTION, de forma que si
ocurre alguno de estos errores, se pueda manejar adecuadamente.
Los bloques EXCEPTION se escriben en el interior de un bloque
BEGIN - END y sirven para manejar las posibles excepciones o
situaciones de error que se producen en dicho bloque de cdigo.
Por lo tanto, podremos escribir un bloque EXCEPTION en
un procedimiento o funcin, pero tambin en un bloque de cdigo
annimo.
BEGIN
INSERT INTO Ordenes (IdOrden, IdCliente, FechaOrden,
FechaEnvio, Total)
VALUES (ORDENES_SEQ.NEXTVAL, pcliente, pfechaOrden,
pfechaEnvio, 0);
SELECT ORDENES_SEQ.CURRVAL INTO pidOrden FROM Dual;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Se ha producido un error.');
END;

Tras marcar el principio del bloque EXCEPTION, debemos


escribir el cdigo apropiado para manejar o controlar los distintos
tipos de excepciones que pensamos que se pueden dar en el bloque de
cdigo actual.
En el caso de que al ejecutar esas lneas de cdigo se produzca
algn error, el ujo de ejecucin pasar, inmediatamente, a este bloque
EXCEPTION.

Procedimientos almacenados (III)

As, tras la palabra clave WHEN se indica el tipo de excepcin


que queremos controlar y despus, las instrucciones que se ejecutarn
cuando ocurra.
PL/SQL dispone de una serie de nombres predenidos para
algunas de las excepciones ms frecuentes, por lo que indicaramos
dichos nombres tras la palabra WHEN si quisiramos controlar alguna
excepcin de ese tipo.
Por ejemplo, para controlar una excepcin que ocurre cuando
se intenta realizar una divisin por cero, podramos escribir una lnea
como WHEN ZERO_DIVIDE THEN...
Si entre esos nombres predenidos no se encuentra el tipo de
excepcin que queremos manejar, podemos utilizar el nombre genrico
OTHERS o establecer un nombre para ese tipo de excepcin.
Nosotros hemos optado aqu por la solucin ms simple, que es
utilizar OTHERS.
Aqu se enumeran los nombres predenidos para algunos tipos
de excepciones:

ACCESS_INTO_NULL

CASE_NOT_FOUND: ninguna de las opciones de las


clusulas WHEN de una estructura de decisin CASE ha sido
satisfecha y no se escribi la clusula ELSE.

COLLECTION_IS_NULL

CURSOR_ALREADY_OPEN: se ha intentado abrir un

cursor que ya est abierto.

DUP_VAL_ON_INDEX: se ha intentado asignar un valor


existente en una columna con una restriccin nica.

INVALID_CURSOR: intento de realizar una operacin no

INVALID_NUMBER: la conversin de una cadena de


caracteres en un valor numrico ha producido un error
porque la cadena no representa un valor numrico vlido.

LOGIN_DENIED

NO_DATA_FOUND: una instruccin SELECT INTO no ha


producido ninguna la en su resultado.

NOT_LOGGED_ON

PROGRAM_ERROR

permitida con un cursor, tal como cerrar un cursor que no ha


sido previamente abierto.

Copyright Computer Aided Education, S.A.

Procedimientos almacenados (III)

ROWTYPE_MISMATCH

SELF_IS_NULL

STORAGE_ERROR: no hay suciente memoria o la


memoria est corrompida.

SUBSCRIPT_BEYOND_COUNT: intento de acceder a un

SUBSCRIPT_OUTSIDE_LIMIT: intento de acceder a un

SYS_INVALID_ROWID

TIMEOUT_ON_RESOURCE: se ha consumido el tiempo

TOO_MANY_ROWS: una instruccin SELECT INTO ha


devuelto ms de una la en su resultado.

VALUE_ERROR: un error aritmtico o de redondeo.

ZERO_DIVIDE: intento de dividir por cero.

ndice superior del lmite de una coleccin.

ndice fuera del rango de una coleccin.

de espera para realizar una operacin con un recurso.

Es importante entender que en el momento en que se produce la


excepcin, la ejecucin pasa inmediatamente al bloque EXCEPTION,
por lo que no se ejecuta el resto de lneas que aparecen tras la que ha
producido dicha excepcin.
En nuestro ejemplo, si se produce un error durante la instruccin
INSERT, no se ejecutar la asignacin del parmetro de salida pidOrden,
ya que se saltar inmediatamente al bloque EXCEPTION.
Una vez completada la seccin EXCEPTION naliza la ejecucin
del bloque de cdigo en el que est situada. Si no se produce ninguna
excepcin, entonces el bloque EXCEPTION se obvia.
Pero realmente no hemos hecho nada ms que imprimir un mensaje
de texto cuando se produce una excepcin. Gracias a esta forma de
manejar los errores, la seccin EXCEPTION puede hacer mucho ms
por nosotros.
As, dentro de la seccin EXCEPTION podemos utilizar dos
funciones del sistema que nos dan ms informacin acerca del error
que se ha producido:
SQLCODE devuelve el nmero del error.
SQLERRM devuelve el texto completo del mensaje de error.

Procedimientos almacenados (III)

Ambas funciones no tomarn valores signicativos en otro mbito


que no sea la seccin EXCEPTION aunque pueden utilizarse.
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Se ha producido el error ' ||
SQLCODE || ': ' || SQLERRM);

Fjese cmo utilizamos estas funciones para devolver toda esa


informacin. Esto podra ser adecuado para que el cdigo que ha
llamado al procedimiento efecte las acciones que crea oportunas o, al
menos, que informe al usuario que est ejecutando la aplicacin.

Ahora obtenemos ms detalles referentes al error que se ha


producido.
Veamos otro ejemplo ms de cmo manejar una excepcin
concreta en el procedimiento almacenado uspAgregarACarrito.
Recuerda cmo solucionamos la excepcin que se produca
cuando la instruccin SELECT INTO no generaba ninguna la en su
resultado?
Se trataba de la excepcin NO_DATA_FOUND, que vamos a
controlar ahora que conocemos cmo hacerlo.

Copyright Computer Aided Education, S.A.

Procedimientos almacenados (III)

create or replace
PROCEDURE
USPAGREGARACARRITO
( carrito IN VARCHAR2
, producto IN NUMBER
, cantidadComprada IN NUMBER
, fecha IN DATE
) AS
existeProducto NUMBER(1);
cantidadAnterior NUMBER(4);
BEGIN
BEGIN
SELECT COUNT(IdProducto), Cantidad INTO
existeProducto, cantidadAnterior
FROM CarritoCompra
WHERE IdProducto = producto AND IdCarrito = carrito
GROUP BY Cantidad;
EXCEPTION
WHEN NO_DATA_FOUND THEN
cantidadAnterior := 0;
END;
IF (existeProducto = 1) THEN
UPDATE CarritoCompra
SET Cantidad = cantidadAnterior + cantidadComprada,
FechaRegistro = fecha
WHERE IdCarrito = carrito AND
IdProducto = producto;
ELSE
INSERT INTO CarritoCompra (IdRegistro, IdCarrito,
IdProducto, Cantidad, FechaRegistro)
VALUES (CARRITO_SEQ.NEXTVAL, carrito, producto,
cantidadComprada, fecha);
END IF;
END USPAGREGARACARRITO;

Vemos que hemos vuelto a escribir el cdigo que rellena de valor


las variables existeProducto y cantidadAnterior como lo habamos
hecho en un inicio.
Recuerde que lo cambiamos porque cuando la instruccin
SELECT INTO no proporciona ninguna la en su resultado, se produce
la excepcin NO_DATA_FOUND.
Pues no pasa nada, controlamos dicha excepcin en un nuevo
bloque de cdigo que slo incluya la consulta SELECT INTO.
Para ello, englobamos dicha consulta en una nueva estructura
BEGIN - END.

Procedimientos almacenados (III)

Si en el interior del bloque BEGIN - END que incluye nicamente


la consulta SELECT INTO se produce una excepcin de este tipo, ser
controlada por el manejador que acabamos de escribir, estableciendo a
0 la variable cantidadAnterior.
El ujo de ejecucin, tras la excepcin, seguira con las lneas
siguientes del bloque externo de cdigo, completando las tareas del
procedimiento almacenado.
Las excepciones nos permiten manejar los errores directamente
desde el cdigo PL/SQL almacenado en la base de datos.
Esto hace que tengamos la opcin de controlarlo aqu o utilizar el
lenguaje de programacin que empleemos en nuestra aplicacin.
Por ejemplo, en una aplicacinASP .NET en la que utilizamos Visual
Basic .NET, dispondremos de un sistema similar para manejar los
errores que se producen durante el acceso a Oracle.
Aqu puede ver un ejemplo de cmo se utiliza la estructura
TRY / CATCH en Visual Basic .NET:

No nos extendemos ms en este asunto porque normalmente


usted preferir controlar los errores desde su aplicacin, por lo que sta
estar preparada para recibir los errores que produce Oracle y actuar
en consecuencia.

Copyright Computer Aided Education, S.A.

Procedimientos almacenados (III)

Sin embargo, si decide hacerlo directamente en Oracle, ya sabe


que puede utilizar un bloque EXCEPTION con tantas clusulas
WHEN como desee.

3. TRANSACCIONES

lgo parecido al control de errores ocurre con el manejo de


transacciones en PL/SQL, pero primero aclaremos qu es
una transaccin.
Una transaccin es un conjunto de operaciones contra la base de
datos que slo tienen sentido como una unidad; es decir, que sern
correctas en el caso de que todas ellas se hayan efectuado con xito y
sern incorrectas en el momento en que ocurra algn error en cualquiera
de ellas.
El ejemplo ms clsico es la transaccin que representa una
transferencia bancaria. En este caso, ocurren dos operaciones: una
salida de saldo de una cuenta y la correspondiente entrada en la otra
cuenta.
Lgicamente la transferencia slo tiene sentido si ambas
operaciones se efectan con xito, ya que si falla alguna de ellas, la
otra tampoco debera llevarse a cabo.
En muchas ocasiones nos encontramos con la necesidad de
proporcionar esta funcionalidad en nuestras operaciones con la base
de datos Oracle.
Vemoslo en el procedimiento almacenado uspDetalleOrden,
que se encarga de efectuar todas las operaciones para completar la
conrmacin de un pedido:
1. A partir del identicador de una orden, crea las correspondientes
lneas en la tabla LineasOrden.
2. Actualiza el campo Total de la orden.
3. Elimina los registros relacionados de la tabla
CarritoCompra.
Fjese que debemos asegurarnos de que todas estas operaciones
se efectan correctamente y que no ocurra ningn error en alguna de
ellas.
10

Procedimientos almacenados (III)

Si ocurre un error, la base de datos debera volver al estado anterior


que tena antes de ejecutar el procedimiento almacenado.
Las instrucciones PL/SQL para establecer una transaccin son:
COMMIT: conrma la transaccin, indicando que no se ha
producido ningn error.
ROLLBACK: cancela las operaciones incluidas en el marco
de la transaccin porque se ha producido algn error.
SAVEPOINT: guarda el estado de la transaccin en un
determinado momento, lo que permite volver a dicho punto sin
necesidad de cancelar todas las operaciones de la transaccin.
SET TRANSACTION: permite establecer propiedades de la
transaccin, como que sea una transaccin de slo lectura.
Fjese que en nuestro caso no slo necesitamos utilizar estas
instrucciones, sino tambin alguna forma de decidir si se ha producido
un error. Para ello, nos viene muy bien el bloque EXCEPTION.
PL/SQL inicia una transaccin al ejecutar el primer comando
DML, es decir, un comando que modica la informacin de la base de
datos, como INSERT, UPDATE o DELETE.
Por lo tanto nosotros slo tenemos que conrmar la transaccin
con el comando COMMIT o cancelarla con ROLLBACK.
Por su parte, cualquier comando DDL, es decir, de creacin o
modicacin de objetos de una base de datos, como CREATE
TABLE, inicia una transaccin y la conrma automticamente
tras su ejecucin.

CREATE OR REPLACE PROCEDURE USPDETALLEORDEN


(orden IN NUMBER, carrito IN VARCHAR2) AS
producto CarritoCompra.IdProducto%TYPE;
cantidadComprada CarritoCompra.Cantidad%TYPE;
precioProducto Productos.Precio%TYPE;
BEGIN
INSERT INTO LineasOrden (IdOrden, IdProducto,
Cantidad, Subtotal)
SELECT orden, cc.IdProducto, cc.Cantidad,
cc.Cantidad * p.Precio
FROM CarritoCompra cc INNER JOIN Productos p
ON cc.IdProducto = p.IdProducto
WHERE cc.IdCarrito = carrito;

Copyright Computer Aided Education, S.A.

11

Procedimientos almacenados (III)

-- Actualizar total de la orden


UPDATE Ordenes
SET Total = (SELECT SUM(Subtotal) FROM LineasOrden WHERE
IdOrden = orden)
WHERE IdOrden = orden;
-- Eliminar registros de CarritoCompra
DELETE FROM CarritoCompra
WHERE IdCarrito = carrito;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END USPDETALLEORDEN;

Utilice siempre
los comandos
COMMIT y ROLLBACK en un
procedimiento
almacenado,
ya que si el
procedimiento finaliza
porque se ha
producido una
excepcin no
manejada, las
transacciones
iniciadas no se
cancelan.

Es decir, que si no ha ocurrido ningn error en el bloque de cdigo,


conrmamos la transaccin con COMMIT, por lo que los cambios
surtirn efecto en la base de datos.
Sin embargo, si se ha producido alguna excepcin, la cancelamos
con ROLLBACK y, como resultado, tendremos que no se ha efectuado
ninguna de las operaciones que se incluan en la transaccin.
Es una buena costumbre conrmar o cancelar siempre las
transacciones. Sin embargo, hasta ahora no lo habamos hecho
expresamente, por lo que dejbamos que fuera la aplicacin que
estbamos utilizando la que lo hiciera por nosotros.
Por ejemplo, iSQL*Plus no conrma inmediatamente los cambios
en su conguracin inicial, pero lo hace una vez se cierra la conexin.
El control de las transacciones es algo que tambin podemos
efectuar en la aplicacin que accede a la base de datos Oracle, utilizando
la API elegida.
Por lo tanto, es una decisin del programador hacerlo en uno u
otro sitio.
Una buena estrategia podra ser controlar las transacciones que
representen operaciones concretas mediante PL/SQL y manejar varias de
estas operaciones mediante transacciones en la API de programacin.
Por ejemplo, imagine que est escribiendo una aplicacin para
importar un conjunto de rdenes realizadas con anterioridad.

12

Procedimientos almacenados (III)

Utilizando la transaccin en este procedimiento almacenado podra


asegurar la correccin de cada una de las rdenes en particular, pero si
lo que desea es asegurar el conjunto de todas ellas, debera hacerlo en
una transaccin utilizando la API de su aplicacin e incluyendo todas
las llamadas a este procedimiento almacenado en ella.
Si alguna de las llamadas al procedimiento almacenado nalizara
con error, entonces todas las transacciones PL/SQL se cancelaran
automticamente al cancelarse la exterior de la aplicacin. Esto se
conoce como anidamiento de transacciones.
Aqu puede ver un ejemplo de cmo utilizar transacciones en
Visual Basic .NET utilizando la API ADO .NET:

4. UTILIDAD DE LOS PROCEDIMIENTOS ALMACENADOS

hora que conoce mejor qu son y cmo puede utilizar los


procedimientos almacenados, es importante que tenga en
cuenta otros detalles sobre ellos.

Copyright Computer Aided Education, S.A.

13

Procedimientos almacenados (III)

Existe un amplio debate en cuanto a la conveniencia de utilizar


procedimientos almacenados o consultas directas en el lenguaje
SQL. Es fcil encontrar artculos, foros, etc. referentes a este tema en
Internet, aunque la mayora de ellos recomiendan la utilizacin de los
procedimientos almacenados.
Los procedimientos almacenados presentan varias ventajas:
Al crear el procedimiento almacenado, Oracle se encarga de
preparar el plan de ejecucin estimado, por lo que su ejecucin
puede ser mucho ms rpida que la ejecucin de una consulta
directa SQL, ya que cada vez que utilizamos una consulta de
este tipo se tiene que preparar el plan de ejecucin de forma
explcita.
Los procedimientos almacenados representan una forma de
encapsular u organizar el cdigo de una aplicacin. Esto tiene
muchas ventajas de mantenimiento.
Por ejemplo, si cambia la estructura de una tabla, seguramente
tendr que cambiar tambin las consultas SQL que haya escrito en
su aplicacin; sin embargo, si utiliza procedimientos almacenados,
slo ser necesario cambiar el procedimiento o procedimientos
que se vean afectados sin necesidad de cambiar ni una sola lnea
de cdigo en las aplicaciones que los utilizan.
Los procedimientos almacenados pueden ser utilizados por
muchas aplicaciones a la vez: se escribe una vez y se utiliza
muchas.
Los procedimientos almacenados ayudan a la hora de mantener
la seguridad en la aplicacin. En lugar de otorgar el permiso de
acceder y modicar las tablas, podemos conceder nicamente
el permiso de utilizar los procedimientos almacenados.
Los procedimientos almacenados permiten centralizar y
unicar el acceso a la base de datos. Si todos los programadores
de una aplicacin utilizan los procedimientos almacenados,
entonces todos estn accediendo y modicando la base de datos
exactamente de la misma forma.
Por otra parte, utilizar procedimientos almacenados puede
repercutir negativamente en cuanto a la independencia de la base de
datos.

14

Procedimientos almacenados (III)

Si parte de la lgica de la aplicacin se almacena en la base de datos


en forma de procedimientos, est claro que debern crearse tambin
en cada uno de los tipos de bases de datos con los que queremos que
nuestra aplicacin sea compatible.
Si su aplicacin se va a
ejecutar exclusivamente con
una determinada base de
datos, no lo
dude y utilice
procedimientos
almacenados.

Sin embargo, si esta lgica est incluida en nuestra aplicacin


(por ejemplo, en una capa de acceso a datos), sta ser independiente
de la base de datos utilizada.
En la prctica es muy difcil asegurar una independencia perfecta
en cuanto a la base de datos, por lo que este criterio pierde fuerza.

Copyright Computer Aided Education, S.A.

15

Funciones y paquetes
1. INTRODUCCIN

on los procedimientos almacenados podemos implementar


la forma en que las aplicaciones interactan con la base de
datos, otorgando el permiso de ejecutar los procedimientos pero no de
acceder directamente a las tablas.
Esta forma de trasladar parte de las aplicaciones de bases de datos
a la propia base de datos puede ser beneciosa en muchas ocasiones.
Algo parecido ocurre con las funciones denidas por el usuario,
que estudiaremos en esta leccin.
Como ocurre con los procedimientos almacenados, son bloques
de cdigo que se escriben en el lenguaje PL/SQL o en Java y que se
almacenan como tal en la propia base de datos.
La diferencia fundamental entre las funciones y los procedimientos
almacenados radica en que las funciones devuelven un valor al
cdigo que las ha llamado, as como en la forma en que pueden ser
utilizadas.
Para utilizar un procedimiento almacenado, es necesario ejecutarlo,
lo que implica una instruccin para ello; sin embargo, podremos utilizar
las funciones formando parte de otras expresiones.
Las funciones que nosotros escribimos se comportan exactamente
igual que las funciones integradas en PL/SQL, como TO_DATE,
TO_NUMBER, SYSDATE, NEXTVAL, CURRVAL, las
correspondientes a la informacin de errores, etc.
Utilice el documento Oracle Sql Reference (disponible en la web
de Oracle) para conocer qu funciones PL/SQL tiene disponibles. Hay
funciones tiles para muchas tareas cotidianas: funciones de fecha y
hora, funciones matemticas, de cadena, etc.

2. CREAR FUNCIONES

oda funcin tiene como principal caracterstica que devuelve


un nico valor, que es el resultado de su computacin.

Entre las funciones, podemos encontrar las escalares, que son


aquellas que se caracterizan por devolver un valor escalar, como
NUMBER, VARCHAR2, DATE, etc.
Copyright Computer Aided Education, S.A.

Funciones y paquetes

PL/SQL tambin permite crear funciones con valor de tabla, es


decir, cuyo resultado es una tabla, pero stas se utilizan principalmente
en aplicaciones OLAP, por lo que nos las estudiaremos.
Vamos a crear una funcin que nos indique si una determinada
orden ha caducado. Recuerde que las rdenes tienen una fecha en la
que se crean y una fecha de envo.
Para crear una funcin de este tipo, haga clic con el botn derecho
del ratn en la carpeta Functions (funciones) y elija New Function
(nueva funcin).

Fjese que el cuadro de dilogo donde indicamos las caractersticas


de la funcin es similar al que encontramos al crear un procedimiento
almacenado pero destaca una diferencia: debemos indicar el tipo de
datos del valor que devolver la funcin.
En este caso, <Return> representa el valor devuelto por la
funcin.
Nosotros utilizaremos el prejo fdu (funcin denida por el
usuario) para las funciones, aunque esto no es obligatorio.

Funciones y paquetes

Si la funcin
no dispone de
otros parmetros aparte del
valor devuelto, no utilice
parntesis al
definirla ni al
utilizarla.

Adicionalmente, la funcin puede tener ms parmetros, tanto


de entrada (IN), salida (OUT) como entrada/salida (IN OUT), aunque
normalmente slo utilizar parmetros de entrada porque el valor
que devuelve la funcin viene asociado al nombre de la misma, sin
necesidad de ningn parmetro de salida adicional.
Podemos diferenciar dos partes bien denidas en una funcin: la
especicacin o cabecera de la funcin y su cuerpo.
En la cabecera indicaremos el nombre de la funcin y, opcionalmente
y entre parntesis, los parmetros de entrada que utilice.
En esta parte de la funcin aparece la palabra clave RETURN, tras
la que se especica el tipo de datos del valor devuelto por la funcin.
Tras la palabra AS empieza el cuerpo, propiamente dicho, de la
funcin, que aparece entre las palabras BEGIN y END.
Si necesitamos declarar variables, podremos hacerlo entre la palabra
AS y BEGIN, sin necesidad de utilizar una seccin DECLARE.
CREATE OR REPLACE FUNCTION FDUORDENCADUCADA
( pFechaOrden IN DATE
) RETURN NUMBER AS
BEGIN
IF (SYSDATE - pFechaOrden) > 15 THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END FDUORDENCADUCADA;

Suponga que hemos decidido que aquellas rdenes que no se han


enviado durante los quince das siguientes a su creacin son rdenes
caducadas, que deberan eliminarse de la base de datos.
Para conocer si una orden ha caducado, es necesario que la
funcin sepa la fecha de la orden en cuestin, para lo que utilizamos el
parmetro de entrada.
Es decir, que la funcin devolver un 0 para indicar que la funcin
no ha caducado y el valor 1 cuando s que ha caducado.
En este caso, para nosotros una orden ha caducado cuando
han pasado 15 das desde su creacin sin que haya sido enviada
apropiadamente.
Copyright Computer Aided Education, S.A.

Funciones y paquetes

Fjese cmo se utiliza la palabra clave RETURN para devolver el


resultado de la funcin.
En toda funcin debe aparecer al menos una vez la palabra
RETURN en su cuerpo, aunque podra haber ms de una, como en
este caso.
En el momento en que se encuentra dicha palabra, la ejecucin
de la funcin naliza, devolviendo el resultado al que se evala la
expresin que sigue a RETURN.
En nuestro ejemplo, dicha expresin ha sido muy sencilla, pero
podra ser todo lo complicado que necesitramos. Tras la ejecucin de
la funcin, su nombre acta como una variable ms en el cdigo que la
ha llamado, tomando el valor que ha devuelto.
Esto respecto a la funcin. Sin embargo, quiero que se je ahora
un poco en el cdigo del cuerpo de la funcin.
Observe que hemos podido comparar directamente la fecha de la
orden (pasada como parmetro a la funcin) y el valor devuelto por
SYSDATE.
Como ambos valores son de tipo DATE, esto se puede hacer
sin ningn problema, obteniendo la diferencia en das entre ambas
fechas.
Todo valor DATE (datetime) tiene tanto un componente de fecha
como de hora. Este ltimo se asume las 00:00:00 horas si no se indica
lo contrario.
Al sumar o restar de un valor de tipo DATE, estaremos aadiendo
o restando das. Por ejemplo, SYSDATE + 1 representa
maana, mientras que SYSDATE - 1 es ayer.
Tambin puede utilizar valores no enteros, representado partes
de un da: SYSDATE + 0.5 representa 12 horas despus de
la fecha y hora actual.

Si usted sabe con certeza que los valores que est comparando
tienen el componente predeterminado de la hora (00:00:00), entonces
podr compararlos pensando exclusivamente en la diferencia en das;
si no, puede encontrar sorpresas.

Funciones y paquetes

En nuestro ejemplo podemos suponer que la fecha de la orden


nos vendr dado con la hora de medianoche, pero no podemos decir lo
mismo del valor resultante de la funcin SYSDATE.
Tenemos algunas formas de asegurarnos de ello utilizando
funciones como:
- EXTRACT: para obtener un determinado componente del valor
datetime. Por ejemplo, obtener el da.
- TRUNC: proporciona nicamente el componente de fecha de
un valor datetime.
IF (TRUNC(SYSDATE) - TRUNC(pFechaOrden)) > 15 THEN
RETURN 1;
ELSE
RETURN 0;
END IF;

Observe cmo hemos utilizado TRUNC para forzar a que la


comparacin entre ambos valores DATE se efecta teniendo en cuenta
nicamente el componente de las fechas.
La mayora de los conceptos de lenguaje que hemos estudiado para
los procedimientos almacenados se aplican tambin en las funciones.
Por ejemplo, podramos escribir una seccin EXCEPTION en el
cuerpo de las funciones para manejar las excepciones.

3. UTILIZAR FUNCIONES

na vez sabemos cmo crear funciones, veamos cmo


podramos utilizarlas.

Como se ha indicado, las funciones denidas por el usuario pueden


aparecer formando parte de otras expresiones:
SELECT fduOrdenCaducada(FechaOrden)
FROM Ordenes
WHERE IdOrden = 1;

Aqu lo vemos. Fjese que el nombre de la funcin


fduOrdenCaducada aparece en el interior o en lnea de la sentencia
SELECT de una consulta de seleccin.

Copyright Computer Aided Education, S.A.

Funciones y paquetes

El resultado ser un 1 o un 0 en funcin de si la orden ha caducado


o no, respectivamente.
Podramos utilizar esta funcin en una consulta ms compleja.
Por ejemplo, vamos a listar todas las rdenes caducadas pero que no
han sido enviadas todava. Estas rdenes son las que seguramente
querremos eliminar de la base de datos:
SELECT IdOrden
FROM Ordenes
WHERE fduOrdenCaducada(FechaOrden) = 1
AND FechaEnvio IS NULL;

Los procedimientos almacenados no pueden devolver valores,


pero s que podr utilizar la instruccin RETURN para nalizar
anticipadamente su ejecucin.
Normalmente se utilizan procedimientos almacenados para
realizar procesos y funciones para clculos.

4. PAQUETES

racle permite utilizar el concepto de paquete (package)


para agrupar objetos de programacin relacionados, como
variables, cursores, procedimientos y funciones.
Agrupando todas estas unidades de cdigo en un paquete, se
obtienen muchas ventajas, pero sobre todo destaca la posibilidad de
dividir lgicamente la programacin que se almacena en el servidor de
base de datos.
Un paquete se divide en dos partes: su especicacin y su
cuerpo:
- En la especicacin encontraremos nicamente la declaracin
de variables, cursores, procedimientos y funciones que el paquete
hace disponibles. Es la parte pblica del paquete.
- En el cuerpo encontraremos los detalles concretos de
implementacin de los cursores, procedimientos y funciones,
adems de otras unidades de cdigo que slo se utilizan all y,
por lo tanto, que no son accesibles fuera del paquete. Es la parte
privada del paquete.
6

Funciones y paquetes

La ventaja de esta divisin es que los programas que necesiten


la funcionalidad que aporta el paquete slo necesitan conocer su
especicacin para utilizarla.
La implementacin queda oculta y puede modicarse sin necesidad
de que las aplicaciones que utilizan el paquete tengan que hacerlo.
Para crear una especicacin de paquete, haga clic con el botn
derecho del ratn en la carpeta Packages (paquetes) y elija New
Package (nuevo paquete).

Cuando se solicita cualquier componente de un paquete, el cdigo


de todas las unidades incluidas en l es cargado en memoria de forma
que la primera vez puede que cueste ms en hacerlo, pero llamadas
posteriores son ms rpidas al ya estar disponible en memoria.
Esto viene a colacin porque es importante que el cdigo que se
agrupa en un paquete tenga relacin. Es decir, que la agrupacin haga
referencia a variables, tipos, cursores y subprogramas que se utilicen
normalmente al mismo tiempo.
El diseo del paquete debe tener en cuenta este detalle y no
agrupar unidades de cdigo que no estn relacionadas simplemente
por tenerlas localizadas en un paquete.
Por lo tanto, el nombre del paquete debe hacer referencia a la
naturaleza de la funcionalidad que ofrece.
Al aceptar el cuadro de dilogo anterior, habremos creado
la especicacin del paquete, donde nicamente incluiremos la
declaracin de variables, cursores y subprogramas.
Obsrvelo en el cdigo de la pgina siguiente.
Copyright Computer Aided Education, S.A.

Funciones y paquetes

CREATE OR REPLACE
PACKAGE PCKORDENES AS
caducidad CONSTANT NUMBER(2, 0) := 15;
PROCEDURE uspNuevaOrden (pcliente IN NUMBER,
pfechaOrden IN DATE, pfechaEnvio IN DATE DEFAULT NULL,
pidOrden OUT NUMBER);
PROCEDURE uspDetalleOrden (orden IN NUMBER,
carrito IN VARCHAR2);
FUNCTION fduOrdenCaducada (pFechaOrden IN DATE)
RETURN NUMBER;
END PCKORDENES;

En este caso hemos declarado una constante (fjese en la utilizacin


de la palabra CONSTANT) para indicar el perodo de caducidad de
una orden, dos procedimientos y una funcin.
Fjese que no se especica ningn detalle de implementacin en
cuanto a los procedimientos o a la funcin ms que su nombre y los
parmetros que necesita.
Por lo tanto, los programadores que descubran el paquete podrn
utilizar una constante llamada caducidad, dos procedimientos y una
funcin. Todo ello relacionado con la administracin de las rdenes de
la tienda virtual.
Fjese que slo necesitan esto y no los detalles concretos de
implementacin. Saben que cuando quieran conocer si una orden
ha caducado, pueden utilizar la funcin fduOrdenCaducada;
cuando quieran crear una nueva orden, el procedimiento almacenado
uspNuevaOrden, etc.
En la especicacin del paquete encontrarn los parmetros que
deben utilizar, el tipo que devuelve la funcin, etc. pero ningn detalle
de su cdigo, que queda oculto en el cuerpo del paquete.
Una vez creada la especicacin, podremos hacer lo propio para
su cuerpo. Para ello, haga clic con el botn derecho del ratn en el
paquete y elija Create Body (crear cuerpo) en el men contextual.

Funciones y paquetes

Seguidamente deber completar el cdigo de los procedimientos,


funciones y cursores que haya incluido en la especicacin del paquete
e incluso otras unidades de cdigo que necesite para ello, pero que slo
estarn disponibles en el interior del cuerpo del paquete.
Fjese lo que esto signica. Por ejemplo, podramos escribir
el cdigo del procedimiento que crea una orden haciendo uso de
una secuencia (ORDENES_SEQ) y ms tarde decidir generar el
identicador de la orden de otra forma, modicando la implementacin
de este procedimiento sin que las aplicaciones que lo hayan utilizado
se den cuenta de ello y, por lo tanto, sin que necesiten modicar ni una
sola lnea de cdigo.

CREATE OR REPLACE
PACKAGE BODY PCKORDENES AS
PROCEDURE uspNuevaOrden (pcliente IN NUMBER,
pfechaOrden IN DATE, pfechaEnvio IN DATE DEFAULT NULL,
pidOrden OUT NUMBER) AS
BEGIN
INSERT INTO Ordenes (IdOrden, IdCliente, FechaOrden,
FechaEnvio, Total)
VALUES (ORDENES_SEQ.NEXTVAL, pcliente, pfechaOrden,
pfechaEnvio, 0);
SELECT ORDENES_SEQ.CURRVAL INTO pidOrden FROM Dual;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Se ha producido el error'
|| SQLCODE || ': ' || SQLERRM);
END uspNuevaOrden;
PROCEDURE uspDetalleOrden (orden IN NUMBER,
carrito IN VARCHAR2) AS
BEGIN
INSERT INTO LineasOrden (IdOrden, IdProducto,
Cantidad, Subtotal)
SELECT orden, cc.IdProducto, cc.Cantidad,
cc.Cantidad * p.Precio
FROM CarritoCompra cc INNER JOIN Productos p
ON cc.IdProducto = p.IdProducto
WHERE cc.IdCarrito = carrito;
-- Actualizar total de la orden
UPDATE Ordenes

Copyright Computer Aided Education, S.A.

Funciones y paquetes

SET Total = (SELECT SUM(Subtotal) FROM LineasOrden


WHERE IdOrden = orden)
WHERE IdOrden = orden;
-- Eliminar registros de CarritoCompra
DELETE FROM CarritoCompra
WHERE IdCarrito = carrito;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END uspDetalleOrden;
FUNCTION fduOrdenCaducada (pFechaOrden IN DATE)
RETURN NUMBER AS
BEGIN
IF (TRUNC(SYSDATE) - TRUNC(pFechaOrden)) > caducidad THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END fduOrdenCaducada;
END PCKORDENES;
No se puede
hacer referencia a variables
o constantes
pblicas de
un paquete
directamente.
Si lo necesita,
deber crear
una funcin
que devuelva
dicho valor.
Esto podramos aplicarlo
a la constante
caducidad de
nuestro ejemplo.

10

Y ahora veamos cmo utilizaramos lo que nos ofrece el paquete.


Es muy parecido a cmo lo hacemos con un procedimiento o funcin
independiente, pero ahora tendremos que indicar el nombre del
paquete.
SELECT pckOrdenes.fduOrdenCaducada(FechaOrden)
FROM Ordenes
WHERE IdOrden = 1;

Como puede ver, lo nico que cambia es que debemos escribir


el nombre del paquete ms un punto delante de cualquier unidad de
cdigo, variable, etc. del paquete.

Desencadenadores (triggers)
1. INTRODUCCIN

os desencadenadores o triggers son bloques de cdigo,


similares a los procedimientos almacenados, que se asocian
con una tabla o vista y que se ejecutan en determinadas situaciones o
eventos.
La diferencia fundamental, por tanto, entre un procedimiento
almacenado y un desencadenador es que nosotros no tenemos que
ejecutar explcitamente el desencadenador (y, de hecho, no podemos
hacerlo), sino que ste se ejecutar en el momento en que ocurran las
circunstancias necesarias.
Realmente estas circunstancias o eventos no son nada especiales,
ya que los desencadenadores se asocian con las operaciones INSERT,
UPDATE y DELETE de una tabla o vista.
A diferencia de los procedimientos almacenados, los
desencadenadores no tienen parmetros ni devuelven ningn cdigo.
Simplemente realizan las tareas que programamos para que se realicen
cuando se efecte la operacin de insercin, actualizacin o borrado
de registros.
Utilizando desencadenadores podemos:
Reforzar la integridad referencial entre tablas. Por ejemplo,
si tenemos una relacin 1 a Muchos, sabemos que cualquier
registro de la parte Muchos tiene que hacer referencia a un
determinado registro de la parte 1.
Pero, qu ocurre si queremos limitar el nmero de registros
relacionados? Por ejemplo, si queremos limitar el nmero de
productos distintos que pueda tener una orden. Podramos
conseguirlo con un desencadenador.
Crear registros de auditora o historial. Por ejemplo, nos
podra interesar guardar un registro cada vez que se elimina
una orden porque ha caducado.
Conseguir una funcionalidad parecida a las restricciones
CHECK pero que afecte a varias tablas de la misma o incluso
de distintas bases de datos.
Sustituir el cdigo que se debe ejecutar ante una actualizacin
de la base de datos. Esto es muy frecuente cuando se est
desarrollando una aplicacin.
Copyright Computer Aided Education, S.A.

Desencadenadores (triggers)

Por ejemplo, podramos crear un desencadenador para la operacin


de eliminacin: en lugar de eliminar el registro, simplemente
marcarlo como eliminado.
Una vez completada la aplicacin, podramos eliminar este
desencadenador para que la operacin de eliminacin se efectuara
realmente.
Finalmente, comentarle que en Oracle 10g tambin podremos
encontrar desencadenadores asociados a las operaciones de creacin y
modicacin de objetos de esquema, como tablas, vistas, etc.
E incluso para eventos del sistema, como el inicio de sesin de un
usuario, el inicio del servidor, etc.
Sin embargo, no los vamos a ver porque se utilizan con mucha
menos frecuencia.

2. DESENCADENADORES BEFORE Y AFTER

Los desencadenadores BEFORE y AFTER


slo pueden
estar asociados con tablas,
no con vistas.

odemos encontrar tres tipos de desencadenadores en funcin


del momento en que se ejecutan: los desencadenadores
BEFORE, AFTER e INSTEAD OF.
Como sus nombres indican en ingls, los desencadenadores
BEFORE y AFTER se ejecutan antes o despus de efectuar la
operacin INSERT, UPDATE o DELETE y despus de haber
comprobado cualquier restriccin asociada con la tabla.
Sin embargo, es importante entender que el cdigo de un
desencadenador BEFORE o AFTER se ejecutar siempre antes de
que los cambios sobre la tabla sean conrmados.
Y cmo se consigue esta funcionalidad? Pues utilizando dos
tablas temporales: :old y :new, que despus estudiaremos.
Veamos primero un ejemplo de desencadenador BEFORE,
es decir, que se ejecuta antes de conrmar los cambios en las tablas
subyacentes.
Pues bien, el ejemplo ms clsico que se utiliza para explicar
este tipo de desencadenador es la forma de simular un campo
autoincrementativo en las tablas.

Desencadenadores (triggers)

Nosotros hemos utilizado secuencias para generar automticamente


los valores que toman las claves principales de la mayora de las tablas
de la base de datos.
De esta forma, cada vez que hemos insertado un registro en alguna
de esas tablas, hemos tenido que reclamar el valor apropiado mediante
la funcin NEXTVAL de la secuencia. Utilizando un desencadenador
BEFORE esto lo puede hacer automticamente la base de datos.
Para ello, haga clic con el botn derecho del ratn en la
carpeta Triggers (desencadenadores) y elija New Trigger (nuevo
desencadenador), con lo que obtendr un cuadro de dilogo como el de
la gura siguiente.
Para que un
usuario pueda
crear desencadenadores, es
necesario que
disponga del
permiso CREATE TRIGGER.

En este cuadro de dilogo podemos especicar las caractersticas


del desencadenador y escribir el cdigo PL/SQL asociado con l:
Asignar un nombre descriptivo al desencadenador.
El tipo del desencadenador (Trigger Type), que permite indicar
con qu tipo de objeto est asociado; esto es, con una tabla,
vista, etc.
Copyright Computer Aided Education, S.A.

Desencadenadores (triggers)

Cundo se ejecutar el desencadenador: BEFORE o AFTER.


Y en qu nivel: instruccin (Statement Level) o la (Row
Level).
Si se utiliza el nivel Statement Level, entonces el cdigo del
desencadenador se ejecutar una nica vez ante una instruccin
INSERT, UPDATE o DELETE, aunque dicha instruccin afecte a
ms de una la o registro (o a ninguna).
Si se utiliza el nivel Row Level, entonces el cdigo se ejecutar
para cada una de las las o registros afectados por la instruccin
INSERT, UPDATE o DELETE. Si dichas instrucciones no afectan
a ninguna la, el cdigo tampoco se ejecutar.
La operacin u operaciones que lanzarn la ejecucin del
desencadenador. Podemos asociar el desencadenador con un
nico tipo de instruccin (INSERT, UPDATE o DELETE) o
para varias de ellos.
Podemos utilizar la seccin Referencing para crear alias de
las tablas :old y :new, que despus estudiaremos e incluso
crear una condicin que deba cumplirse para que se ejecute el
desencadenador en el campo When.
Una vez establecidas todas estas propiedades del desencadenador,
acepte el cuadro de dilogo y complete su cdigo.
CREATE OR REPLACE
TRIGGER TRGNUEVOIDCLIENTE
BEFORE INSERT ON CLIENTES
FOR EACH ROW
BEGIN
SELECT CLIENTES_SEQ.NEXTVAL INTO :new.IdCliente
FROM Dual;
END;

Fjese cmo se utiliza el comando CREATE TRIGGER, que se


utiliza la palabra BEFORE para indicar que es un desencadenador de
este tipo, la accin que lo lanzar (en este caso INSERT) y sobre qu
tabla lo har (en este caso CLIENTES).
Adems, con la clusula FOR EACH ROW se indica que el
desencadenador se ejecutar para cada la y no slo una vez.

Desencadenadores (triggers)

Lo que estamos haciendo en el cuerpo del desencadenador es


asignar el valor NEXTVAL de la sencuencia CLIENTES_SEQ al
campo IdCliente de la tabla :new.
La tabla :new es una tabla temporal del sistema donde se crean
los nuevos registros que se van a insertar en la tabla asociada con el
desencadenador.
En otras palabras, estaremos asignando automticamente el
siguiente valor disponible de la sencuencia en el campo IdCliente
del nuevo registro asociado con la instruccin INSERT que lanz la
ejecucin del desencadenador.
De esta forma, ya no ser necesario incluir el campo IdCliente (y
su valor) en la instruccin INSERT INTO.
Como el desencadenador se ejecuta para cada la insertada,
entonces nos aseguramos de que cada nuevo registro tendr su
correspondiente valor en el campo IdCliente.
Es interesante ver que necesitbamos aqu un desencadenador
de tipo BEFORE, para que el valor del campo IdCliente estuviera
disponible antes de insertar el nuevo registro.
Veamos ahora un ejemplo de desencadenador AFTER. Para ello,
se han creado dos nuevas tablas:
La tabla HistoriaPreciosProductos tiene el objetivo de registrar
cada uno de los precios que han ido teniendo los productos a lo
largo del tiempo.
El precio que aparece en la tabla Productos es el precio actual,
pero puede que cambie a lo largo del tiempo y puede que nos
interese retener esa evolucin. Para ello, utilizaremos esta tabla.
Por su parte, en la tabla OrdenesCaducadas tendremos un
registro o seguimiento de las rdenes que se eliminan al caducar
(es decir, una vez transcurridos 15 das despus de su creacin
y sin que hayan sido completadas).
Creamos un desencadenador AFTER para que se ejecute tras la
eliminacin (DELETE) de un registro de la tabla ORDENES.

Copyright Computer Aided Education, S.A.

Desencadenadores (triggers)

La idea es registrar o apuntar este hecho, que ocurre cuando


las rdenes caducan. Si no lo hacemos, no tendremos ninguna forma de
saber que esas rdenes existieron en su momento.
CREATE OR REPLACE
TRIGGER TRGELIMINARORDEN
AFTER DELETE ON ORDENES
FOR EACH ROW
BEGIN
INSERT INTO OrdenesCaducadas(IdOrden, FechaOrden,
FechaEliminacion)
SELECT :old.IdOrden, :old.FechaOrden, SYSDATE
FROM Dual;
END;

Vemos que la tabla OrdenesCaducadas dispone de tres campos: el


correspondiente al identicador de la orden que caduc y fue eliminada,
la fecha de creacin de dicha orden y la fecha de su eliminacin de la
tabla Ordenes.
Aqu puede ver la estructura de la tabla

OrdenesCaducadas.

Bien aqu es donde entran de nuevo en juego las tablas temporales


:old y :new.
Ya sabemos que al efectuar una operacin INSERT,
UPDATE o DELETE sobre una tabla en la que hemos denido
uno o ms desencadenadores, las modicaciones quedan reejadas
temporalmente en esas tablas: la tabla :old dispone de los registros
eliminados o actualizados tal como estaban antes de realizar la operacin
y en la tabla :new se insertan los nuevos registros as como los valores
de los campos actualizados.
Estas tablas slo las tenemos disponibles en el cdigo del
desencadenador, para realizar lo que estimemos oportuno. Tras la
ejecucin del desencadenador, se llevarn a cabo las modicaciones en
las tablas originales.

Desencadenadores (triggers)

Pues en el cdigo del desencadenador utilizamos la tabla :old para


obtener los detalles de la orden u rdenes que hemos eliminado. As
quedar registrada esta accin. Observe la tabla OrdenesCaducadas
tras eliminar la orden nmero 15.

3. LAS TABLAS :OLD Y :NEW

urante la ejecucin de un desencadenador podemos hacer


referencia a dos tablas temporales que despus sern
eliminadas pero en las que se reejan los cambios efectuados en las
tablas originales de la base de datos.
En la tabla :old disponemos de los valores de las columnas
antes de la operacin. En el caso de una operacin INSERT, esto no
tiene sentido, por lo que cualquier referencia a :old se evaluar como
NULL.
Por su parte, en la tabla :new disponemos de los nuevos valores,
tras ejecutar la operacin que ha lanzado el desencadenador. En el caso
de una operacin DELETE, cualquier referencia a :new se evaluar
como NULL.
Una sentencia UPDATE es similar a una operacin de eliminacin
seguida de una operacin de insercin, por lo que podremos comparar
o utilizar tanto los valores anteriores (:old) como los nuevos tras la
actualizacin (:new).
Por lo tanto,
no debe utilizar :old y :new
en un desencadenador que
se ejecuta una
nica vez por
cada operacin, es decir,
un desencadenador de nivel
de instruccin
(Statement
Level).

En las tablas temporales :old y :new tendremos un registro por cada


registro afectado por la operacin INSERT, UPDATE o DELETE.
Al hacer referencia a :old o :new, se estar haciendo referencia a
los valores correspondientes al registro para el que se est ejecutando
el desencadenador.
Veamos otro ejemplo de desencadenador para aanzar todo esto.
Ahora guardaremos el historial de precios de cada producto a lo largo
del tiempo.

Copyright Computer Aided Education, S.A.

Desencadenadores (triggers)

Fjese que como hemos activado la operacin UPDATE, ha


hecho lo propio la lista Selected Columns (columnas seleccionadas).
Esta lista hace referencia a las columnas que se ven afectadas por la
operacin UPDATE.
Es conveniente
mantener lo
ms corto y
sencillo posible
el cdigo de
los desencadenadores. Por
ello, seguramente lo ms
apropiado habra sido crear
un desencadenador para
la operacin
INSERT y otro
para la operacin UPDATE,
ya que no se
efectan las
mismas operaciones en cada
caso.

Si desea que el desencadenador se ejecute cuando se actualice


cualquier columna, inclyalas todas en la lista Selected Columns;
si quiere que slo se ejecute cuando se actualice una columna o un
conjunto de columnas concreto de la tabla, incluya slo esas columnas
en la lista.
En el cuadro anterior conseguimos que el desencadenador se
ejecute ante una operacin INSERT en la tabla Productos y ante una
operacin UPDATE, pero slo en el caso de que afecte al campo Precio
de la tabla Productos.
CREATE OR REPLACE
TRIGGER TRGMODIFICARPRECIO
AFTER INSERT OR UPDATE OF PRECIO ON PRODUCTOS
FOR EACH ROW
DECLARE
nuevo NUMBER(1, 0);
BEGIN

Desencadenadores (triggers)

IF (INSERTING) THEN
-- Se trata de una operacin INSERT
nuevo := 1;
ELSE
-- Se trata de una operacin UPDATE del campo Precio
nuevo := 0;
END IF;
INSERT INTO HistoriaPreciosProductos(IdProducto,
Precio, Fecha, PrimerPrecio)
SELECT :new.IdProducto, :new.Precio, SYSDATE, nuevo
FROM Dual;
END;

Fjese cmo podemos asociar el desencadenador con ms de


una accin separndolas con la palabra clave OR. En este caso lo
hemos hecho para las operaciones INSERT y UPDATE, ya que
queremos registrar el precio inicial de los productos y cada una de sus
modicaciones.

Utilice
INSERTING,
UPDATING o
DELETING en
funcin del
tipo de operacin que quiera saber si se
ha realizado.

De la misma forma, podramos tener ms de un desencadenador para


una determinada operacin. En ese caso, todos los desencadenadores
se ejecutaran al ocurrir el correspondiente evento.
En el cuerpo del desencadenador se comprueba el tipo de
operacin que se ha disparado o lanzado el desencadenador y, en
funcin de si se trata de INSERT o UPDATE se introduce el valor 1 o
0, respectivamente, en el campo PrimerPrecio.
Fjese en los campos de la tabla HistoriaPreciosProductos,
donde guardamos el identicador del producto, su precio, la fecha de
ocurrencia y el valor 1 o 0 para el campo PrimerPrecio.
Aqu puede ver la tabla

Copyright Computer Aided Education, S.A.

HistoriaPreciosProductos.

Desencadenadores (triggers)

En la imagen siguiente queda reejado que la ejecucin del


desencadenador ha creado dos registros: uno durante la insercin del
nuevo producto y otro durante la actualizacin de su precio.

En este caso, la clave principal de la tabla es el par (IdProducto,


Fecha), ya que el campo Fecha guarda el momento exacto en que se
efectu la operacin aunque aqu slo muestre la fecha.
Puede que est pensando que todo esto lo podra programar en un
procedimiento almacenado y realmente es as.
Sin embargo, utilizando desencadenadores, estamos asegurndonos
de que siempre se ejecutar este cdigo al insertar, modicar o eliminar
un producto u orden, independientemente de cmo se haga.
Con los procedimientos almacenados esto no se puede asegurar,
ya que si se realiza alguna de estas operaciones sin utilizar el
procedimiento almacenado, no quedara registrado en las tablas
HistoriaPreciosProductos u OrdenesCaducadas.

4. DESENCADENADORES INSTEAD OF

tro tipo de desencadenadores disponibles en Oracle 10g


son los desencadenadores INSTEAD OF, que nicamente
pueden asociarse con vistas.
Como su nombre indica (INSTEAD OF signica en lugar de en
ingls), el propsito de un desencadenador de este tipo es ejecutar un
cdigo distinto al que lo ha disparado.
Los desencadenadores INSTEAD OF pasan por alto las
acciones estndar de la instruccin de desencadenamiento: INSERT,
UPDATE o DELETE y, en su lugar, ejecutan el cdigo escrito en el
desencadenador.
Adems, los desencadenadores INSTEAD OF son los nicos que
podemos asociar con una vista y permiten que incluso aquellas vistas
que no son actualizables a causa de sus caractersticas puedan serlo.
10

Desencadenadores (triggers)

Veamos un ejemplo de ello. Aqu tenemos la vista vClientes,


que permite obtener algunos detalles de los clientes de la provincia de
Ciudad Real.

Si intentamos ejecutar una operacin INSERT INTO vClientes,


veremos que dicha vista no es actualizable a causa de sus caractersticas
(en la insercin no se proporciona el valor de alguno de los campos de
la tabla Clientes, que es la tabla base de la vista, que no pueden ser
nulos).
Veamos ahora cmo lo solucionamos con un desencadenador
INSTEAD OF.

Copyright Computer Aided Education, S.A.

11

Desencadenadores (triggers)

Observe cmo ha desaparecido la opcin de indicar si se trata


de un desencadenador BEFORE o AFTER. Las vistas slo admiten
desencadenadores INSTEAD OF.
create or replace
TRIGGER TRGACTUALIZARVISTA
INSTEAD OF INSERT ON VCLIENTES
BEGIN
INSERT INTO Clientes(Nombre, Apellidos, Direccion,
Poblacion, CodPostal, Provincia, Email, Password, Telefono)
VALUES(:new.Nombre, :new.Apellidos, :new.Direccion,
:new.Poblacion, :new.CodPostal, :new.Provincia,
'SU@EMAIL.COM', 'CAMBIAR', 'SIN TELEFONO');
END;

Como puede ver, el cdigo es similar a los desencadenadores


BEFORE o AFTER, pero ahora se utilizan las palabras INSTEAD
OF.
As, lo que realmente vamos a hacer cuando se ejecute una
instruccin INSERT INTO sobre la vista vClientes es insertar un
registro en la tabla Clientes con los valores apropiados.
Por ejemplo, para el caso del campo Nombre, tendremos que es
vlido el valor dado en la instruccin INSERT INTO que dispar el
desencadenador (:new.Nombre).
Lo mismo haramos para el resto de campos que s que aparecen
en la vista. El problema est en aquellos que no estn en la vista y que
no pueden ser NULL en la tabla Clientes. Pues para estos, establecemos
un determinado valor (por ejemplo 'SU@EMAIL.COM' en el campo
Email).
Es importante que entienda lo que estamos haciendo. La idea es
que se ejecute este cdigo en lugar de (INSTEAD OF) la instruccin
INSERT INTO original, que hizo ejecutar el desencadenador.
Ahora al ejecutar una consulta de insercin como la siguiente,
donde se utiliza la vista vClientes, se disparar el desencadenador
INSTEAD OF y se insertar correctamente en la tabla Clientes.
INSERT INTO vClientes (Nombre, Apellidos, Direccion,
Poblacion, CodPostal, Provincia)
VALUES ('Antonio', 'Blas Fernndez',
'C/ El olmo, 17, planta baja.', 'Tomelloso',
'24323', 'Ciudad Real');

12

Desencadenadores (triggers)

El procedimiento sera similar si al actualizar una vista tuviramos


que hacer lo propio con ms de una tabla: simplemente incluiramos las
instrucciones INSERT INTO necesarias para ello en el desencadenador
INSTEAD OF.

Para que un
desencadenador no se
ejecute pero
tampoco sea
eliminado, elija el comando
Disable de su
men contextual. Ms tarde
podr habilitarlo de nuevo
con Enable.

Finalmente, indicarle que los desencadenadores o triggers son


objetos asociados con tablas o vistas pero independientes de stas.
Esto quiere decir que podremos editarlos o eliminarlos como con
cualquier otro objeto.
Existen muchos otros asuntos referentes a los desencadenadores,
como qu ocurre cuando un desencadenador hace que se ejecute otro
(por ejemplo, el desencadenador INSTEAD OF ha hecho que se
ejecute, a su vez, el desencadenador BEFORE que solicita un nuevo
valor de la secuencia de clientes); el orden en que se ejecutan los
desencadenadores asociados con una tabla o vista; qu ocurre con las
transacciones, etc.
Para ms informacin, acuda a las guas de Oracle.

Copyright Computer Aided Education, S.A.

13

Java en la base de datos


1. INTRODUCCIN

l lenguaje PL/SQL ha estado siempre a disposicin de los


programadores de Oracle y ha ido mejorando en cada nueva
versin del producto.
Con PL/SQL podemos escribir consultas para obtener informacin
de la base de datos o para modicarla, y otros objetos con entidad
propia, como procedimientos almacenados, funciones, etc.
PL/SQL sigue teniendo una gran importancia en Oracle, ya que es
la mejor herramienta de programacin a la hora de acceder directamente
a la base de datos y en cuanto a su manipulacin.
Sin embargo, PL/SQL presenta algunas deciencias cuando
necesitamos realizar procesos ms complejos, ya que, al n y al cabo, no
es un lenguaje de programacin de alto nivel como los que empleamos
al desarrollar aplicaciones.
Oracle admite la creacin de cdigo en otros lenguajes,
especialmente Java, que se almacenen en la propia base de datos, como
procedimientos almacenados o funciones denidas por el usuario.
Esto representa una gran ventaja para el programador que conoce
Java, ya que ahora puede utilizar este lenguaje y aprovechar toda la
potencia que proporciona.
Adems, esto representa una mayor independencia de un lenguaje
propietario de la base de datos, como es el caso de PL/SQL en
Oracle o T-SQL en SQL Server.
Sin embargo, es importante no caer en la sensacin de que ya que
disponemos de Java, no deberamos seguir utilizando PL/SQL: esto no
es cierto, ya que PL/SQL sigue siendo la mejor opcin para muchas
tareas de acceso a datos.
En esta leccin veremos cmo podemos utilizar Java para crear
una funcin que ms tarde quedar almacenada en la base de datos
Oracle como un objeto ms de la misma.
Lgicamente, la leccin slo pretende ser una introduccin del
proceso, ya que estudiarlo detenidamente podra representar un curso
entero y, adems, usted no tiene por qu tener conocimientos de Java.
Sin embargo, servir como demostracin de la fuerte relacin
entre la tecnologa Oracle y Java.
Copyright Computer Aided Education, S.A.

Java en la base de datos

2. JDEVELOPER

la hora de implementar cdigo Java en la base de datos


Oracle, dispondremos de distintas herramientas de desarrollo
que podemos utilizar.
Cualquier entorno de desarrollo de Java es vlido para este
propsito. Nosotros utilizaremos JDeveloper, que est disponible para
su descarga en la web de Oracle.

Lo primero que tiene que hacer es indicar la informacin necesaria


para conectarse con la base de datos Oracle.
Para ello, sitese en la cha Connections
, despus
haga clic con el botn derecho del ratn en la carpeta Database y elija
New Database Connection (nueva conexin con base de datos).
Acceder a un asistente en el que debe indicar:
- El nombre de la conexin y de qu tipo se trata, o lo que es lo
mismo, qu tecnologa se utilizar para acceder a la base de datos.
Por defecto se emplea JDBC, que es la API ms utilizada para
acceder a bases de datos desde Java.
- Los detalles para poder realizar la conexin; esto es, el nombre
de usuario y la contrasea que se utilizarn. Adicionalmente,
puede indicar un papel o role. Por ejemplo, esto sera adecuado si
queremos utilizar un usuario que es administrador o SYSDBA.

Java en la base de datos

- Los detalles de la base de datos a la que queremos acceder:


servidor, SID, etc.
Podr comprobar la conexin antes de crearla y si la prueba es
correcta, nalizar el asistente.
Para poder cargar clases de Java en el esquema propio de la
base de datos se necesitan los permisos CREATE PROCEDURE
y CREATE TABLE.
Si se tiene que cargar clases en esquemas distintos al del usuario,
se necesitarn los permisos CREATE ANY PROCEDURE Y
CREATE ANY TABLE.
En nuestro ejemplo, el usuario TIENDA ya dispone del
permiso CREATE PROCEDURE, por lo que supondremos que
hemos otorgado adicionalmente el permiso CREATE TABLE.
Seguramente sera una buena idea revocar este permiso una
vez se han implementado las clases Java en su esquema.
GRANT CREATE TABLE TO TIENDA; -- Para otorgar el permiso
REVOKE CREATE TABLE FROM TIENDA; -- Para eliminarlo

3. UNA FUNCIN DE EJEMPLO

a presencia de Java en el servidor Oracle se maniesta como


procedimientos almacenados, como funciones denidas por
el usuario o como disparadores.
Pero lo ms importante es saber decidir cundo es mejor utilizar
esta alternativa o cundo es mejor hacerlo directamente en PL/SQL.
Algunas de las tareas que son buenas candidatas para utilizar Java
son clculos complejos, manipulacin de cadenas de caracteres, etc.,
donde la tecnologa Java proporciona muchas clases tiles.
Si necesita
alguna expresin regular,
puede acudir
al sitio web
http://www.
regexlib.com,
donde encontrar muchos
ejemplos.

Por ejemplo, podremos utilizar las clases correspondientes al


manejo de expresiones regulares de Java para validar los datos que
introducimos en la base de datos.
Uno de los ejemplos ms tpicos es comprobar la validez de las
direcciones de correo electrnico.

Copyright Computer Aided Education, S.A.

Java en la base de datos

Lo primero que tendremos que hacer es escribir el cdigo Java


que despus se almacenar en la base de datos Oracle en forma de
procedimiento o funcin.
Para ello crearemos una aplicacin en JDeveloper y un proyecto
dentro de ella. En dicho proyecto ya podemos crear las distintas
unidades de cdigo. En nuestro caso debemos crear clases pblicas de
Java para despus poder publicar sus mtodos como procedimientos en
la base de datos Oracle.
Para crear una clase Java en el proyecto, haga clic con el botn
derecho del ratn en ste y elija New, despus elija el tipo Java Class
en el cuadro de dilogo que aparece.
import java.util.regex.*;
public class UserDenedFunctions {
public static int ExpresionesRegulares(String data,
String category) {
Pattern patron;
Matcher resultado = null;
if (category.toLowerCase().compareTo("email") == 0) {
patron = Pattern.compile("^([0-9a-zA-Z]([-.\\w]*[09a-zA-Z])*@(([0-9a-zA-Z])+([-\\w]*[0-9a-zA-Z])*\\.)+[azA-Z]{2,9})$");
resultado = patron.matcher(data);
}
else if (category.toLowerCase().compareTo("password")
== 0){
patron = Pattern.compile("^([a-zA-Z0-9@*#]{8,15})$");
resultado = patron.matcher(data);
}

if (resultado == null)
return 2;
if (resultado.matches())
return 1;
else
return 0;

El cdigo que escribamos en una clase de Java para ser publicado


en una base de datos Oracle debe cumplir que:
- La clase sea pblica.
- Los mtodos sean pblicos y estticos: si no devuelve ningn
valor (void), se convertirn en procedimientos almacenados en la base
de datos Oracle; si devuelven un valor, se convertirn en funciones
denidas por el usuario.
4

Java en la base de datos

Empecemos a ver las ventajas de programar en Java. Por ejemplo,


ya que queremos utilizar expresiones regulares, hacemos uso de
algunas clases de Java para ello que se encuentran disponibles a travs
del paquete java.util.regex.
Vemos que hemos escrito un mtodo que recibe el parmetro
data, que es la expresin que queremos evaluar; y category, que es el
tipo de expresin.
As pues, si category es email, entonces se comprueba si data
corresponde a una expresin regular que casa con las direcciones de
correo electrnico; mientras que si category es password, se hace lo
propio con data para comprobar la complejidad de una contrasea de
entre 8 y 15 caracteres.
Para comprobar esta correspondencia se han utilizado las clases
Pattern y Matcher de Java, aplicando algunos de sus mtodos.
Sin entrar en ms detalles de este cdigo Java, es importante que
nos demos cuenta de que los tipos de datos que utilicemos aqu tienen
que poder ser convertidos o trasladados a tipos de datos Oracle.
Por ejemplo, hemos utilizado el tipo de datos String de Java,
que puede ser fcilmente trasladado al tipo de datos VARCHAR2 de
Oracle.
Sin embargo, el tipo de datos boolean de Java no tiene un tipo
de datos similar en Oracle, por lo que no podra ser utilizado como el
valor devuelto por el mtodo Java.
Una vez escrito y compilado nuestro cdigo Java, debemos
implementarlo y publicarlo en la base de datos Oracle.
- Implementarlo signica que la clase de Java se crea como un
objeto ms de la base de datos Oracle.
- Publicarlo signica que los mtodos de dicha clase se convierten
en procedimientos almacenados (o funciones) de dicha base de
datos.
Afortunadamente, JDeveloper facilita todo este proceso, que de
otra forma tendramos que hacer manualmente.
Para ello, debe crear un perl de implementacin. Siga estos
pasos:
Copyright Computer Aided Education, S.A.

Java en la base de datos

1.- Haga clic con el botn derecho del ratn en el proyecto y elija
New.
2.- Haga clic en el signo + de la categora General.
3.- Elija Deployment Proles.
4.- Seleccione Loadjava and Java Stored Procedures en el
panel de la derecha y acepte.

Seguidamente debe indicar cmo se implementarn los mtodos


de la clase Java en la base de datos Oracle. Puede hacerlo como
procedimientos almacenados sueltos o formando parte de un paquete.
Para ello, haga clic con el botn derecho del ratn en el archivo
.deploy que se ha creado en el proceso anterior y elija Add Store
Procedure (aadir procedimiento almacenado) o Add PL/SQL
package (aadir paquete PL/SQL).

Java en la base de datos

En la gura anterior estamos haciendo que el mtodo


ExpresionesRegulares de la clase Java UserDenedFunctions
se convierta en un procedimiento almacenado (funcin en este caso
porque devuelve un valor entero) en la base de datos Oracle durante el
proceso de implementacin y publicacin.
Durante la implementacin y publicacin del cdigo Java se
utilizar la conexin que creamos al principio de la leccin. Para ello,
haga clic con el botn derecho del ratn en el archivo .deploy y elija
Deploy to - conexin creada anteriormente.

Con esto completaremos dicho procedimiento. Nuestra


base de datos Oracle albergar ahora una clase de Java llamada
UserDenedFunctions y dispondremos de una nueva funcin llamada
ExpresionesRegulares.
Veremos que dicha funcin se puede utilizar como lo hemos hecho
con cualquier procedimiento almacenado o funcin escrito en PL/SQL.
Sin embargo, su cdigo ser de Java y ser ejecutado por la mquina
virtual de Java que forma parte del servidor de bases de datos Oracle.

4. UTILIZAR LA FUNCIN

odemos utilizar los objetos implementados mediante Java


exactamente igual que lo haramos con sus homlogos
PL/SQL.

Copyright Computer Aided Education, S.A.

Java en la base de datos

Para ello, Oracle 10g incluye su propia mquina virtual de Java


como integrante del servidor de base de datos. Este componente de
software es el que se encarga de establecer el entorno de ejecucin
adecuado para las clases de Java.
Fjese en la gura siguiente, donde hemos vuelto a Oracle Sql
Developer. Aqu ya aparece la funcin ExpresionesRegulares.
El programador la utilizar como lo hara con cualquier otra
funcin, sin tener por qu conocer que est implementada en Java.

Por qu se ha implementado como una funcin y no como un


procedimiento almacenado en el servidor? Porque devuelve un valor
escalar.
En el panel de la derecha vemos que no se incluye el cdigo en s
de la funcin, sino una referencia al mtodo ExpresionesRegulares de
la clase de Java UserDenedFunctions.
Dicha clase Java est implementada en el servidor como un objeto
ms y se utilizar su cdigo cuando se ejecute la funcin.
Ahora vea cmo la podramos utilizar:
SELECT ExpresionesRegulares('jgomez.mail.com', 'email')
AS Correcto
FROM Dual;

Java en la base de datos

En funcin de los parmetros, la funcin devolver un 0 o un 1


indicando si el primer parmetro "casa" con el patrn indicado en el
segundo parmetro.

Podra pensar en utilizar esta funcin para implementar


restricciones Check (por ejemplo, en la tabla Clientes, donde hay un
campo Email y otro Contrasea).
Sin embargo, Oracle no permite utilizar funciones denidas por el
usuario en las restricciones Check, aunque s podramos hacerlo en un
desencadenador o trigger.
Poder utilizar la tecnologa Java en el propio servidor de base de
datos es una posibilidad realmente interesante, pero que debe emplearse
cuando lo aconsejen los requerimientos de programacin.
Al n y al cabo, estamos pasando parte de la lgica de nuestras
aplicaciones al servidor de base de datos, por lo que ste tiene que
realizar ms trabajo de cmputo que si no lo hacemos.
Elegir dnde y con qu herramientas debemos programar la lgica
de nuestras aplicaciones de bases de datos no es una decisin sencilla,
por lo que hay que analizarla muy seriamente.
Esta leccin simplemente pretende demostrarle que se puede
utilizar una tecnologa tan potente como Java en el servidor de base de
datos Oracle.

Copyright Computer Aided Education, S.A.

Propiedades de base de datos


1. TABLESPACES Y ARCHIVOS DE DATOS

na base de datos Oracle est constituida por una serie de


archivos fsicos que se almacenan en el sistema de archivos
del equipo del servidor o en cualquier otro medio de almacenamiento
congurado para ello.
Existen tres tipos de archivos en una base de datos Oracle:
archivos de datos, archivos de control y archivos redo log.
En los archivos de datos es donde se almacena realmente la
informacin de la base de datos.
Sin embargo, el administrador no suele trabajar directamente con
los archivos de datos, sino que lo hace con una estructura de carcter
lgico llamada tablespace.
As pues, cuando creamos una tabla, un ndice o cualquier otro
objeto de esquema, nos encontramos con la posibilidad de indicar en
qu tablespace queremos que se cree.
Puede comprobar el conjunto de tablespaces de una base de
datos a travs del enlace Tablespaces de la pgina principal de
administracin.

Cualquier base de datos Oracle consta, al menos, del tablespace


SYSTEM, donde se almacenan todas las tablas y dems objetos de
diccionario, que son objetos que permiten el buen funcionamiento de
la base de datos.
Copyright Computer Aided Education, S.A.

Propiedades de bases de datos

Aunque podemos utilizar este tablespace para crear nuestros


objetos, normalmente esto no es una buena idea, ya que es mejor que
los objetos de usuario se almacenen en un tablespace distinto al de los
objetos del sistema.
Nosotros siempre hemos creado objetos en el tablespace USERS,
por lo que previamente tuvimos que asignarle una cuota en dicho
tablespace al usuario TIENDA.
Como normalmente las bases de datos son creadas mediante el
Asistente de Conguracin de Base de Datos, es ste el que suele
decidir qu tablespaces crear y con qu caractersticas. En este caso, el
asistente cre el tablespace USERS por nosotros.
Veamos pues, las caractersticas de un tablespace.

Tablespace de archivo grande: activando esta caracterstica,


el tablespace constar nicamente de un archivo, que puede
ser de gran tamao, en lugar de varios archivos de datos ms
pequeos.
Este tipo tiene la ventaja de que slo se maneja un archivo de
datos por tablespace, por lo que minimiza el nmero de stos,
facilitando su administracin.

Propiedades de bases de datos

Como principal desventaja podemos indicar que el sistema de


archivos tiene que disponer del suciente espacio libre para
permitir crecer el tablespace, ya que no podr ser ampliado con la
asignacin de nuevos archivos de datos.
Gestin de extensiones: en esta seccin podemos indicar si
el espacio libre del tablespace debe ser gestionado localmente
por el mismo tablespace o externamente en otra estructura
almacenada en el diccionario de la base de datos.
Normalmente la gestin local del tablespace proporciona mejores
prestaciones.
Tipo: aqu indicaremos si el tablespace se ha creado con el
propsito de almacenar datos (tipo permanente) o como
espacio para resultados temporales de consultas, operaciones
de ordenacin, etc.
Al crear un usuario se indica tanto el tablespace predeterminado
(en el que crear objetos) como el tablespace temporal (donde se
almacenarn sus resultados intermedios).
Un tercer tipo de tablespace es el Deshacer. Este tipo de tablespace
se crea como espacio de almacenamiento para la informacin
necesaria a la hora de deshacer operaciones en la base de datos.
Por ejemplo, cuando se ejecuta el comando ROLLBACK para
cancelar una transaccin.
Estado: en este apartado el administrador puede establecer o
modicar el estado del tablespace. Las opciones son:
Online o disponible.
Ofine o deshabilitado.
Slo lectura o disponible slo para la consulta, no para la
modicacin de los datos.
Por ejemplo, el administrador podra poner en ofine un tablespace
para realizar alguna operacin de mantenimiento, como realizar
una copia de seguridad o restaurar una copia anterior.
Tambin podra poner un tablespace en modo de slo lectura para
que nadie pueda modicar la informacin almacenada en l.

Copyright Computer Aided Education, S.A.

Propiedades de bases de datos

El nico tablespace que no puede ponerse nunca en ofine es


el tablespace SYSTEM.
El tablespace SYSTEM siempre est online, ya que en l se
almacena la informacin del diccionario de la base de datos,
informacin que es necesaria para el buen funcionamiento de
sta.
Cuando un tablespace se pone ofine, online o en modo slo
lectura, se est haciendo lo propio para todos sus archivos de
datos.

En la seccin Archivos de datos vemos los archivos que


constituyen el tablespace.
Un archivo de datos slo puede pertenecer a un tablespace, aunque
un tablespace puede estar formado por varios archivos de datos.
Aqu encontraremos su ubicacin o directorio del sistema de
archivos del servidor, el tamao con el que se cre y el espacio
utilizado actualmente.
Editando un archivo de datos podremos comprobar que se pueden
poner ofine de forma individual. Esto signica que podramos
habilitar parcialmente un tablespace.
Todo esto debe conocerlo para poder solucionar los problemas
que encontrar. As, imagine que el disco duro donde reside este
archivo de datos se est quedando si espacio.
Una posible solucin para permitir que el tablespace siga creciendo
para almacenar los datos, sera crear otro archivo de datos en un
disco duro diferente. Para ello, agregaramos el nuevo archivo en
la lista Archivos de Datos.
En la cha Almacenamiento del tablespace encontramos
los detalles tcnicos de cmo se asigna el espacio necesario para
el tablespace; si las operaciones efectuadas sobre l deben quedar
almacenadas en los archivos de registro y el tamao del bloque del
disco.
Normalmente, este ltimo detalle coincide con el del sistema
operativo.
Por ejemplo, en un tablespace temporal no tiene sentido activar la
opcin de registro, ya que las operaciones que se realizan en l no tiene
por qu ser canceladas para volver a un estado coherente de los datos.
4

Propiedades de bases de datos

Finalmente, en la cha Umbrales se establecen los umbrales,


sobrepasados los cuales, se generarn alertas en cuanto al espacio libre
disponible en el tablespace.
Por ejemplo, la conguracin de la gura siguiente indica que se
crear una alerta para el administrador cuando el espacio ocupado en el
tablespace alcance el 85% del mismo. Se puede establecer este umbral
de advertencia y de mensaje crtico utilizando porcentajes o valores
absolutos.

Copyright Computer Aided Education, S.A.

Propiedades de bases de datos

Todas estas opciones son las que se establecen al crear un


tablespace y sus correspondientes archivos de datos.
En resumen, debemos entender que el administrador trabaja
principalmente con tablespaces, aunque stos pueden estar constituidos
fsicamente por uno o varios archivos de datos.
Al trabajar con tablespaces, es mucho ms cmodo realizar
operaciones habituales, como poner ofine u online los datos, realizar
copias de seguridad y su restauracin, etc.

2. ARCHIVOS DE CONTROL Y REDO LOGS

unque la informacin se almacena en los archivos de datos,


existen dos tipos ms de archivos necesarios para el buen
funcionamiento de la base de datos: los archivos de control y los redo
log.
Utilizar el enlace Archivos de Control de la pgina principal de
administracin para trabajar con los primeros.
Toda base de datos tiene, al menos, un archivo de control, que
se utiliza tanto en el momento de iniciar la base de datos como durante
su uso.

En los archivos de control Oracle realiza un seguimiento de la


estructura fsica de la base de datos, por lo que cualquier cambio en
los archivos de datos o archivos redo log, que despus veremos, es
registrado en los archivos de control.
6

Propiedades de bases de datos

Entre otras cosas, en un archivo de control se almacena informacin


como:
El nombre de la base de datos.
El momento de su creacin.
El nombre y ubicaciones de los archivos de datos y archivos
redo log.
Informacin referente a los tablespaces.
Informacin sobre copias de seguridad y recuperacin.
Oracle recomienda crear ms de un archivo de control en cada base
de datos y aconseja que estn en discos duros distintos ante posibles
problemas en alguno de ellos.
Es el servidor el que se encarga de mantener las copias idnticas
de los archivos de control. Esto signica que si el archivo de control en
uso sufre algn problema, ser el propio servidor (sin intervencin del
administrador) el que utilizar otra de las copias disponibles.
En la gura anterior vemos que la base de datos dispone de tres
archivos de control y comprobamos su ubicacin.
Desde Enterprise Manager no podemos crear nuevos archivos de
control, sino que esto se trata de un detalle que se establece ente los
parmetros de inicializacin de la base de datos.
Por otra parte, Oracle utiliza otro tipo de archivos: los archivos redo
log. Estos archivos se utilizan ante posibles errores de funcionamiento
del servidor de base de datos o del propio hardware.
Utilizar el enlace a Grupo de Redo Logs de la pgina principal
de administracin para trabajar con estos archivos.
Como en el caso de los archivos de control, Oracle recomienda
crear ms de un archivo redo log. Adems, es el propio servidor el que
se encarga de mantener las copias idnticas de todos ellos.
La principal funcin de un archivo redo log es registrar todos los
cambios realizados sobre los datos.
Por ejemplo, si ocurre un corte del ujo elctrico durante la
realizacin de una transaccin, Oracle utiliza el archivo redo log activo
para poder recuperar la informacin de la transaccin o transacciones
que se estaban realizando justo en ese momento.
Copyright Computer Aided Education, S.A.

Propiedades de bases de datos

Desde esta pgina podremos crear ms archivos redo log. Como


en el caso de los archivos de control, sera interesante que se guardaran
en discos duros distintos.

3. MEMORIA Y PROCESOS

ara poder acceder a la informacin almacenada en una base


de datos Oracle, no slo es necesario disponer de los distintos
archivos que la constituyen, sino que es necesario crear una serie de
procesos y disponer de memoria en el servidor.
Esta memoria reservada para atender las solicitudes de acceso por
parte de usuarios y aplicaciones, as como los proceso que se crean
para ello, se conoce como instancia de la base de datos.
Si la instancia no se ha iniciado, los datos seguirn estando
disponibles fsicamente, pero no se podr acceder a ellos de ninguna
forma.
Por lo tanto, es tarea del administrador conocer qu parmetros
de memoria y procesos utiliza Oracle y saber cmo modicarlos si es
necesario.
Para ello, utilizar el enlace Parmetros de memoria del
apartado Conguracin de la Base de Datos de la pgina principal
de administracin.

Propiedades de bases de datos

La memoria que utiliza la instancia se clasica en dos tipos:


Memoria SGA (rea Global del Sistema): o tambin conocida
como rea de memoria compartida, ya que es una zona de
memoria a la que acceden los procesos de todos los usuarios
conectados a la base de datos.
Memoria PGA (rea Global de Programas): es la memoria que
se reserva particularmente para cada proceso de usuario.
La memoria SGA es un rea en la que se almacena una serie de
componentes con el propsito de mejorar las prestaciones del servidor
ante las peticiones de los procesos de usuario.
Por ejemplo, el componente Pool compartido se utiliza para
mantener una cach con las ltimas consultas PL/SQL realizadas.
Esto signica que consiguientes consultas podran aprovechar la
informacin almacenada en la SGA, sin necesidad de volver a leer los
datos fsicos de la base de datos.
Oracle simplica muchsimo la tarea del administrador en esta
versin de su base de datos, ya que proporciona la Gestin Automtica
de Memoria Compartida.
Esto quiere decir que es el propio servidor el que se encarga de
establecer el tamao y umbrales ptimos en cada caso.
Copyright Computer Aided Education, S.A.

Propiedades de bases de datos

Sin embargo, si el administrador desea experimentar o cambiar


estos valores, aqu lo puede hacer.
Por ejemplo, si ha aadido memoria RAM al equipo servidor, tal
vez desee ampliar la memoria SGA o solicitar que Oracle vuelva a
revisar este aspecto con el botn Consejo.
En cuanto a la memoria PGA, indicaremos las caractersticas de
la memoria que se utiliza cada vez que se crea un proceso para atender
una solicitud de un usuario o aplicacin cliente.

Durante la creacin de estos procesos en el servidor, se asigna


memoria desde la reservada como PGA. El total que queremos poner
a disposicin del servidor con este propsito es el valor que aparece
aqu.
Oracle cambia dicha cantidad en funcin de la carga que recibe
el servidor.
Como consejo fundamental, Oracle recomienda disponer de
suciente memoria RAM fsica para cubrir la suma de la memoria
compartida o SGA ms la memoria total PGA.
Y es que, si el servidor se ve obligado a utilizar memoria virtual,
las prestaciones disminuirn considerablemente.
Finalmente, debemos estudiar la parte de los procesos de una
instancia de base de datos.
Oracle crea un proceso en el servidor tanto para ejecutar el cdigo
propio del servidor como para las conexiones realizadas por usuarios
o aplicaciones cliente.
10

Propiedades de bases de datos

Sin embargo, puede hacerlo de dos formas distintas, en funcin


del modo de servidor elegido para las conexiones.
Servidor Dedicado: en este modo, para cada conexin se crea
un proceso independiente en el servidor.
Servidor Compartido: en este modo, varios procesos de
usuario pueden compartir un nmero reducido de procesos del
servidor. Cada proceso de servidor puede, por lo tanto, atender
varios procesos de usuario.
Este modo de funcionamiento puede mejorar las prestaciones de
un servidor que atiende muchas solicitudes simultneas incluso
sin necesidad de ninguna ampliacin de hardware.
Una forma de decidirse por un modo de funcionamiento u
otro es pensar si las conexiones establecidas con el servidor estarn
continuamente intercambiando datos o puede producirse perodos de
espera.
Si se pueden producir perodos en que la conexin realmente no se
utiliza, puede ser conveniente utilizar el modo servidor compartido,
ya que en esos perodos, el servidor atender otras conexiones.

Copyright Computer Aided Education, S.A.

11

Propiedades de bases de datos

4. PARMETROS DE INICIALIZACIN

inalizamos este recorrido demostrativo de lo que es una base


de datos y una instancia de Oracle estudiando los parmetros
que se utilizan durante el proceso de inicializacin de la instancia en
el servidor.

La principal
ventaja de
utilizar un
archivo SPFILE
es que los
cambios efectuados durante
el funcionamiento de la
instancia quedan guardados
y se aplican
en posteriores
inicios de la
misma. Esto no
ocurre con un
archivo PFILE,
que es de slo
lectura durante el funcionamiento del
servidor.

Estos parmetros pueden venir proporcionados en un archivo


de texto que el administrador crea para congurar adecuadamente
el servicio de Oracle (archivo PFILE), o en formato binario, que el
administrador no puede editar directamente, pero s con herramientas
como Enterprise Manager (archivo SPFILE).
Para acceder al conjunto de parmetros de inicializacin, pulse
en el enlace Todos los Parmetros de Inicializacin de la pgina
principal de administracin de Enterprise Manager.

Utilizando los ltros que encontramos en la parte superior de


la pgina, podremos limitar la lista de parmetros a aquellos que nos
interesa consultar o modicar en un momento dado.
Por ejemplo, podramos consultar los parmetros de inicializacin
referentes a la memoria reservada para el rea SGA y para cada proceso
o PGA. Para ello, elegiramos la categora Memoria.
En la lista de parmetros disponemos de varias columnas de
informacin:
Nombre: nombre del parmetro, tal como aparece en el archivo
de inicializacin.
12

Propiedades de bases de datos

Ayuda: ayuda descriptiva del parmetro.


Valor: valor actual. Si aparece en un campo editable, quiere
decir que se puede cambiar dinmicamente; si no, quiere decir
que la instancia tiene que ser reiniciada para ello.
Comentarios
Tipo: tipo de datos del valor.
Bsico: representa un valor establecido durante la creacin de
la base de datos.
Modicado: si se ha modicado alguna vez desde la creacin
de la base de datos.
Dinmico: si puede cambiarse sin necesidad de reiniciar la
instancia.
Categora: categora en la que est clasicado el parmetro.

Por ejemplo, vemos que el parmetro sga_target tiene el valor


actual de 584 megabytes, que es la memoria reservada para el rea
SGA.
Vemos que se trata de un valor dinmico, es decir, que podramos
cambiar aqu y el efecto se aplicara inmediatamente, sin necesidad de
reiniciar la instancia.
En la pgina siguiente puede ver los parmetros NLS, que
establecen las caractersticas de globalizacin de la instancia.
Los ajustes nls_language y nls_territory determinan la mayora
de detalles que aplica el servidor o instancia cuando introducimos
valores de fecha, moneda, numricos, etc.
Copyright Computer Aided Education, S.A.

13

Propiedades de bases de datos

Vemos que la instancia tiene establecido nls_language y nls_


territory en valores adecuados para el idioma espaol y Espaa. Esto
quiere decir, entre otras cosas:
- Que las fechas se interpretarn como dd/mm/aaaa, es decir,
primero dos dgitos para el da, despus dos dgitos ms para el
mes y, nalmente, cuatro dgitos para el ao.
- Que el punto se tomar como separador de miles y la coma
como indicador de parte decimal en los valores numricos.
- El orden que se aplica en la clusula WHERE de las consultas
es adecuado para el idioma espaol.
Sin embargo, aunque estos dos parmetros permiten establecer
rpidamente toda esta conguracin, disponemos de todas esas
caractersticas, de forma independiente, como otros parmetros.
Por ejemplo, modicando el parmetro nls_date_format
podramos especicar un formato predeterminado con el que queremos
que se muestren e interpreten las fechas.
Tenga en cuenta que todos estos parmetros que se muestran aqu
son parmetros de la instancia de la base de datos. Las aplicaciones
que se conectan con la instancia pueden determinar otros parmetros,
conocidos como parmetros de sesin, y stos sern los que se
apliquen en dicha conexin.
Vemos, por lo tanto, que se dispone de tres conjuntos de
parmetros (indicados aqu de menor a mayor preferencia):

14

Parmetros de base de datos: los establecidos durante la

creacin de la base de datos.

Parmetros de instancia: los establecidos para la instancia


en particular.

Parmetros de sesin: establecidos para la conexin en

particular.

Propiedades de bases de datos

Como se ha comentado al principio, estos parmetros se


leen durante la inicializacin de la instancia y pueden modicarse
dinmicamente en algunos casos.
Sin embargo, cuando la instancia se cierra, los cambios se pierden
si no se han guardado en un archivo SPFILE.
Para que as sea, en lugar de cambiar el valor en la cha Actual
de esta pgina, deber hacerlo en la cha SPFile.
Cualquier valor que se modique en esta ltima cha ser
almacenado en el archivo SPFile, que Oracle busca durante la
inicializacin de la instancia.
SPFILE es un archivo binario, lo que quiere decir que no puede ser
editado directamente sino mediante esta cha de Enterprise Manager.
La ventaja de utilizar este tipo de archivo y no los archivos de texto
tradicionales, es que los cambios que se efecten durante el uso normal
de la base de datos se aplicarn en futuros reinicios de la instancia.
Si los cambios se efectan sobre parmetros dinmicos, no ser
necesario reiniciar la instancia; si son parmetros estticos, s que
deberemos hacerlo.

5. ASISTENTE DE CONFIGURACIN DE BASES DE DATOS

ale la pena, ahora que tenemos muchos ms conocimientos


sobre Oracle, volver a utilizar la herramienta Asistente de
Conguracin de Bases de Datos.
De esta forma, entenderemos que el asistente nos realiza preguntas,
durante la creacin de una base de datos, que afectan a todos estos
parmetros y que despus determinan cmo funcionar la instancia de
la base de datos.
As, el tipo o plantilla que deseamos utilizar para crear la base
de datos ya puede determinar algunas caractersticas que afectarn al
posterior funcionamiento de la instancia de base de datos.
Por ejemplo, los ajustes de inicializacin no son los mismos para
una base de datos especializada en operaciones transaccionales (OLTP)
que para tareas de anlisis (OLAP).
Copyright Computer Aided Education, S.A.

15

Propiedades de bases de datos

En otro paso indicaremos dnde queremos que se almacenen los


archivos de la base de datos. Ahora ya sabemos que hay de distintos
tipos, por lo que podramos indicar una ubicacin especca para
despus realizar fcilmente las copias de seguridad.
El rea de Recuperacin de Flash es el lugar predeterminado
para las copias de seguridad de la base de datos. En otro paso podramos
indicar dnde queremos que se almacenen los archivos redo log, as
como su tamao.
En el paso 10, que muestra la gura siguiente, podremos establecer
varios ajustes ahora que conocemos mejor la arquitectura de una base
de datos Oracle.

En el apartado Memoria podramos congurar los valores iniciales


para el rea SGA y PGA, as como si queremos que la administracin
de la memoria sea manual o automtica (recomendado).
En el apartado Tamao podremos establecer el tamao del bloque
o unidad mnima de asignacin de espacio en disco y el nmero mximo
de procesos de usuario que se pueden conectar simultneamente a la
base de datos.
En el apartado Juego de Caracteres podemos indicar si queremos
crear una base de datos Unicode, es decir, que toda la informacin
textual se almacene con el juego de caracteres AL32UTF8 o con un
juego de caracteres distinto.
16

Propiedades de bases de datos

Por defecto, se utiliza el juego de caracteres del sistema


operativo.

Cree bases de
datos Unicode
siempre que
pueda interactuar con
aplicaciones
de distintos
idiomas.

Es importante entender que si elegimos la segunda opcin, es


decir, AL32UTF8, toda la informacin se almacena en Unicode en la
base de datos, aunque no utilicemos un tipo de datos Unicode.
En este caso, los campos o variables de tipo CHAR, VARCHAR2
o CLOB guardaran el texto en Unicode, codicacin UTF-8.
En cualquier caso, la lista Juego de Caracteres Nacional hace
siempre referencia al formato utilizado para los tipos de datos que
empiezan por una N (national), como NCHAR, NVARCHAR2 o
NCLOB.
En una base de datos Oracle, podemos elegir entre UTF-8 y UTF16 para estos tipos de datos.

Vemos que aqu tambin podemos indicar el idioma y el formato de


fecha por defecto. Aunque ya conocemos que stas son caractersticas
que se establecen mediante los parmetros de inicializacin NLS.
Finalmente, en la cha Modo de Conexin indicaremos qu
modo de funcionamiento queremos aplicar para las conexiones con la
nueva base de datos: servidor dedicado o servidor compartido.
La experiencia es un grado muy importante para un administrador
de bases de datos.
Copyright Computer Aided Education, S.A.

17

Propiedades de bases de datos

Est claro que usted no puede (ni debe) retener toda esta
informacin. Sin embargo, ahora tiene los conocimientos necesarios
para acudir a las herramientas adecuadas y solicitar la informacin que
necesita en cada caso.

18

Esquemas
1. QU SON LOS ESQUEMAS?

ran parte de los objetos de una base de datos Oracle se crean


en un determinado esquema, que es su propietario. Esto
produce que para hacer referencia a dicho objeto, tengamos que hacer
referencia tambin al esquema en el que se ha creado.
En Oracle, existe una relacin uno a uno entre los usuarios de
la base de datos y los esquemas, por lo que en muchas ocasiones se
pueden utilizar indistintamente.
Teniendo en cuenta esto, el nombre de un objeto de base de datos
consta de dos partes separadas por puntos, donde indicamos el esquema
y el nombre del objeto: esquema.objeto.
No puede haber dos objetos con el mismo nombre en el mismo
esquema, pero s en esquemas distintos de la misma base de datos. Por
ejemplo, podra tener una tabla Clientes en el esquema A (A.Clientes)
y otra en el esquema B (B.Clientes).
En un esquema se guardan muchos tipos de objetos, como tablas,
vistas, ndices, etc.; pero tambin otros, como los procedimientos
almacenados, funciones, paquetes...
Cuando creamos objetos de estos tipos, se nos hace necesario
indicar en qu esquema se van a crear.
Durante el proceso de creacin de la base de datos, Oracle crea
sus propios esquemas para albergar aquellos objetos de carcter
administrativo. Por ejemplo, los objetos de diccionario de la base de
datos se almacenan en el esquema SYS, correspondiente a este mismo
usuario.
Aunque podramos utilizar esos esquemas, no es una buena
idea, ya que se han pensado exclusivamente para albergar objetos
administrativos.
Esto nos obliga a crear un esquema (usuario) en el que se albergarn
los objetos de nuestra base de datos.
El propietario del esquema o dicho usuario no tiene ningn
problema a la hora de acceder/modicar los objetos de su esquema
(aunque necesita privilegios para crearlos), ya que es su propietario.
Sin embargo, el resto de usuarios necesitan disponer de los
privilegios correspondientes para acceder y/o modicar la informacin
de los objetos de dicho esquema.
Copyright Computer Aided Education, S.A.

Esquemas

Adems, cuando se elimina un usuario, tambin se eliminan los


objetos que posee en su esquema, lo que puede representar un problema
si tenemos aplicaciones que les hacen referencia.
Sin embargo, normalmente esto no ocurre, ya que el esquema en
que se crean los objetos no se crea para que pueda conectarse con el
servidor, sino simplemente como contenedor de los objetos de la base
de datos, por lo que no es frecuente eliminarlo.

2. EL ESQUEMA ACTUAL

n la mayora de ocasiones hemos utilizado el nombre de los


objetos, como tablas, vistas, procedimientos almacenados,
etc. sin necesidad de indicar su esquema. Y esto ha funcionado.
Por qu? Porque habamos accedido como el usuario propietario
de dicho esquema. En nuestro caso, como el usuario TIENDA.
Sin embargo, observe lo que ocurre cuando consultamos la base
de datos con la identidad de un usuario distinto.

Como estamos utilizando el usuario SYSMAN para realizar la


consulta, Oracle busca un objeto llamado Clientes en su esquema
(SYSMAN) y no lo encuentra.
Para solucionar este problema, deberemos incluir el esquema en
la tabla Clientes: TIENDA.Clientes.
2

Esquemas

Tenga en
cuenta que no
slo es necesario incluir
el esquema
si se accede
a un objeto
que est en
un esquema
distinto al del
usuario actual,
sino tambin
se necesitar
disponer de
los privilegios
de acceso
oportunos.

Ahora s que se ha podido llevar a cabo. Aunque es conveniente


incluir siempre el esquema en los objetos, esto puede ser costoso en
trminos de codicacin de una aplicacin.
Disponemos de algunas formas de evitar esta codicacin:
Con el comando ALTER SESSION SET CURRENT_
SCHEMA.
Por ejemplo, con
ALTER SESSION SET CURRENT_SCHEMA = TIENDA;
indicamos que, hasta que no se diga lo contrario, queremos hacer
referencia a objetos del esquema especicado, que en este caso es
TIENDA.
Creando sinnimos.
Por ejemplo, podramos crear el sinnimo Clientes para el objeto
TIENDA.Clientes. Los sinnimos son otro tipo de objetos que se
almacenan en los esquemas.

Copyright Computer Aided Education, S.A.

Esquemas

A la hora de crear cualquier objeto, tambin podremos especicar


el esquema en el que se crea, pero si no se hace, se utiliza el esquema
del usuario que lo est creando.

3. PROTEGER OBJETOS CON ESQUEMAS

a mayora de los esquemas que encontramos en una base de


datos se corresponden con los usuarios que necesitan acceder
a la misma.
Sin embargo, existe otro tipo de esquema, que aunque crendose
exactamente igual, es decir, creando su correspondiente usuario, no
tienen este propsito.
Por ejemplo, las tablas, vistas, ndices, etc. que hemos ido creando
lo hemos hecho en el esquema TIENDA. Pero, esperamos utilizar este
usuario para acceder a dicha informacin?
Si no es as y para lo nico que hemos creado este usuario es para
albergar los objetos en su esquema, debemos evitar que nadie pueda
utilizarlo para establecer conexin con la base de datos.
En este caso, el esquema se conoce como un esquema nico
porque slo sirve para albergar objetos.
Para crear un esquema nico, debe eliminar el privilegio de
establecer conexin con la base de datos para el usuario en cuestin.
Esto se consigue eliminando el role CONNECT, que se establece por
defecto.
Tambin debera comprobar si se dispone del privilegio CREATE
SESSION, que es el que se consigue con dicho role.
Qu estamos haciendo al eliminar este privilegio? Pues conseguir
que ningn usuario pueda utilizar la identidad del usuario TIENDA
para ello.
De esta forma, no tiene demasiado sentido eliminar este usuario
(y todos los objetos de su esquema), ya que no es un usuario como los
dems.

Esquemas

Esto representa un nivel ms de seguridad para nuestra aplicacin,


ya que el usuario TIENDA slo tendr el propsito de albergar en su
esquema los objetos de la aplicacin.
La aplicacin con la que accedern los usuarios a los objetos del
esquema TIENDA podra efectuar la operacin ALTER SESSION
SET CURRENT_SCHEMA para ello.
Otra forma distinta de proteger los objetos con esquemas es
creando lo que se conoce como un esquema compartido.
La idea es que los distintos usuarios que acceden a los objetos de
la aplicacin lo hagan utilizando todos el mismo esquema, que coincide
con el esquema en el que se han creado esos objetos.
En este caso, dichos usuarios no tienen un usuario de la base
de datos, sino ms bien del sistema operativo o sistema de seguridad
externo a Oracle.
Esos usuarios externos utilizan un nico esquema (el esquema
compartido) en la base de datos.
Si desea ms informacin al respecto, acceda a la gua Oracle
Database Advanced Security Administrators Guide, disponible a
travs de la Web de Oracle.
4. ELIMINAR ESQUEMAS

i nalmente desea eliminar un usuario/esquema, el proceso


es muy sencillo siempre que dicho esquema no posea objetos
como tablas, vistas, procedimientos almacenados, etc.

Copyright Computer Aided Education, S.A.

Esquemas

Si es as, tenga en cuenta que dichos objetos tambin sern


eliminados.
Y qu ocurre si existe algn objeto, en un esquema distinto al
que vamos a eliminar, que hace referencia a alguna de estas tablas o a
otros objetos de dicho esquema?
Podemos hacer que, al eliminar un usuario/esquema, se eliminen
tambin en cascada las referencias a dichos objetos.
Por ello, antes de hacerlo es importante cerciorarse de si existen
objetos con estas caractersticas. Para ello, edite el objeto en particular
(por ejemplo, una tabla), despliegue la lista de acciones y elija Mostrar
Dependencias. Obsrvelo para la tabla Clientes.

En la cha Dependencias vemos de qu objetos depende la tabla


Clientes y en la cha Dependientes, qu objetos dependen de dicha
tabla.
Si utilizamos la opcin CASCADE al eliminar un usuario/
esquema, estaremos eliminando todos los objetos del esquema y todas
las referencias a ellos en otros esquemas. Esto se advierte al eliminar
un usuario.
6

Esquemas

El esquema de un objeto establece parte de su nombre completo,


por lo que tenemos que tenerlo en cuenta siempre que deseemos hacer
referencia a l.
Si el contexto en el que se ejecuta una consulta, una funcin,
procedimiento almacenado, etc. coincide con el esquema del objeto,
realmente no har falta indicar el nombre del esquema, aunque tampoco
estar de ms para que no se produzca ninguna ambigedad.

Copyright Computer Aided Education, S.A.

Seguridad (I)
1. AUTENTICACIN

na de las tareas fundamentales de todo administrador de bases


de datos es establecer los medios necesarios para cumplir los
requerimientos de seguridad en el acceso a los datos.
En Oracle, como en la mayora de sistemas de bases de datos, esta
seguridad se basa en la gura del usuario. El usuario es una entidad
que puede acceder a los objetos de la base de datos en funcin de su
identidad.
Encontramos, por lo tanto, dos necesidades fundamentales para
mantener la seguridad utilizando usuarios:
- cmo identicarlos y
- cmo establecer los privilegios que necesitan.
Para cubrir la necesidad de identicar a los usuarios, se utiliza la
autenticacin. El usuario tiene que tener algn mtodo de demostrar
que es quien dice que es y ste es la autenticacin.
Tras autenticar al usuario, el servidor conoce quin es y, por
lo tanto, sabe lo que est autorizado a hacer. Aqu entra en juego el
segundo concepto fundamental: la autorizacin, que se basa en la
asignacin de permisos o privilegios.
El primer paso, por lo tanto, es la autenticacin del usuario. En
Oracle disponemos de distintas alternativas para ello.
La autenticacin propia de la base de datos se basa en que todo
usuario que quiera conectarse con el servidor, tiene que tener un usuario
en la base de datos protegido por su correspondiente contrasea.
El par nombre de usuario / contrasea son las credenciales que
se utilizan en este tipo de autenticacin. En la gura siguiente vemos
que el nombre de usuario es SYS y la contrasea es password.

Copyright Computer Aided Education, S.A.

Seguridad (I)

Aunque esta forma de autenticacin es sencilla y la ms utilizada,


puede que en aplicaciones corporativas no sea la ms adecuada.
Oracle permite que sea un sistema de seguridad externo a la base
de datos el que realice la autenticacin. Oracle confa en dicho sistema
para la autenticacin cuando se elige este modo.
Teniendo en cuenta esto, el primer sistema que podemos pensar
que se podra utilizar es el propio sistema operativo. Bien, podremos
utilizar la infraestructura de usuarios de Windows para ello. Obsrvelo
a continuacin.

Fjese en lo que est ocurriendo en la segunda forma de conectarse.


Como no indicamos el nombre ni la contrasea del usuario, Oracle
entiende que se trata de un usuario con autenticacin externa.
En este caso, es un usuario de Windows. Por lo tanto, si dicho
usuario ha sido autenticado por Windows, se supone que es correcto
para la base de datos.
Al utilizar la autenticacin del sistema operativo, Oracle comprueba
si el usuario de Windows que estamos utilizando tiene el derecho de
conectarse al servidor. Si es as, accede; si no es as, es rechazado.
Esto tiene la ventaja clara de que coincide el usuario de Windows
que se utiliza normalmente con el usuario de la base de datos, pero
tambin tiene el requerimiento de que la infraestructura de seguridad
de Windows tiene que ser la apropiada.
Claro est que no todos los usuarios de Windows deben poder
acceder a la base de datos, por lo que no nos evitamos el tener que
crear usuarios de base de datos asociados con los del sistema
operativo, pero Oracle no se encargar de almacenar ni gestionar sus
contraseas.
2

Seguridad (I)

Qu quiere decir todo esto? Que tenemos un usuario en la base de


datos que tiene el mismo nombre que nuestro usuario de Windows?
Pues en la mayora de los casos, sa es la respuesta correcta:
crearemos usuarios de la base de datos, pero indicando que su
autenticacin la lleva a cabo el sistema operativo o cualquier otro
sistema de seguridad apropiado.
Sin embargo, los usuarios del grupo de Windows ora_dba tienen
el privilegio de acceder como administradores de la base de datos por
s, sin necesidad de haber creado el correspondiente usuario de la base
de datos.

Puede agregar los usuarios que tengan que actuar como


administradores de las bases de datos en el grupo de Windows ora_
dba. Aunque tenga en cuenta lo que est haciendo, ya que reciben
todos los privilegios sobre las bases de datos.
En resumen, vemos que Oracle proporciona mtodos de
autenticacin para que los usuarios puedan indicar quines son: bien
mediante un nombre de usuario y contrasea o bien mediante la
autenticacin llevada a cabo por el propio sistema operativo o cualquier
otro sistema de seguridad externo a la base de datos.

Copyright Computer Aided Education, S.A.

Seguridad (I)

2. CREAR USUARIOS

hora que conocemos los mtodos de autenticacin existentes


en Oracle, veamos cmo se estableceran al crear los usuarios.
Podremos tener ambos tipos de usuarios en nuestra base de datos.
Para ello, utilizaremos Enterprise Manager Database Control,
accediendo al enlace Usuarios de la pgina de administracin.
Para utilizar
el modo de
autenticacin
Global, se
necesita Oracle Enterprise
Edition con la
opcin Oracle Advanced
Security.

Pulse en el botn Crear y establezca los detalles del usuario, entre


los que encontrar el tipo de autenticacin del mismo. Podemos elegir
entre:
- Por contrasea.
- Externo, es decir, mediante el sistema operativo.
- Global, que es un modo de autenticacin en el que se utilizan
servicios de la red, como autenticacin SSL, realizada por servicios
de directorio, certicados digitales, RADIUS, etc.
Si elige Externo, no necesitar introducir la contrasea porque
Oracle no se encarga de guardarla ni de administrarla, sino que es tarea
del sistema operativo.
Sin embargo, s que necesitamos crear el usuario con el mismo
nombre que el correspondiente usuario de Windows.
El nombre del usuario autenticado externamente tiene que
coincidir exactamente con el nombre del usuario de Windows. Esto
incluye la combinacin de maysculas y minsculas con la que se cre
en Windows.
Adems, en funcin del sistema operativo Windows que se
utilice, puede ser necesario especicar tambin el nombre del equipo o
dominio al que pertenece el usuario.
El Windows XP esto es necesario, por lo que si tenemos un usuario
de Windows de nombre Vicente, el nombre completo del usuario de
base de datos ser: SERVIDORBD\Vicente, donde SERVIDORBD
es el nombre del equipo.
Para poder especicar usuarios de Windows pertenecientes a
equipos distintos al del servidor, es decir, usuarios remotos,
es necesario que el parmetro de conguracin de la base de
datos REMOTE_OS_AUTHENT tenga el valor TRUE.

Seguridad (I)

Bien, ste sera el nombre correcto del usuario que ser autenticado
por Windows para acceder a la base de datos. Sin embargo, existe un
parmetro en la conguracin de la base de datos que permite identicar
estos usuarios.
Puede eliminar
el prefijo que
identifica a los
usuarios del
sistema operativo, pero no
es conveniente
hacerlo excepto cuando slo
utilice autenticacin externa.

El parmetro de inicializacin os_authent_prex establece un


prejo que debemos incluir en el nombre de todo usuario autenticado
por el sistema operativo para diferenciarlos de los otros usuarios.
Por qu se aplica este prejo? Pues porque podra darse el caso de
que creramos un usuario con el mismo nombre que uno de Windows,
pero con autenticacin mediante contrasea.
Como lo primero que se comprueba es la autenticacin del sistema
operativo, podra ocurrir que el usuario fuera autenticado externamente
cuando debera haber sido autenticado solicitando su contrasea.
Aplicando este prejo en el usuario de Oracle, ste reconoce
inmediatamente que se trata de un usuario autenticado por Windows.
Por defecto, el prejo es OPS$.
Por lo tanto, el nombre del usuario de la base de datos que dispone
de autenticacin del sistema operativo debera ser:
OPS$SERVIDORBD\Vicente
Ahora slo nos quedara completar los detalles del usuario, como
el perl que se le aplicar, qu tablespace utilizar por defecto para
crear sus objetos de esquema y como temporal durante la ejecucin de
las consultas SQL, de qu permisos o privilegios dispondr, etc.

Copyright Computer Aided Education, S.A.

Seguridad (I)

En el caso de crear un usuario autenticado por la propia base de


datos, lo ms importante es establecer su contrasea.

Oracle almacenar encriptadas las contraseas de los usuarios


como parte de las tablas del diccionario de la base de datos.
Adems, tendremos que establecer algn mtodo para gestionar
estas contraseas, como establecer algunos requerimientos de
complejidad, de caducidad, etc.
Todo esto no es necesario en una cuenta de usuario autenticada
externamente, ya que es Windows el que establece la poltica de
seguridad de las contraseas.

3. PERFILES

n una base de datos en el que el nmero de usuarios es


realmente grande y acceden simultneamente muchos de
ellos, las prestaciones del servidor pueden llegar a degradarse y, por lo
tanto, la experiencia o respuesta que recibe el usuario.
Oracle permite utilizar el concepto de perl para limitar el uso
de los recursos del servidor, como tiempo de CPU, tiempo de sesin,
tiempo de inactividad, etc.
Esto complementa el establecimiento de cuotas de disco en los
tablespaces.
6

Seguridad (I)

Adems, tambin se puede utilizar los perles para establecer los


requerimientos de complejidad y caducidad de las contraseas.
Esto ltimo no se aplicar a aquellos usuarios de cuya autenticacin
se encarga el sistema operativo.
Al crear un usuario, hemos visto que entre sus detalles podamos
indicar qu perl se le aplica. Veamos pues, las caractersticas de los
perles. Para ello, utilice el enlace a Perles de la pgina principal de
administracin.

Por defecto, todos los usuarios se crean con el perl DEFAULT,


que en resumen no limita la actividad del usuario de ninguna manera.

Si desea aplicar los mismos


lmites a todos
los usuarios,
hgalo en
el perfil
DEFAULT.

Una posibilidad podra ser editar este perl con los lmites que
necesitemos, pero tambin podemos crear nuevos perles y aplicarlos
a los usuarios adecuados.
Por ejemplo, es lgico pensar que no todos los usuarios deberan
poder consumir los mismo recursos del servidor. As, podramos crear
perles para administradores, directivos, programadores, usuarios
nales, etc.
Cada uno de estos perles dispondra de la composicin de lmites
o de la poltica adecuada de contraseas.

Copyright Computer Aided Education, S.A.

Seguridad (I)

A continuacin se describen los detalles de un perl. En la cha


General podremos establecer los lmites en cuanto a los recursos del
servidor: CPU, tiempo de conexin, bloques de datos que se pueden
obtener en cada sesin, etc.

La verdad es que establecer estos lmites no es tarea sencilla y


suele venir precedido de un estudio del uso actual del servidor.
Los perles, sin embargo, s que suelen utilizarse para establecer
la poltica de contraseas de la base de datos. Esto se realiza en la cha
Contrasea.

Aqu disponemos de varios ajustes sobre las contraseas de los


usuarios de la base de datos:
Podemos indicar la vigencia de la contrasea en el campo
Vence en (das).
Opcionalmente, se puede especicar un "perodo de gracia"
despus de haber caducado la contrasea en el campo Bloquear
(das despus del vencimiento).
8

Seguridad (I)

El perodo de gracia empieza una vez la vigencia de la contrasea


ha caducado. Durante dicho perodo, el usuario recibe un mensaje
para que cambie la contrasea; si no lo hace durante el perodo de
gracia, la cuenta queda bloqueada.
En estos detalles, utilizar la palabra UNLIMITED indica que no
hay ninguna restriccin al respecto, es decir, que la contrasea no
caduca y que el perodo de gracia es ilimitado.
Podemos indicar cuntos cambios de contrasea se tienen
que efectuar para poder utilizar una contrasea anteriormente
utilizada. Esto se establece en el campo Nmero de Contraseas
a Mantener.
De esta forma, se evita que los usuarios tengan un juego
reducido de contraseas y las vayan intercambiando cuando as
lo reclama Oracle.
En el campo Nmero de das a mantener podemos requerir
lo mismo pero en cuanto a das entre el uso de una contrasea
y otra. Por ejemplo, podramos permitir que el usuario volviera
a utilizar una contrasea antigua si ha pasado ms de 90 das
desde que fue cambiada.
En estos detalles, la palabra UNLIMITED no restringe el historial
de contraseas, por lo que podran volver a reutilizarse sin ningn
problema.
Cuando ambos campos tienen un valor distinto a UNLIMITED,
entonces se podr volver a utilizar una contrasea antigua si ambas
condiciones son satisfechas.
En el campo Funcin de complejidad podremos introducir
una funcin que describe los requerimientos en cuanto a la
contrasea en s, como longitud, caracteres admitidos, etc.
Oracle proporciona la funcin de complejidad DEFAULT, que
establece los siguientes requerimientos para las contraseas:
- La contrasea es de al menos 4 caracteres de longitud.
- Es diferente al nombre de usuario.
Puede crear su propia funcin de complejidad para adaptarla a los
requerimientos de seguridad de su instalacin.

Copyright Computer Aided Education, S.A.

Seguridad (I)

Si establecemos a NULL la funcin de complejidad, no se


establecer ningn requerimiento de este tipo.
En Nmero de Intentos de Conexin Fallida indicaremos
cuntas veces puede intentar introducir su contrasea un usuario
sin que la cuenta quede bloqueada.
En Nmero de Das de Bloqueo estableceremos el perodo en
que una cuenta queda bloqueada por esta ltima circunstancia.
Si el valor es UNLIMITED, la cuenta queda bloqueada hasta que
un administrador la desbloquee, para lo que tendr que editar el
usuario. Encontrar la opcin de bloquear o desbloquear dicha
cuenta en la cha General.
Adems, en dicha cha tambin puede cambiar su contrasea, por
ejemplo, cuando el usuario la ha olvidado.
Recuerde que la poltica que se establece para las contraseas a
travs de los perles slo se aplica para los usuarios cuya autenticacin
no es externa, sino a travs de la contrasea almacenada en la base de
datos.

4. PRIVILEGIOS DEL SISTEMA

na vez un usuario se ha autenticado con el servidor y ste


le ha dado acceso a la base de datos, dicho usuario puede
realizar ms o menos tareas en funcin de los privilegios que tenga.
En este momento es cuando entra en juego el concepto de
autorizacin, que se basa en la asignacin y revocacin de permisos
o privilegios.
En Oracle podemos encontrar dos tipos de privilegios: privilegios
del sistema y privilegios sobre los objetos de esquema.
Empecemos estudiando los privilegios del sistema, que no hacen
referencia a objetos particulares de la base de datos, sino a tareas o
acciones que afectan a todo un tipo de objetos, como crear tablespaces
o eliminar registros de cualquier tabla de la base de datos.

10

Seguridad (I)

Normalmente este tipo de privilegios slo son asignados a


aquellos usuarios que tienen que realizar labores administrativas o tal
vez tambin a los programadores de aplicaciones, pero no tiene sentido
asignarlos a los usuarios normales de la base de datos.
Para asignar este tipo de privilegios, acudir a los detalles del
usuario y acceder a la cha Privilegios del Sistema.
Por defecto, los usuarios se crean sin ningn privilegio de este
tipo, ya que son derechos pensados para los administradores, como
puede ver entre los detalles del usuario SYS.

En cualquier caso, podr editar dicha lista para cualquier usuario,


tanto con el objetivo de asignar alguno de estos privilegios como de
revocarlo.
En la columna Opcin Admin de la lista de privilegios del
sistema indicaremos si el usuario podr otorgar ese privilegio a otros
usuarios (casilla activada) o slo podr disfrutarlo l mismo (casilla
desactivada).
A nivel de comandos, podremos utilizar el comando
GRANT privilegio TO usuario [WITH ADMIN]
para asignar privilegios de este tipo y
REVOKE privilegio FROM usuario
para eliminarlo del usuario.
En la prxima leccin veremos cmo establecer los privilegios o
permisos para el acceso y modicacin de los objetos de un esquema,
como sus tablas, vistas, procedimientos almacenados, etc.

Copyright Computer Aided Education, S.A.

11

Seguridad (I)

stos son los privilegios del sistema ms utilizados:

ALTER DATABASE, ALTER SYSTEM

CREATE ANY INDEX: permite crear ndices en cualquier


esquema.

ALTER ANY INDEX: permite modicar ndices en cualquier


esquema.

DROP ANY INDEX: permite eliminar ndices de cualquier

CREATE PROCEDURE: permite crear procedimientos


almacenados en el esquema propio del usuario.

esquema.

CREATE ANY PROCEDURE: permite crear procedimientos


almacenados en cualquier esquema.
ALTER ANY PROCEDURE: permite modicar y recompilar
procedimientos de cualquier esquema.
DROPANY PROCEDURE: permite eliminar procedimientos
de cualquier esquema.

EXECUTE ANY PROCEDURE:


procedimientos de cualquier esquema.

permite

ejecutar

CREATE PROFILE, ALTER PROFILE y DROP PROFILE:


para crear, modicar y eliminar perles.

CREATE ROLE, ALTER ANY ROLE, DROP ANY ROLE


y GRANT ANY ROLE: para crear, modicar, eliminar y
asignar roles.

CREATE SEQUENCE, CREATE ANY SEQUENCE,


ALTER ANY SEQUENCE, DROP ANY SEQUENCE,
SELECT ANY SEQUENCE: para crear (en el propio
esquema o en cualquiera), modicar, eliminar y seleccionar
valores de las secuencias.

CREATE SESSION: permite establecer sesin con la base

ALTER SESSION: permite cambiar ajustes de la sesin.

CREATE TABLE, CREATE ANY TABLE, ALTER ANY


TABLE y DROP ANY TABLE: para crear (en el mismo

de datos. Es el privilegio disponible a travs del rol CONNECT.

esquema o en cualquiera), modicar y eliminar tablas.

SELECT ANY TABLE, INSERT ANY TABLE, UPDATE


ANY TABLE y DELETE ANY TABLE: permiten seleccionar,
insertar, actualizar y eliminar registros de cualquier tabla.

Fjese que los privilegios que incluyen la palabra ANY hacen


referencia a la posibilidad de realizar la accin en cualquier
esquema de la base de datos.
12

Seguridad (II)
1. PRIVILEGIOS DE OBJETO

diferencia de los privilegios del sistema, que tienen un


carcter ms general sobre el sistema en s o sobre un
determinado tipo de objeto, los privilegios de objeto establecen el
acceso y manipulacin de objetos particulares de la base de datos.
Por defecto, todos los usuarios tienen el privilegio de consultar,
modicar o utilizar todos los objetos almacenados en su esquema. Esto
no quiere decir que puedan crearlos o editar sus caractersticas, pero s
utilizarlos.
Sin embargo, cuando un usuario desea utilizar o acceder a un
objeto de un esquema distinto, debe tener asignado dicho privilegio de
forma expresa o a travs de un role, como despus veremos.
En Oracle se pueden asignar/revocar privilegios sobre objetos,
como tablas, procedimientos almacenados, etc., desde dos puntos de
vista:
- Editando las caractersticas del usuario y estableciendo los
privilegios de objeto que necesita.
- Editando las caractersticas del objeto e indicando qu usuarios
pueden acceder a l y de qu modo.
Si lo hacemos desde el usuario, deberemos editarlo y acceder a la
cha Privilegios de Objeto.

Copyright Computer Aided Education, S.A.

Seguridad (II)

En esta cha podremos establecer los privilegios sobre los objetos


a los que necesite acceder el usuario. Podremos indicar exactamente
qu es lo que puede hacer sobre dichos objetos.
Para ello, lo primero es indicar el tipo en la lista Seleccionar Tipo
de Objeto y pulsar en el botn Agregar.
Por ejemplo, si elegimos el tipo Tabla, podremos aplicar
privilegios de forma individual para cada tabla o hacerlo sobre un
grupo de tablas.
En la gura siguiente se est aplicando el privilegio SELECT, es
decir, poder acceder a los datos de las tablas.

stos son los privilegios que se pueden establecer para las


tablas:

SELECT: permite leer el contenido de la tabla.

INSERT, UPDATE y DELETE: permite agregar, actualizar


y eliminar registros de la tabla.

ALTER: permite modicar la denicin de la tabla.

INDEX: permite crear ndices en la tabla.

REFERENCES: permite que se pueda hacer referencia a la


tabla en la denicin de otra como una clave externa.

Si el permiso se asigna con la opcin Otorgar, entonces el usuario


podr asignar ese mismo permiso a otros usuarios.

Seguridad (II)

A nivel de comandos, podra utilizar:

Si desea que
todos los usuarios tengan un
determinado
privilegio, puede aplicarlo en
un nico paso
si lo asigna al
usuario especial PUBLIC.

GRANT privilegios separados por comas TO usuario


[WITH GRANT OPTION]

y para eliminar o revocar los permisos:

REVOKE privilegios separados por comas FROM usuario

Es interesante comentar que podremos especicar privilegios


sobre columnas de tablas y vistas, sin necesidad de hacerlo sobre toda
la tabla o vista.
As, puede darse el caso de que un usuario no deba poder
actualizar el precio de un producto y s el resto de los campos de la
tabla Productos.
Veamos ahora cmo asignaramos privilegios desde el punto de vista
del objeto sobre el que queremos hacerlo. Para ello, seleccionaremos el
objeto en cuestin y en la lista de acciones elegiremos Privilegios de
Objeto. Finalmente, tenemos que pulsar en el botn Ir.
De esta forma se accede a una nueva pgina donde podemos
indicar qu usuarios y en qu condiciones accedern al objeto. En
la gura siguiente puede ver que se concede el permiso de ejecutar
(EXECUTE) el procedimiento almacenado uspNuevoProducto al
usuario Vicente_sql.

El proceso es el mismo que hemos visto al editar el usuario, pero


al revs.
El nico privilegio que podemos especicar sobre un procedimiento
es EXECUTE, que permite ejecutarlo.
Copyright Computer Aided Education, S.A.

Seguridad (II)

En la parte inferior de la pgina encontramos la opcin de


especicar si este usuario podr asignar u otorgar tambin el mismo
permiso a otros usuarios.
Fjese que, de esta forma, el usuario Vicente_sql podr crear nuevos
productos en la base de datos sin disponer del permiso INSERT en la
tabla Productos, siempre que lo haga a travs de este procedimiento
almacenado.
En funcin de lo que sea ms cmodo en cada ocasin, podr
establecer los privilegios desde el usuario o desde el objeto.

2. EJECUCIN DE PROCEDIMIENTOS

n el apartado anterior se ha mencionado que el usuario


Vicente_sql podra utilizar el procedimiento almacenado
uspNuevoProducto para crear registros en la tabla Productos sin
necesidad de tener este privilegio directo en la tabla.
sta es una de las principales utilidades de los procedimientos
almacenados, pero debemos matizar un poco esto, ya que puede que
no siempre sea as.
Cuando creamos un procedimiento almacenado o una funcin,
tenemos la oportunidad de indicar en el contexto de qu usuario se
ejecutar.
Por defecto, el procedimiento se ejecuta con la identidad del
usuario que lo ha creado, por lo que dicho usuario deber tener los
privilegios necesarios sobre los objetos que se manipulan en el interior
del procedimiento.
Los procedimientos de este tipo se ejecutan con los derechos del
que los dene (deners rights).
De esta forma, cualquier otro usuario puede ejecutar el
procedimiento sin ninguna comprobacin adicional, ya que lo ejecuta
con la identidad del usuario que lo ha denido.
Aunque sta es la forma habitual de crear procedimientos
almacenados, existe otra posibilidad, que es indicar que el procedimiento
se ejecutar en el contexto o con la identidad del usuario que lo ha
llamado (invokers rights).
4

Seguridad (II)

Qu signica esto? Pues que durante la ejecucin se comprueban


los privilegios del usuario que ejecuta el procedimiento, por lo que ste
tambin tiene que tener los privilegios necesarios sobre los objetos que
no pertenecen al esquema del usuario que cre el procedimiento.
Adems, cualquier referencia a un objeto en la que no se incluya
su esquema, se interpreta como perteneciente al esquema del usuario
que est ejecutando el procedimiento, por lo que tiene que tener los
privilegios necesarios para acceder a dichos objetos.
Esto permite que un mismo procedimiento almacenado sirva
para manipular objetos con el mismo nombre, pero en esquemas
diferentes.
Para crear un procedimiento que se ejecute con la identidad del
usuario que lo ha invocado, debe escribir AUTHID CURRENT_USER
antes de la palabra IS o AS en la cabecera del procedimiento.

3. ROLES

unque asignar privilegios del sistema y/o de objetos a usuarios


no es complicado, es cierto que si el nmero de usuarios de
su instalacin es elevado, seguramente desear disponer de una forma
ms cmoda de hacerlo.
En ayuda del administrador, Oracle incorpora el concepto de role,
que no es ms que un grupo de privilegios que se almacenan con un
determinado nombre para poder asignarlo a los usuarios sin necesidad
de tener que hacerlo de forma individual.
En un role podemos incluir tanto privilegios del sistema como de
objetos particulares de la base de datos. Los usuarios reciben todo ese
conjunto de privilegios simplemente asignndoles el role.
Un role puede ser asignado a otro role, congurando todo una
composicin de privilegios que nalmente recibe el usuario.
Para crear roles, utilice el enlace Roles de la pgina principal de
administracin de Enterprise Manager.
Es interesante que se d cuenta de que los roles no son objetos
que se almacenan en un determinado esquema, sino que forman parte
de la misma base de datos. Esto quiere decir, que los roles no se ven
afectados si el usuario que los cre es eliminado ms tarde.
Copyright Computer Aided Education, S.A.

Seguridad (II)

El nombre de un role debe hacer referencia a qu operaciones


podr realizar. En el ejemplo anterior crearemos un role para manejar
todo aquello que se necesita para crear rdenes.
En la lista Autenticacin podremos proteger el acceso al role con
una contrasea, que lo haga el propio sistema operativo o cualquier
otro mtodo disponible en la red. Por defecto, no se aplica ningn tipo
de autenticacin.
En la cha Roles encontraremos los roles asignados a este rol.
Como le he comentado anteriormente, los roles pueden ser asignados
a usuarios pero tambin a otros roles, constituyendo estructuras de
composicin de privilegios.
Y en las chas Privilegios del Sistema y Privilegios de Objeto

estableceremos los privilegios directos de los que dispondr el role.


Es importante que los privilegios que asignamos a un role tengan
relacin. De esta forma, ser mucho ms sencillo y til asignar dicho
role ms tarde.
Tenga en cuenta que debe establecer siempre la asignacin de
privilegios mnima para cada usuario, de forma que pueda realizar sus
tareas, pero que no tenga ms privilegios que los que necesita.
Si agrupa privilegios sin mucha relacin en un role, esto ser ms
difcil.

Seguridad (II)

Otra forma
de asignar y
revocar roles
es utilizar los
comandos
GRANT y
REVOKE, respectivamente.

Una vez creado el role, podremos asignarlo a los usuarios (u otros


roles) que vayan a realizar la tarea de introducir nuevas rdenes. Para
ello, editaremos dichos usuarios/roles y asignaremos el role en la cha
Roles.
Por defecto, los usuarios se crean con el role CONNECT, que
es el role que se asigna a todos los usuarios durante su creacin. El
nico privilegio que proporciona este role es la posibilidad de crear
una sesin en la base de datos (CREATE SESSION).

De esta forma, un usuario dispone de los siguientes privilegios:


Privilegios sobre todos los objetos de su esquema.
Privilegios concedidos directamente al usuario.
Privilegios concedidos mediante la asignacin de roles.
Privilegios concedidos al usuario especial PUBLIC.
La suma de todos estos privilegios determina qu tareas est
autorizado a realizar.
Adems, los roles que se establecen como roles por defecto se
asignan automticamente cuando el usuario inicia la sesin en la base de
datos, sin necesidad de habilitarlos ni de introducir la correspondiente
contrasea si estn protegidos con este tipo de autenticacin.
Es conveniente utilizar roles para facilitar la asignacin de
privilegios en lugar de hacerlo de forma individual. Sobre todo si
disponemos de muchos usuarios que debern acceder a la base de datos
en las mismas condiciones.
Ventajas de utilizar roles:
Reduce la administracin de privilegios: podemos asignar
todo un conjunto de privilegios a un grupo de usuarios de la
base de datos simplemente asignndoles un role.
Si ms tarde queremos cambiar el conjunto de privilegios,
simplemente lo haremos en el role y no en las propiedades
de cada uno de esos usuarios.

Copyright Computer Aided Education, S.A.

Seguridad (II)

Se puede habilitar y deshabilitar los roles a lo largo del


tiempo para que los usuarios dispongan de los privilegios
que realmente necesitan en cada momento.
Los roles pueden protegerse con contrasea, por lo que slo
podrn habilitarlos los usuarios que la conozcan.

4. ROLES DE APLICACIN

os programadores de aplicaciones de bases de datos suelen


crear usuarios con privilegios especcos para utilizar su
identidad en el acceso a la base de datos Oracle desde su aplicacin.
Normalmente, ese usuario necesita acceder a la informacin de las
tablas (privilegio SELECT), as como modicar, eliminar o insertar
nuevos registros (privilegios UPDATE, DELETE e INSERT).
En otras ocasiones, el usuario debe ejecutar procedimientos
almacenados.
Por todo ello, es habitual encontrarse con que los programadores
han otorgado ms privilegios a ese usuario de lo que realmente se
necesita para ejecutar normalmente la aplicacin.
Para evitar esta mala costumbre, la aplicacin podra prepararse
de forma que asumiera los privilegios de un determinado role creado
expresamente para ello, conocido como role de aplicacin.
De esta forma, el usuario que utiliza la aplicacin es un usuario con
unos privilegios mnimos antes de iniciar la aplicacin (seguramente
slo con el role CONNECT habilitado) y la aplicacin habilita
uno u otro role en funcin de lo que necesita realizar en uno u otro
momento.
Para que slo se pueda habilitar el role desde la aplicacin, ste
puede ser protegido por una contrasea que queda embebida en el
cdigo de dicha aplicacin o almacenada en una base de datos que se
consulta en tiempo de ejecucin.
Para habilitar un role y deshabilitar cualquier otro role del usuario,
se utiliza la instruccin PL/SQL:
DBMS_SESSION.SET ROLE(nombre del role);
8

Seguridad (II)

Por ejemplo, la aplicacin podra ejecutar:


DBMS_SESSION.SET ROLE('IntroducirOrdenes');
No se pueden habilitar roles en el interior de un procedimiento
almacenado que se ejecute con los privilegios del usuario que
lo ha creado (deners rights) pero s en aquellos en los que se
ha utilizado la clusula AUTHID CURRENT_USER, es decir,
en aquellos procedimientos que se ejecutan en el contexto de
seguridad del usuario que ha invocado el procedimiento.

De esta forma, el usuario que utiliza normalmente la aplicacin


en su trabajo diario no tiene por qu disponer de los privilegios que
necesita la aplicacin, ya que sta los asumir cuando sea necesario
habilitando y deshabilitando el role en su cdigo.
Aunque esto no es obligatorio, normalmente desear proteger los
roles de aplicacin con contraseas. Estas contraseas debern estar
incluidas en el cdigo de la aplicacin para que habilite el role.
Si la aplicacin es sencilla, seguramente ser suciente con un
role en el que agrupemos todos los privilegios que necesita durante su
ejecucin.
Sin embargo, podremos crear tantos roles como queramos y
habilitarlos/deshabilitarlos durante la ejecucin de la aplicacin. De
esta forma, cada role puede tener un conjunto de privilegios ms
pequeo.

Copyright Computer Aided Education, S.A.

Copias de seguridad y recuperacin


1. MODO DE RECUPERACIN

na de las tareas ms importantes y habituales de un


administrador de bases de datos es llevar a cabo el plan de
copias de seguridad y, ocasionalmente, su recuperacin.
Realizar copias de seguridad es una tarea obligatoria en cualquier
instalacin de bases de datos en produccin, ya que la prdida de dicha
informacin por cualquier causa (errores en el hardware, errores en
aplicaciones, accidentes, incendios, robo, etc.) puede provocar un
grave problema para la organizacin.
Oracle proporciona mtodos para realizar las oportunas
copias de seguridad y, si es necesario, restaurarlas para recuperar la
informacin.
Y permite congurar la poltica de copias de seguridad de una
forma relativamente sencilla, automatizando gran parte del proceso, o
todo lo personalizada que necesitemos.
Pero el modo en que podremos realizar la copia de seguridad y su
restauracin depende del modo de recuperacin de la base de datos,
que es una propiedad que deberamos establecer adecuadamente.
Para trabajar con todos estos conceptos, acceda a la pgina
Mantenimiento de Enterprise Manager. En este caso, utilice el enlace
Valores de recuperacin.
El modo ARCHIVELOG determina de qu forma puede ser
recuperada una base de datos y, por lo tanto, qu formas de copia de
seguridad estn disponibles.
Pero a qu se reere exactamente esta propiedad?
Como ya sabemos, uno de los componentes de una base de datos
Oracle son los archivos redo logs, donde quedan registradas todas las
transacciones que se realizan en la base de datos.
Dicho registro se realiza, en la mayora de las veces, incluso antes
de que los cambios se hayan efectuado realmente en los archivos de
datos, de forma que si se produce un error durante el almacenamiento
de los datos, la transaccin que ha fallado quede al menos registrada
en el archivo redo log.
De esta forma, cuando la base de datos vuelva a estar operativa,
el servidor podr recuperar la transaccin del redo log y aplicar los
cambios en los archivos de datos.
Copyright Computer Aided Education, S.A.

Copias de seguridad y recuperacin

Pues bien, el modo ARCHIVELOG determina qu ocurre cuando


los archivos redo log se llenan. En ese momento, Oracle puede seguir
dos polticas:
Modo NOARCHIVELOG: en este caso las entrada ms
antiguas del redo log son eliminadas para poder registrar nuevas
operaciones.
Modo ARCHIVELOG: en este caso ocurre lo mismo que
en el modo anterior, pero el contenido del archivo redo log es
archivado, por lo que no se pierde.

Tenga en cuenta que la copia de seguridad restaurada puede


representar un determinado estado de la base de datos, correspondiente
al momento concreto en el que se realiz.
Tras restaurar la copia de seguridad, Oracle puede utilizar los
archivo redo log para actualizarla con los datos que no estaban reejados
en dicha copia simplemente porque se realizaron posteriormente. Pero
para ello, previamente ha tenido que archivar el contenido de estos
archive log.
Qu modo elegir? En la mayora de ocasiones, el modo
ARCHIVELOG es el ms apropiado, ya que asegura la mayor
disponibilidad de la informacin en cualquier momento, aunque a
cambio de un mayor coste de mantenimiento.
Esto se debe a que si no podemos utilizar los archivo redo log tras
restaurar una copia de seguridad, entonces dicha copia tiene que ser
suciente para recuperar la base de datos. Esto normalmente representa
realizar continuas copias de seguridad de toda la base de datos o, al
menos, de gran parte de ella.
2

Copias de seguridad y recuperacin

Una ltima indicacin antes de empezar a estudiar cmo realizar


copias de seguridad. Se puede congurar una zona en el disco duro
expresamente preparada para albergar todos los archivos relacionados
con esto, en lo que se conoce como rea de Recuperacin Flash.
Nosotros establecimos esta opcin (estaba activada por defecto)
al crear la base de datos con el asistente. Vemos aqu que dicha rea
tendr, en nuestro caso, un tamao mximo de 2 gigabytes.

2. COPIAS DE SEGURIDAD CONSISTENTES

uando la base de datos est en modo de recuperacin


NOARCHIVELOG, slo se dispone de una posibilidad a la
hora de recuperarla tras un error o prdida accidental de la informacin
almacenada: utilizar una copia de seguridad lo sucientemente
completa.
Para ello, la base de datos no puede estar abierta o disponible
durante la realizacin de la copia de seguridad, ya que toda la
informacin tiene que guardarse en la copia de seguridad.
Una copia de seguridad que se realiza estando cerrada la base de
datos se conoce como consistente, ya que la informacin no puede
actualizarse durante el proceso.
Para realizar copias de seguridad, utilice el enlace Planicar
Copia de Seguridad en la pgina de Mantenimiento.
En la gura siguiente, vemos que Enterprise Manager nos
proporciona la posibilidad de planicar el tipo de copia de seguridad
sugerida o personalizarla a nuestras necesidades.
Copyright Computer Aided Education, S.A.

Copias de seguridad y recuperacin

En cualquier caso, ya que estamos en modo NOARCHIVELOG,


slo podremos realizar una copia completa de la base de datos,
cerrndola previamente para ello.
Para realizar esta operacin, es necesario identicarse como un
usuario de Windows que tenga privilegios administrativos.
Observe la pgina a la que da acceso si elegimos realizar una
poltica personalizada de copias de seguridad. Elegimos esta opcin y
no la sugerida por Oracle para que vea todas las opciones disponibles.

Vemos que podemos realizar una copia de seguridad completa o


incremental.
En la copia completa se incluye toda la informacin almacenada
en los archivos de datos. Esto representa una mayor necesidad
de almacenamiento, pero tambin es la copia de seguridad ms
segura.
4

Copias de seguridad y recuperacin

En este caso, para recuperar la base de datos, slo necesitamos


restaurar la copia completa.
El tipo de copia incremental guarda nicamente los cambios
realizados desde la copia incremental anterior.
De esta forma, para recuperar la base de datos, se necesita restaurar
todas las copias incrementales en el orden en que fueron hechas.
Nuestra estrategia ser utilizar copias incrementales, pero la
primera tiene que ser completa, ya que no hay una anterior. Activando
la casilla Usar como base de la estrategia de copia de seguridad
incremental, se advierte a Oracle de nuestro propsito.
En el segundo paso del asistente, podremos indicar la ubicacin
de la copia: en disco o en cinta.
Como en nuestra base de datos est activada el rea de
Recuperacin Flash, sta ser la ubicacin predeterminada.
En el paso 3, Oracle crear un trabajo o tarea que se ejecuta con
la identidad del usuario de Windows que hemos indicado.
En esta pgina podremos indicar el nombre de dicho trabajo, su
descripcin y cundo queremos que se lleve a cabo.
Tenga en cuenta que la base de datos se cerrar antes de empezar
con la copia de seguridad, ya que se trata de una copia consistente.

Es conveniente planificar
las copias de
seguridad
consistentes
u offline para
momentos
en los que se
espera que la
base de datos
no tenga actividad o que
tenga poca
actividad.

Copyright Computer Aided Education, S.A.

Copias de seguridad y recuperacin

Podremos, adicionalmente, programar la copia de seguridad en


intervalos o para los momentos adecuados.
En el paso 4 se hace un resumen de todo el proceso, se advierte
de que se cerrar la base de datos para realizar la copia de seguridad y
aparece el botn Ejecutar Trabajo para realizarla.
Ms tarde podremos volver a planicar una copia de seguridad
para guardar los cambios efectuados tras la anterior.
Por ejemplo, sera una buena idea crear una copia incremental,
para guardar slo dichos cambios.

3. RESTAURAR LAS COPIAS DE SEGURIDAD

i ocurre lo peor y tenemos que restaurar una base de datos,


deberemos hacerlo utilizando las copias de seguridad
realizadas con anterioridad y en el orden adecuado.
En el caso de que slo hayamos hecho copias completas,
deberemos elegir la ms actualizada. En este caso, se perdern los
cambios realizados tras dicha copia.
La ventaja de utilizar copias completas es que no se necesita
mayor recuperacin que la de restaurar la copia.
En cambio, si se ha utilizado una estrategia de copias de seguridad
incrementales, restauraremos la primera y, despus, cada una de las
copias incrementales, en el orden en que se efectuaron.
Las copias incrementales slo guardan los cambios realizados
desde la copia incremental anterior (o desde la primera, si es el caso),
por lo que tienen que ser utilizadas todas durante la recuperacin de la
base de datos.
Veamos cmo lo haramos, teniendo en cuenta que durante la
restauracin, la base de datos no estar disponible para los usuarios
porque se trata de copias consistentes de los datos.
Para ello, se utiliza el enlace Realizar Recuperacin de la pgina
de Mantenimiento.

Copias de seguridad y recuperacin

Vemos que disponemos de la posibilidad de restaurar la base


de datos en su totalidad u objetos particulares de la misma, como el
contenido de las tablas.
Tenga en cuenta que restaurar una base de datos completa es un
proceso que puede ser largo. Si el problema radica en algunas tablas u
objetos, es mejor hacerlo de forma particular en stos.
Durante la restauracin, la base de datos ser cerrada. Con estos
sencillos pasos, Enterprise Manager se ha encargado de recuperar la
base de datos utilizando las copias de seguridad incrementales para
ello.

4. COPIAS DE SEGURIDAD INCONSISTENTES

eamos ahora las posibilidades que tendremos si decidimos


poner el modo de recuperacin ARCHIVELOG.

De esta forma, Oracle puede utilizar los archivo redo log para
recuperar la base de datos al estado ms actual, una vez se ha restaurado
una copia de seguridad.
Esto implica, por otra parte, que la base de datos sigue online o
totalmente activa tanto durante la realizacin de las copias de seguridad
como al restaurarlas.
De ah que
inconsistentes.

se

conozcan

como

copias

de

seguridad

Para cambiar al modo ARCHIVELOG, tendr que reiniciar la


base de datos para poder aplicarlo. Enterprise Manager nos lo indica y
nos pregunta si deseamos hacerlo en ese momento.
Copyright Computer Aided Education, S.A.

Copias de seguridad y recuperacin

Veamos ahora qu posibilidades tenemos a la hora de realizar


copias de seguridad. Para ello, utilice el enlace a Planicar Copia de
Seguridad.

Fjese que en la seccin de copia personalizada ahora no slo


disponemos de la oportunidad de realizar una copia de seguridad
completa de la base de datos, sino que tambin podramos hacerlo de
tablespaces, archivos de datos o redo logs en particular.
Esto es posible porque Oracle utilizar los archivos redo log
actuales y los que haya archivado para recuperar la base de datos.
Al realizar una copia de seguridad con el modo ARCHIVELOG
activado, disponemos de muchas ms opciones y, adems, la base de
datos sigue estando disponible para los usuarios.
A cambio, la restauracin ser un poco ms compleja porque
no slo tendremos que restaurar las copias de seguridad, sino que
deberemos aplicar tambin todos los archivos redo log disponibles.

5. COPIA DE SEGURIDAD SUGERIDA

l administrador se encargar de realizar e implementar


la estrategia de copias de seguridad de la base de datos,
planicndolas a lo largo del tiempo.
La forma ms sencilla de hacerlo es aceptando la planicacin
sugerida por Oracle, ya que, en funcin del modo ARCHIVELOG, se
encarga de realizar las copias de seguridad ms apropiadas en cada
caso.
8

Copias de seguridad y recuperacin

Esto facilita en gran medida la labor del administrador, ya que la


copia sugerida suele ser la ms apropiada para la base de datos.
Adems, tambin facilita la posterior recuperacin de la base de
datos, al ser Oracle el que aplica las copias apropiadas y, opcionalmente,
los archivos redo log.
Veamos qu nos solicitar el asistente de Planicar Copia de
Seguridad Sugerida por Oracle. Por ejemplo, en el primer paso, nos
pregunta dnde hacer la copia.

En el segundo paso se nos indica que la poltica sugerida consta


de una copia completa la primera vez y copias incrementales cada da.
Como est activado el modo ARCHIVELOG, las copias se realizarn
sin necesidad de cerrar la base de datos.
Fjese que no se nos solicita que introduzcamos la ubicacin donde
se guardarn las copias de seguridad, ya que la caracterstica rea de
Recuperacin Flash est congurada para la base de datos.

En el tercer paso el asistente nos permite indicar en qu momento


del da deseamos realizar la copia de seguridad. Y, nalmente, en
el cuarto paso podremos pulsar en el botn Ejecutar Trabajo para
que se lleve a cabo la copia de seguridad (o se planique el trabajo
correspondiente segn lo establecido).
Copyright Computer Aided Education, S.A.

Copias de seguridad y recuperacin

Utilizar la planicacin sugerida de Oracle junto al rea de


Recuperacin Flash es la conguracin ms sencilla, pero tambin la
ms apropiada, para la mayora de instalaciones Oracle.
Sin embargo, si necesita una estrategia de copias de seguridad
diferente, puede personalizarla como ha visto durante la leccin.

10

You might also like