Sie sind auf Seite 1von 216

TEMA 1.

INSTALACIN ORACLE 9i ________________________________ 1


TEMA 2. ARQUITECTURA DE ORACLE 9I __________________________ 13
TEMA 3. CREACIN DE TABLESPACES ___________________________ 33
TEMA 4. USUARIOS ___________________________________________ 43
TEMA 5. TABLAS _____________________________________________ 59
TEMA 6. OPERACIONES SOBRE TABLAS __________________________ 89
TEMA 7. CONSULTAS_________________________________________ 123
TEMA 8. PL/SQL _____________________________________________ 141
TEMA 9. FUNCIONES, PROCEDIMIENTOS, PAQUETES Y DISPARADORES ___ 163
TEMA 10. CURSORES ________________________________________ 183
TEMA 11. NDICES ___________________________________________ 195
GLOSARIO____________________________________________________ 211

Tema 1

INSTALACIN
ORACLE 9i

1.1. VENTANA DE UBICACIN DE LOS ARCHIVOS ___________________________ 3


1.2. VENTANA DE PRODUCTOS DISPONIBLES ______________________________ 4
1.3. VENTANA DE TIPOS DE INSTALACIN _________________________________ 5
1.4. VENTANA DE CONFIGURACIN DE BASE DE DATOS _____________________ 5
1.5. VENTANA DE ORACLE SERVICES PARA MICROSOFT TRANSACTION SERVER_ 6
1.6. VENTAN DE IDENTIFICACIN DE BASES DE DATOS _____________________ 6
1.7. VENTANA DE UBICACIN DE ARCHIVOS DE B.D._________________________ 7
1.8. VENTANA DE JUEGO DE CARACTERES DE LA B.D. ______________________ 8
1.9. VENTANA RESUMEN________________________________________________ 8

-1-

1.1. VENTANA DE UBICACIN DE LOS ARCHIVOS


En dicha ventana se detalla la ruta de origen del software de instalacin, que en este proceso de
instalacin es: C:\Instalacion 9i\stage\products.jar1
Adems se especifican dos datos muy importantes como los que se detallan seguidamente:
Nombre.- Directorio de instalacin de los programas necesarios para el funcionamiento de la
propia aplicacin Oracle (se aconseja no cambiar este directorio). Para la versin Oracle 9i es
OraHome92, para Oracle 8i es OraHome8i, etc.
Ruta de Acceso.- En esta opcin se detalla la ruta de instalacin. Se recomienda tener muy
claro dnde se ubicarn los programas y aplicaciones que necesitar Oracle para poder funcionar. En
nuestro caso: C:\oracle\ora92. Este directorio es conocido como ORACLE_HOME.

Ficheros con extensin JAR son paquetes de JAVA.


-3-

Una vez pasada esta ventana, podemos observar las carpetas creadas en el disco duro:

1.2. VENTANA DE PRODUCTOS DISPONIBLES


En esta ventana se nos permite seleccionar tres posibles opciones:
La primera es aquella que nos instala las herramientas de administracin adems de crearnos una Base
de Datos. Se recomienda para la primera vez que se instale Oracle 9i en un Servidor de B.D.2

B.D. (Base de Datos)


-4-

La segunda opcin instala las herramientas necesarias para administrar, pero sin crear una B.D.
Finalmente, la tercera opcin slo instala los programas necesarios para poder acceder a una B.D. Oracle
desde un ordenador o puesto cliente.

1.3. VENTANA DE TIPOS DE INSTALACIN


En ella, al igual que otros productos o programas informticos, se selecciona qu clase de instalacin se
desea realizar, adems de especificarnos el tamao que se requiere de disco duro para las distintas
opciones. Diferenciamos entre:

Enterprise Edicin (2.86 GB)

Edicin Estndar (2.80 GB)

Personal Edicin (2.80 GB)

Personalizado

Al igual que en otros paquetes informticos, la instalacin ms completa es la Enterprise Edicin.

1.4. VENTANA DE CONFIGURACIN DE BASE DE DATOS


Esta ventana nos permite especificar el tipo de base de datos que se desea crear.

-5-

Las B.D. del tipo Procesamiento de Transacciones, son aquellas que reciben un gran nmero de
transacciones al segundo por parte de un volumen elevado de usuarios. Ejm.- Entidades Bancarias.
Las B.D. del tipo Almacenes de Datos, son las B.D. conocidas con Data WareHouse, destinadas a la
toma de decisiones sobre grandes volmenes de datos e informacin a procesar e interpretar, sin ningn
nivel de transacciones.

1.5. VENTANA DE ORACLE SERVICES PARA MICROSOFT TRANSACTION SERVER


En ella se especifica el nmero del puerto por el cul Oracle escuchar las peticiones de transacciones
realizadas desde la aplicacin Microsoft Transaction Server (MTS). En este caso el 2030, el cul se
aconseja no cambiar salvo que este nmero de puerto se est usando por otro programa o aplicacin.

1.6. VENTANA DE IDENTIFICACIN DE BASES DE DATOS


Es una de las ms importantes por no decir la ms importante. En ella se especifica el nombre de la B.D.
que crear Oracle de forma genrica, adems del SID (Oracle System IDentifier) que es un identificador
nico para cada B.D. que se cree. Dicho SID podemos usarlo para instanciar a la B.D. creada.

-6-

Por defecto le pondremos el nombre GLOBAL a la B.D. y a su vez el propio programa de instalacin
asignar como SID el nombre de GLOBAL.

1.7. VENTANA DE UBICACIN DE ARCHIVOS DE B.D.


En ella se especifica la ruta fsica dnde Oracle crear los ficheros necesarios para el funcionamiento,
control y gestin de los DATOS de la B.D. que se va a crear durante el proceso de instalacin.

-7-

Por cuestiones de rendimiento, Oracle aconseja que la ruta especificada en la ventana anterior, est en
un disco duro distinto al que se ha usado para ubicar el software de instalacin, es decir, distinto a la ruta
indicada en la ventana de Ubicacin de los Archivos (C:\oracle\ora9).

1.8. VENTANA DE JUEGO DE CARACTERES DE LA B.D.


En ella elegimos el juego de caracteres que usar la base de datos. ste es seleccionado por el propio
programa de instalacin basndose en el sistema operativo que posea el ordenador dnde se va a
instalar Oracle.

1.9. VENTANA RESUMEN


Muestra informacin de las opciones seleccionadas durante las distintas ventanas del proceso de
instalacin.
Durante el proceso de instalacin, se crea la B.D. mediante el Asistente. Una vez finalizada dicha
creacin, Oracle nos solicita las password para los usuarios SYS y SYSTEM por motivos de seguridad.
En otras versiones 8i y posteriores, esta opcin no exista, siendo las password:

-8-

SYS / change_on_install
SYSTEM / manager
Dicha ventana, adems de solicitarnos dichos cambios, nos muestra informacin de la B.D. creada, qu
fichero posee los parmetros de iniciacin de dicha B.D. y dnde est ubicado fsicamente.

El proceso de instalacin se dar por finalizado cuando se presente la ventana siguiente:

-9-

Si observamos la estructura de carpetas que tendremos en el disco duro ser la siguiente:

- 10 -

RECUERDE

A la hora de instalar Oracle hay que tener muy claro dnde se instalar, es decir, el
ORACLE_HOME.

Tambin conviene determinar previamente el tipo de instalacin y tipo de B.D. que se desea
crear en el proceso de instalacin.

Dos de los datos ms importantes a considerar son el nombre de la Base de Datos y el SID.

Una vez finalizada la creacin de la B.D., Oracle nos solicitar las password para los usuarios
SYS y SYSTEM por motivos de seguridad.

- 11 -

Tema 2

ARQUITECTURA DE
ORACLE 9i

2.1. ESTRUCTURA DE ALMACENAMIENTO LOGICA Y FSICA ________________ 15


2.2. RELACIN TABLESPACES Y DATAFILES_____________________________ 16
2.3. SEGMENTOS, EXTENSIONES Y BLOQUES DE DATOS___________________ 18
2.4. ESPACIO DE TABLAS SYSTEM (Tablespace SYSTEM)___________________ 21
2.5. DIFERENTES OPCIONES DE UN TABLESPACE ________________________ 23
2.5.1. Tablespaces Permanentes (PERMANENT), Temporales (TEMPORARY)
Deshacer (UNDO)____________________________________________ 23
2.5.2. Tablespaces en lnea (ONLINE) o fuera de lnea (OFFLINE) ____________ 24
2.5.3. Espacios de Tablas (Tablespaces) administrador Localmente (Local) y
por Diccionario (Dictionary). ____________________________________ 24
2.5.4. Tablespaces en modalidad de slo lectura y lectura/escritura ____________ 25
2.6. FICHEROS DE DATOS (DATAFILES) _________________________________ 26
2.7. OTROS TABLESPACES ___________________________________________ 28
2.8. Ficheros de REDO LOG ___________________________________________ 29
2.9. FICHEROS DE CONTROL _________________________________________ 30

- 13 -

2.1. ESTRUCTURA DE ALMACENAMIENTO LOGICA Y FISICA


Oracle almacena su informacin en estructuras de almacenamiento fsicas y estructuras de
almacenamiento lgicas.
La estructura de almacenamiento lgica, es una organizacin conceptual de los datos que est
compuesta por:

Tablespaces

Segmentos

Extensiones

Bloques de Datos

La estructura de almacenamiento fsica son las unidades tangibles de almacenamiento, es decir los
ficheros del Sistema Operativo. Dicha estructura se compone de los siguientes elementos:

Ficheros de Datos (DataFiles)

Ficheros REDO LOG (REDO0x.LOG)

Ficheros de CONTROL. (CONTROL0x.CTL)

- 15 -

2.2. RELACIN TABLESPACES Y DATAFILES


Definimos el Tablespaces como el lugar lgico dnde Oracle agrupa a los ficheros de datos (DataFiles),
por tanto:
Un Espacio de Tabla, es una estructura lgica de los datos dentro de la B.D. de
Oracle, asociada a uno o ms Ficheros de Datos fsicos de disco duro.

Tabla A

Tabla B

Tabla C

.............

Espacio de Tabla

Fichero de Dato 1

Fichero de Dato 2

- 16 -

- 17 -

2.3. SEGMENTOS, EXTENSIONES Y BLOQUES DE DATOS


Un Tablespaces est compuesto por ms de un segmento, definiendo un segmento como un espacio que
se asigna para un tipo especfico de estructura de almacenamiento lgica, teniendo segmentos de
ndices, segmentos de rollback y segmentos de datos.
Los segmentos pueden repartirse entre distintos Datafiles de un mismo Tablespaces.
A su vez, los segmentos se dividen en extensiones, las cuales definimos como un conjunto contiguo de
bloques, por lo que un segmento puede tener ms de una extensin.
El bloque de datos de Oracle, es la unidad mnima de almacenamiento que se corresponde con uno o
ms bloques fsicos del Sistema Operativo dnde se ha creado la B.D.

- 18 -

Tablespaces

Seg. 1

Seg. 2

E1

B1

E2

B2

B3

E3

B4

B5

E4

B6

B7

B8

Uno o ms bloque de S.O.


Reflejando lo explicado mediante un diagrama entidad-relacin tendramos:

B.D.

TABLESPACES

DataFiles

SEGMENTO.

EXTENSIONES

Bloques de S.O.

BLOQUES

PARTE Lgica

PARTE Fsica
- 19 -

Un Mapa de Tablespaces proporcionado por Oracle sera:

- 20 -

2.4. ESPACIO DE TABLAS SYSTEM (Tablespace SYSTEM)


Toda B.D. de Oracle tiene al menos un espacio de tabla llamado SYSTEM.

La ruta de los Archivos de Datos (DataFiles) (fsicos) asociados al Tablespace SYSTEM es por defecto:

Unidad:\ORACLE\ORADATA
\SID\system01.dbf
(Teniendo en cuenta que SID
es

el

nombre

de

la

INSTANCIA a la B.D., bien


creada de forma genrica en
el proceso de instalacin o
mediante
Database

la

aplicacin
Configuration

Assistant).

- 21 -

El tablespace SYSTEM almacena:

El Diccionario de Datos de la B.D.


Diccionario de Datos.- Es un conjunto de Tablas y Vistas que almacenan informacin interna de
la B.D (NO almacena los datos).
Ejemplo.- La tabla DBA_TABLESPACES, que nos proporciona informacin de todos los
TABLESPACES existentes en nuestra B.D.

Almacena el cdigo fuente y compilado de los programas PL/SQL (procedimientos, funciones,


disparadores o trigger, paquetes).

Las vistas, sinnimos, secuencias y las especificaciones de un objeto, son definiciones que no
almacenan datos, pero dichas definiciones se almacenan en el diccionario de datos que se engloba
en el Tablespaces SYSTEM.

- 22 -

2.5. DIFERENTES OPCIONES DE UN TABLESPACE


2.5.1. Tablespaces Permanentes (PERMANENT), Temporales (TEMPORARY) y Deshacer (UNDO)
Permanent.- La mayora de los tablespaces son permanentes, es decir, se crean para almacenar tablas,
ndices, informacin de restauracin de datos (RollBack).
Temporary.- Son espacios de tablas que se crean para operaciones SQL que conlleven ordenaciones,
uniones y generacin de ndices.
Undo.- Anteriormente ROLLBACK, son espacios de tablas que almacenan las acciones a ejecutar en una
sentencia Rollback.
Si inicialmente un tablespaces es creado PERMANENT y despus queremos que sea TEMPORARY,
podemos modificarlo mediante la siguiente sentencia SQL:
ALTER TABLESPACE "nombre_tablespace_temporal" TEMPORARY;
IMPORTANTE.- El Tablespace no tiene funcionalidad hasta que no se le asocia a un usuario.
ALTER USER "nombre_usuario" TEMPORARY
TABLESPACE "nombre_tablespace_temporary"

- 23 -

2.5.2. Tablespaces en lnea (ONLINE) o fuera de lnea (OFFLINE)


OnLINE.- Permiten a los usuarios y aplicaciones hacer uso de los datos.
OffLINE.- No permite que sus datos estn disponibles para los usuarios y/o las aplicaciones, aunque la
BD est arrancada o levantada.
Un tablespace se coloca OffLINE cuando existe algn problema con dicho tablespace y tenemos que
deshabilitar su uso. Tambin emplearemos la opcin OffLine ante la situacin en la cul tenemos un
tablespaces que contiene datos histricos que no se usan pero que no podemos eliminar.

2.5.3. Espacios de Tablas (Tablespaces) administrado Localmente (Local) y por Diccionario


(Dictionary)
Oracle utiliza dos modalidades para administrar la peticin y asignacin de espacio en un Tablespace.
Tablespaces gestionados localmente Extensiones Gestionadas Localmente (EXTENT MANAGEMENT
LOCAL) , esta es la opcin POR DEFECTO, a partir de la versin 8i.

- 24 -

Los tablespaces que gestionan sus propias extensiones, conservan un bitmap en los 64 Kbyte primero de
cada archivo de datos para mantener un seguimiento del estado libre o utilizado de los bloques de ese
archivo de datos.
Cada bit del bitmap se corresponde con un bloque o grupo de bloques. Cada vez que una extensin se
asigna o se libera para volver a utilizarla, Oracle cambia los valores del bitmap para que muestren el
nuevo estado de los bloques. Esta modalidad, requiere menos reorganizacin.
La otra modalidad es mediante administracin DICTIONARY (Managed in the Dictionary), usada en
versiones anteriores. La informacin del espacio de tabla que se est usando, se almacena en una serie
de tablas existentes en el diccionario de datos.

2.5.4. Tablespaces en modalidad de slo lectura y lectura/escritura


Por defecto, todo Tablespace cuando se crea, es de lectura/escritura. Dicha modalidad es cambiada a
slo lectura cundo sabemos que los datos existentes en los objetos que almacena ese tablespaces
sern manipulados a nivel de consultas.
- 25 -

2.6. FICHEROS DE DATOS (DATAFILES)


Un DATAFILE es un fichero fsico de almacenamiento de un tablespace. Cmo mnimo un tablespace
est asociado a un DataFile, pudiendo ser esta asociacin de ms de un DataFile.
IMPORTANTE.- Se aconseja que un tablespace vaya asociado a ms de un datafile y que stos se
encuentren en distintos discos duros, para reducir el factor E/S.

NOTA.- Toda B.D. posee un lmite de DataFiles que se pueden crear.


Si un TABLESPACE se llena, ORACLE producira un error al no existir ms capacidad de
almacenamiento para los objetos asignados a ese tablespace. Para solucionar esto podemos:

Asignar un nuevo DATAFILE al TABLESPACE.

Aumentar el tamao del DATAFILE ya existente.

Al crear el TABLESPACE, asignar un DATAFILE de crecimiento automtico.

- 26 -

- 27 -

2.7. OTROS TABLESPACES


Tablespaces USERS.- Almacena la informacin y datos pertenecientes a los usuarios existentes en la
B.D.
Tablespaces TEMP.- En dicho tablespaces, Oracle almacena informacin temporal de su propio
funcionamiento (para tener una similitud, es como el papel sucio que usamos en nuestro trabajo).

Tablespaces UNDOTBS1.- Este tablespaces en versiones anteriores se llamaba ROLLBACK_DATA,


siendo su funcionalidad almacenar la informacin de deshacer, es decir, rehacer una transaccin mal
realizada y la coherencia de lectura antes de ejecutar una instruccin commit.
Tablespaces TOOLS.- Este tablespaces se utiliza para almacenar objetos de otras aplicaciones de Oracle
(Form, Report, Designer,...) o de otros fabricantes.
Tablespaces INDX.- Almacena informacin correspondiente a los ndices de las tablas. Es aconsejable y
recomendable crear un tablespaces independiente al de datos para asignar la gestin de los ndices.

- 28 -

2.8. FICHEROS DE REDO LOG


Son ficheros fsicos dnde Oracle registra todas las modificaciones o transacciones que se producen en
la B.D. Esta informacin se gestiona en memoria (por rendimiento), siendo los procesos internos de
Oracle los encargados de escribirlo posteriormente a los ficheros.
Se recomienda mnimo dos ficheros de REDO, por B.D. existente.
Funcionan de forma cclica, es decir, si tenemos dos archivos (redo01.log y redo02.log), se escribe 1 en
el fichero redo01.log activo, cuando este se llena, pasamos a escribir en el fichero redo02.log y al llenarse
este, se borra la informacin del Redo01.log y se usa ese espacio liberado para almacenar la siguiente
informacin de transacciones.
IMPORTANTE.- Esto nos lleva a diferenciar entre B.D. en modo ARCHIVELOG y NOARCHIVELOG.
Si una B.D. esta en modo ARCHIVELOG, esto quiere decir que Oracle siempre realizar una copia del
fichero REDO LOG antes de borrar y volver a escribir. Es la forma de mantener segura la informacin
existente en la B.D. Este NO es el mtodo predeterminado.
El modo NOARCHIVELOG (Por defecto), no realiza copia de los ficheros REDO LOG, recuperndose
slo las ltimas transacciones realizadas.

- 29 -

2.9. FICHEROS DE CONTROL


Almacenan informacin de todos los ficheros asociados y relacionados en una B.D., en ellos se
almacena, por ejemplo, que fichero REDO se debe tratar para una posible recuperacin.
Si al comprobar en stos que el estado de la B.D. no es correcto, NUNCA arrancar.

- 30 -

RECUERDE

Oracle organiza la informacin en estructuras de datos fsicas y lgicas.

Todo TABLESPACE tiene como mnimo un DATAFILE. Si existiesen ms de un DATAFILE, se


recomienda a discos distintos.

En la versin Oracle 9i los tablespaces son gestionados localmente, no por diccionario de datos.

Oracle almacena toda la informacin de DESHACER en los ficheros REDO.

En los ficheros de CONTROL Oracle almacena la informacin de todos los ficheros implicados
en el funcionamiento de la B.D.

- 31 -

Tema 3

CREACIN DE
TABLESPACES

3.1. DEFINICIN DE SQL. (STRUCTURED QUERY LANGUAGE) ____________ 35


3.2. CREACIN DE TABLESPACES __________________________________ 35

- 33 -

3.1. DEFINICIN DE SQL. (STRUCTURED QUERY LANGUAGE)


SQL es un lenguaje estructurado de consulta que nos permitir interactuar hacia una B.D. relacional. Las
instrucciones o sentencias SQL, las podemos dividir en tres tipos: DDL, DML y DCL.
DDL (Data Definition Language ).- Nos permite manipular y definir la estructura dnde se almacenarn los
datos. stas son las instrucciones propias para crear, modificar y borrar tablespaces, tablas, ndices, etc.,
es decir: CREATE, ALTER ,DROP.
DML (Data Management Language).- Son las que nos permiten el manejo ms bsico de los datos, tales
como insertarlos, consultarlos, modificarlos y borrarlos, es decir: INSERT, SELECT, UPDATE, DELETE.
DCL (Data Control Language).- Son las instrucciones que permiten asignar funciones de acceso,
privacidad en los datos, poltica de seguridad, etc. Este tipo de instrucciones o tareas son las propias que
debe realizar el DBA. Por ejemplo: crear un usuario, asignarle permiso de acceso, etc.
CREATE USER "USUARIO_PRUEBA" .......;
GRANT "CONNECT" TO "USUARIO_PRUEBA";

3.2. CREACIN DE TABLESPACES


Un tablespaces podemos crearlo mediante la ejecucin directa de una sentencia DDL o mediante la
utilizacin de la herramienta grfica de Oracle conocida como Enterprise Manager Console.

- 35 -

Crearemos un tablespaces llamado PRUEBA usando la herramienta grfica. A partir de ella,


obtendremos la sentencia SQL, la cul iremos comentando.
Paso 1.- Abrimos la aplicacin Enterprise Manager Console.
Paso 2.- Una vez en ella, seleccionamos la B.D. sobre la cul se crear el Tablespace. Para poder crear
un Tablespace sobre una B.D., deberemos tener permiso. En nuestro caso lo llevaremos a cabo mediante
el usuario System.
Paso 3.- Seleccionamos el apartado Almacenamiento y dentro de ste, la carpeta Tablespaces.
Haciendo clic derecho sobre ella, nos aparecer una ventana flotante donde seleccionamos la opcin
CREAR.

Paso 4.- En la ventana que nos aparece, escribimos el nombre PRUEBA. En dicha ventana, podemos
observar cmo Oracle de forma automtica asigna el mismo nombre del tablespace al fichero de datos y
lo ubicar por defecto en C:\ORACLE\ORADATA\GLOBAL\ siendo GLOBAL el nombre de la B.D. y
asigna como tamao del DataFile, 5 Mbyte.

- 36 -

Las opciones por defecto asignadas a los parmetros de almacenamiento son las siguientes:

- 37 -

Paso 5.- Una vez pulsado el botn de CREAR, nos debe aparecer el mensaje de Tablespace creado.
Una vez hecho esto, podremos comprobar como aparece dentro de los tablespaces existentes en la
carpeta Tablespaces.
La sintaxis de la sentencia SQL que creara el TABLESPACE prueba sera:
CREATE TABLESPACE "PRUEBA"
LOGGING
DATAFILE 'C:\ORACLE\ORADATA\GLOBAL\PRUEBA.ora' SIZE 5M
EXTENT MANAGEMENT LOCAL SEGMENT SPACE
MANAGEMENT AUTO

Lo primero que nos encontramos es el nombre del TABLESPACE, en este caso: PRUEBA.
A continuacin, la clusula LOGGING, que puede ser LOGGING o NOLOGGING, nos permite establecer
a nivel global sobre el Tablespaces la opcin de generar informacin de REDO (Deshacer) sobre los
objetos tablas e ndices. Por defecto es LOGGING, aunque es modificable a nivel de objeto
individualmente, es decir, al crear una tabla o especificar un ndice.

- 38 -

DATAFILE 'C:\ORACLE\ORADATA\GLOBAL\PRUEBA.ora' SIZE 5M .- Ubicacin, nombre y tamao del


DataFile.
EXTENT MANAGEMENT.- Esta clusula hace referencia a la gestin de los segmentos del tablespace.
Un tablespace puede ser gestionado de forma LOCAL o por DICTIONARY (ver el Tema 2, aparatado
2.5.3).
EXTENT MANAGEMENT LOCAL.- En ella, se especifican cmo se gestionarn las extensiones
del Tablespaces. Por defecto, los tamaos de segmentos son gestionados automticamente por
el sistema.
EXTENT MANAGEMENT LOCAL UNIFORM 1M.- El espacio de tabla est gestionado con
extensiones uniformes de 1 Mega.
SEGMENT SPACE MANAGEMENT AUTO.- Esta clusula slo es importante para espacios de tablas
temporales que estn gestionados localmente. Sirve para especificar si Oracle debe realizar el
seguimiento del espacio libre y del utilizado en los segmentos del espacio de tablas utilizando listas de
extensiones libres (MANUAL) o mapas de bits (AUTO).
Los DataFiles poseen un tamao inicial: DATAFILE 'C:\ORACLE\ORADATA\GLOBAL\PRUEBA.ora' SIZE
5M. Dicho valor, por defecto no es ampliable automticamente. Si se llena el DataFiles, debemos crear
otro Datafiles para que el Tablespaces siga operativo.
Para especificar que un DataFiles sea ampliable automticamente, podemos hacerlo grficamente
mediante la pestaa Almacenamiento correspondiente a las propiedades del Datafiles.

- 39 -

Una vez activada esa opcin, debemos especificar el valor Kbytes o Mbytes que queremos que crezca el
Datafiles y si deseamos que su crecimiento sea ilimitado (UNLIMITED) o limitado (MAXSIZE valor).
Grficamente sera:

La sentencia SQL sera:


CREATE TABLESPACE "PRUEBA"
LOGGING
DATAFILE 'C:\ORACLE\ORADATA\GLOBAL\PRUEBA.ora' SIZE 5M
AUTOEXTEND ON
NEXT 15K
MAXSIZE 100M
EXTENT MANAGEMENT LOCAL SEGMENT
SPACE MANAGEMENT AUTO
Si no se especificase el Tamao Mximo como limitado, la clusula MAXSIZE tomara el valor
UNLIMITED.
Importante: el valor mnimo del NEXT debe ser un Tamao de Bloque, en este caso 8.192 Bytes.
( 8 KByte). Si se especificase un valor inferior, Oracle lo ajusta.
- 40 -

Para eliminar un tablespaces, es tan simple como hacer clic derecho sobre el nombre del Tablespace,
dentro de la aplicacin Enterprise Manager Console y seleccionar la opcin Eliminar. En versiones
anteriores, tras borrar un Tablespaces, el DataFile o Datafiles asociados no eran eliminados fsicamente
del Sistema Operativo. Esta opcin de Oracle nos lo permite.

Tanto el nmero de Tablespaces que puede poseer una B.D. es limitado al igual que el nmero de
DataFiles por Tablespaces.

- 41 -

RECUERDE
-

SQL es un lenguaje que nos permite interactuar con una B.D.

El primer paso a la hora de trabajar con una B.D. Oracle, es crear un TABLESPACE.

Todo TABLESPACE lleva asociado como mnimo un DATAFILE.

Al crear el TABLESPACE, se aconseja que este sea gestionado localmente.

- 42 -

Tema 4

USUARIOS

4.1. DEFINICIN _________________________________________________ 45


4.2. ASIGNACIN DE PRIVILEGIOS __________________________________ 45
4.3. ASIGNACIN DE ROLES _______________________________________ 47
4.4. CREACIN DE USUARIOS______________________________________ 48

- 43 -

4.1. DEFINICIN
Los usuarios son los propietarios de los objetos de la B.D. (Tablas, ndices, Funciones, Procedimientos,
Paquetes, Secuencias, etc.).
En todo S.G.B.D. Oracle, diferenciamos dos usuarios muy importantes:
a) El usuario SYS.- Es el propietario de las tablas del DICCIONARIO DE DATOS, que es
dnde se almacena informacin correspondiente a la estructura de la B.D. Adems de tener
acceso a la ejecucin de los paquetes predefinidos ( DBMS_ ).
b) El usuario SYSTEM.- Esta cuenta de usuario es la cuenta por defecto del Administrador de
la B.D. Se aconseja y recomienda crear otra cuenta para el administrador y no usar la
cuenta System. Este usuario, est autorizado a tener acceso a las vistas que permiten
obtener informacin de las tablas del Diccionario de Datos.
Un aspecto que debemos tener presente es que a partir de la versin 9i desaparece la cuenta de usuario
INTERNAL/Oracle.
Por tanto, podemos decir que las cuentas SYS y SYSTEM son las de mayor control y poder sobre la B.D.,
por lo que ES OBLIGATORIO cambiar su clave. Este cambio es solicitado en el proceso de instalacin.
Los usuarios se asignan a Tablespaces creados previamente para el almacenamiento de los objetos. Se
recomienda siempre dos tablespaces el Default o de Datos y el Temporal.
La cuenta de un usuario puede bloquearse (lock) para evitar acceder a la B.D.
Cada vez que se crea un objeto de la B.D. se crea bajo una cuenta de usuario.

4.2. ASIGNACIN DE PRIVILEGIOS


A los usuarios, se le asigna PRIVILEGIOS que son acciones que pueden realizar sobre los objetos
creados que se vayan a crear o sobre el Sistema.

- 45 -

Diferenciamos:
Privilegios de Sistema.- Permite al usuario realizar algn tipo de accin que afecte a todo el
Sistema. Son unos 155 aproximadamente. Por ejemplo:
CREATE SESSION.- Permiso para conectarse al servidor de B.D. Si no tuviera dicho permiso,
mostrara el siguiente error:
ERROR:
ORA-01045: user USR_PRUEBA lacks CREATE SESSION privilege; logon denied

CREATE TABLE.- Poder crear tablas en su propio esquema.


CREATE ANY TABLE.- Crear tablas en cualquier esquema de la B.D.
SELECT ANY TABLE.- Consultar tablas de todos los esquemas.
EXECUTE ANY PROCEDURE.- Ejecutar procedimientos, funciones o paquetes en toda la B.D.
SELECT ANY DICTIONARY.- Nos permite utilizar herramientas de gestin de Oracle sin ser
DBA. Por ejemplo Enterprise Manager Console, pero con
muchas limitaciones.
GRANT ANY ROLE.- Nos muestra todos los Roles disponibles, PERO no quiere decir que
podamos asignarlos o revocarlos.
GRANT ANY PRIVILEGE.- Igual que GRANT ANY ROLE, pero aplicado a privilegios.
Privilegios de Objetos.- Permite al usuario realizar una accin especfica sobre un objeto u
objetos de la B.D., como tablas, vistas, procedimientos, funciones, etc. Por ejemplo: En la
imagen grfica que se adjunta, podemos ver como el usuario USR_PRUEBA_2, se le ha
concedido los privilegios de Alter, Delete, Insert, Index, References, Select y Update, sobre el
objeto TABLA1 pertenecientes al usuario USR_PRUEBA.

- 46 -

ALTER.- Modificar el objeto.


DELETE.- Borrar filas del objeto.
INSERT.- Insertar filas (registros) en el objeto.
INDEX.- Crear ndices en la tabla.
REFERENCES.- Crear claves externas que hagan referencia a la tabla.
SELECT.- Seleccionar columnas (campos).
UPDATE.- Actualizar filas de la tabla.
EXECUTE.- Ejecutar funciones, procedimientos, paquetes, clases Java.

4.3. ASIGNACIN DE ROLES


Los ROLES son conjuntos de privilegios que se crean para hacer ms sencillo el proceso de
administracin. Por defecto, Oracle nos proporciona ROLES ya creados sobre los cuales podemos aadir
ms privilegios. Tambin podemos crear nuevos ROLES personalizados que engloben a otros roles
existentes y nuevos privilegios. Dentro de los ROLES predefinidos, destacamos:
CONNECT.- Podemos catalogarlo como un Rol Bsico ya que permite al usuario que se le asigna
conectarse con la B.D., crear tablas, vistas, sinnimos, secuencias y otros objetos de la B.D.
RESOURCE.- Al usuario que se le concede, se le permite crear tablas, secuencias, ndices, clusters de
datos, procedimientos, funciones, paquetes, etc, es el rol asignado a los desarrolladores o
programadores.
DBA.- Es el asignado a los Administradores de B.D., siendo el ms poderoso.
SELECT_CATALOG_ROLE.- Permite consultar las vistas del Diccionario de Datos, pertenecientes al
DBA, es decir, las vistas DBA_.
EXECUTE_CATALOG_ROLE.- Podemos ejecutar los paquetes predefinidos DBMS. (DBMS_UTILITY,
DBMS_OUTPUT, DBMS_SHARED_POOL, etc.).
Tanto los Roles como los Privilegios, se pueden crear con opcin de Administracin (WITH ADMIN
OPTION), permitiendo al propio usuario que se le ha asignado gestionarlo, por ejemplo revocarlo,
conceder a otro usuario ese mismo privilegio o rol. Por defecto se asignan con opcin de NO
administracin.

- 47 -

4.4. CREACIN DE USUARIOS


Igual que con los tablespaces, para crear un usuario podemos hacerlo desde la herramienta grfica
Enterprise Manager Console o mediante sentencia SQL.
Desde la herramienta grfica:
Paso 1.- Abrimos la herramienta Enterprise Manager Console, tras conectar como usuario System,
seleccionamos el apartado Seguridad y despus la carpeta Usuarios. Sobre dicha carpeta hacemos
clic derecho y seleccionamos la opcin Crear.

Paso 2.- En este paso slo escribiremos el nombre del usuario: USR_PRUEBA, y como clave:
usr_prueba, asignndoles el tablespaces por defecto PRUEBA_DEFAULT y como temporal el
PRUEBA_TEMPORAL. Si no se especificase ninguno, el tablespaces por defecto es el USERS y el
temporal TEMP ya que es un Tablespaces de tipo TEMPORAL y es definido como temporal por defecto.
El tipo de AUTENTIFICACIN puede ser del tipo:

- 48 -

Contrasea.- Oracle solicita cada vez que un usuario decide tener acceso a una herramienta
suya, un nombre de usuario y una contrasea. Su comprobacin se realiza en la
propia gestin de usuarios de Oracle.
Externo.-

Tambin conocida como de autentificacin por Sistema Operativo, es decir, el


usuario debe estar registrado como usuario del Sistema Operativo.

Global.-

Este tipo de autentificacin es la usada en aquellas redes empresariales, dnde los


usuarios tienen que tener acceso a ms de una B.D.

- 49 -

Si observamos la pestaa ROL, podemos comprobar como se le asigna de forma predeterminada el Rol
CONNECT.
La sentencia SQL correspondiente a la creacin del usuario "USR_PRUEBA" sera:
CREATE USER "USR_PRUEBA"
PROFILE "DEFAULT"
IDENTIFIED BY "usr_prueba"
DEFAULT TABLESPACE "PRUEBA_DEFAULT"
TEMPORARY TABLESPACE "PRUEBA_TEMPORAL"
ACCOUNT UNLOCK;
GRANT "CONNECT" TO "USR_PRUEBA";
El Rol Connect engloba a los siguientes privilegios por defecto:

ALTER SESSION.- Modificar una Session de conexin.


CREATE CLUSTER.- Permite la creacin de clusters de datos. Los clusters de datos son la alternativa a
la indexacin, reduciendo las Entrada/Salida a disco para acceder a las tablas.
CREATE DATABASE LINK.- Crear enlaces a B.D. distribuidas.
- 50 -

CREATE SEQUENCE.- Crear secuencias numricas.


CREATE SESSION.- Nos permite conectarnos al servidor de B.D. y establecer una sesin.
CREATE SYNONYM.- Crear Sinnimos de objetos de la B.D. de otros esquemas, para poder usarlos sin
referenciar al esquema.
CREATE TABLE.- Crear Tablas.
CREATE VIEW.- Crear Vista sobre las tablas. Una Vista es un subconjunto de columnas de una tabla.
Aunque el Rol Connect engloba el privilegio Create Table, esto no proporciona CUOTA al usuario
sobre el TABLESPACES. Por ello, para poder usar los Tablespaces asociados a un usuario, debemos
especificar la CUOTA (QUOTA) ilimitada (UNLIMITED) del usuario hacia el TABLESPACES o un valor de
cuota.

Grficamente sera:

- 51 -

Mediante sentencia SQL:


ALTER USER "USR_PRUEBA"
QUOTA UNLIMITED ON "PRUEBA_DEFAULT"
QUOTA UNLIMITED ON "PRUEBA_TEMPORAL"
Los comandos para asignar y quitar privilegios y roles a los usuarios son GRANT y REVOKE
respectivamente.
Sintaxis:
Para conceder:
Privilegios de Sistema a Usuarios:

GRANT privilegio [ , privilegio] ........


TO usuario [ , usuario] ........
[WITH ADMIN OPTION]
Privilegios de Objetos a Usuarios:

GRANT privilegio [ , privilegio] ........|| ALL [PRIVILEGES]


ON [esquema.] Objeto
TO usuario [ , usuario] ........
[WITH GRANT OPTION]
Ejemplo:
GRANT DELETE ON "USR_PRUEBA"."TABLA1" TO "USR_PRUEBA"
ROLES a Usuarios:
GRANT nombre_del_rol [ ,nombre_del_rol]......
TO usuario [,usuario]......
[WITH GRANT OPTION];

- 52 -

Ejemplo:
GRANT "AUTHENTICATEDUSER","DBA" TO "USR_PRUEBA";
Para quitar o revocar:
Privilegios de Sistema a Usuarios:

REVOKE privilegio [ , privilegio] ........ FROM usuario;


Privilegios de Objetos a Usuarios:

REVOKE privilegio [ , privilegio] ........|| ALL [PRIVILEGES]


ON [esquema.] Objeto
FROM usuario [ , usuario] ........
Ejemplo:
REVOKE INSERT
ON "USR_PRUEBA"."TABLA1"
FROM "USR_PRUEBA"
Revocar un Rol:
REVOKE nombre_del_rol [ ,nombre_del_rol]...... FROM usuario;

Podemos crear ROLES propios formado por otros roles y privilegios de sistema y de objetos. Esto se
recomienda cuando tenemos que crear muchos usuarios de la B.D. y asignarles roles y privilegios.
Para ello, podemos usar la herramienta grfica EMC (Enterprise Manager Console) o mediante la
sentencia SQL.
CREATE ROLE nombre_rol
[NOT IDENTIFIED || IDENTIFIED contrasea];
GRANT "rol_existente" TO "nombre_rol";

- 53 -

GRANT privilegio_de_sistema TO " nombre_rol ";


GRANT privilegio_de_objeto ON "esquema"."objeto" TO " nombre_rol ";
Ejemplo:
CREATE ROLE "ROL_PRUEBA" IDENTIFIED BY "clave_rol";
GRANT "DBA" TO "ROL_PRUEBA";
GRANT ALTER ANY CLUSTER TO "ROL_PRUEBA"
GRANT DELETE ON "USR_PRUEBA"."TABLA1" TO "ROL_PRUEBA"
Grficamente sera:

- 54 -

Toda la informacin correspondiente a los Roles y Privilegios es almacenada en las vistas del Diccionario
de Datos, estas son:
DBA_ROLES.- Nombre de los ROLES y estado de contrasea.
DBA_ROLE_PRIVS.- Usuarios que poseen ROLES.
DBA_SYS_PRIVS.- Usuarios con Privilegios de Sistema.
DBA_TAB_PRIVS.- Usuarios con Privilegios sobre las Tablas.
DBA_COL_PRIVS.- Usuarios con Privilegios sobre columnas.
ROLE_ROLE_PRIVS.-Roles concedidos a otros roles.
ROLE_SYS_PRIVS.- Privilegios de Sistemas otorgados a Roles.
ROLE_TAB_PRIVS- Privilegios de Tablas otorgados a Roles.

Por ejemplo: Qu ROLES tiene asignado el usuario USR_PRUEBA?


Select * from DBA_ROLE_PRIVS where GRANTEE='USR_PRUEBA';

- 55 -

Por ltimo, el usuario que se crea se puede asignar a un Perfil (PROFILE), cuya funcin es asignar un
conjunto de restricciones referentes al consumo de recursos del Sistema, por parte del usuario (Tiempo
de CPU, Entradas/Salidas a disco, sesiones, etc.) y proteger el control de acceso (caducidad de
contrasea, histricos de contrasea, etc.).
Por defecto, si no se ha creado ningn Perfil se asigna el Default, en el cul todo es ilimitado y sin
restricciones.
Slo diferenciar entre Default e Unlimited.
Default.- Si se especifica en un nuevo Perfil, Oracle asigna el valor existente para ese parmetro en el
perfil Default.
Unlimited: Sin lmite en ese parmetro.
Un usuario slo puede tener un Perfil.

- 56 -

- 57 -

RECUERDE

Los usuarios SYS y SYSTEM son los de mayor PODER sobre la B.D.

El nivel de AUTORIZACIN de los usuarios, se les concede por medio de los PRIVILEGIOS y
ROLES.

Puede crear a los usuarios mediante sentencias SQL o a travs de Enterprise Manager
Console.

Un usuario puede tener o no un perfil, pero en caso de tenerlo, slo puede poseer uno.

- 58 -

Tema 5

TABLAS

5.1. DEFINICIN _________________________________________________ 61


5.2. TIPOS DE DATOS_____________________________________________ 61
5.3. DEFINICIN DE ESQUEMA _____________________________________ 64
5.4. PASOS PARA CREAR UNA TABLA _______________________________ 65

- 59 -

5.1. DEFINICIN
Las TABLAS son la estructura bsica en los diseos de B.D. Se componen de una serie de columnas
(campos) cuyo conjunto se denomina filas (registros). Ellas contienen o almacenan los datos por
columnas agrupadas en filas.
Es aconsejable que toda tabla tenga una columna denominada clave, es decir, es aquella columna que
identifica de forma nica a cada fila. Puede estar compuesta por ms de una columna. A esa columna o
columnas se le denomina PRIMERY KEY.
Ejemplo:
Tabla: VEHICULOS
Campos o Columnas: Matricula, Modelo, Color, Cilindrada, Fecha_Compra, Precio_Venta
Filas o Registros:
3234-BCV, OPEL, Blanco, 1600, 10/10/1998, 6100.56
SE-2356-FG, SEAT, Azul, 1400, 12/11/2000, 6500.75
VEHICULOS
Matricula

Modelo

Color

Cilindrada

Fecha_Compra

Precio_Venta

3234-BCV

OPEL

Blanco

1600

10/10/1998

6100,55

SE-2356-FG

SEAT

Azul

1400

12/11/2000

6500,75

La columna Primery Key es la columna Matricula que es nica por cada fila.

5.2. TIPOS DE DATOS


Los DATOS de las columnas de una tabla pueden ser de los siguientes TIPOS:
CHAR.- Columna de caracteres de longitud FIJA, cuyo valor mximo es 2000 caracteres.
VARCHAR2.- Columna de caracteres de longitud VARIABLE, cuyo valor mximo es 4000 caracteres.
Oracle permite almacenar y manejar datos de caracteres de muchos idiomas, caracterstica conocida
como National Language Support (NLS). Esto implica que algunos caracteres de estos idiomas necesitan
- 61 -

ms de un byte para su almacenamiento, de ah que usemos los tipos de datos: NCHAR, NVARCHAR2 y
CLOB.
NCHAR.- Columna de longitud FIJA para juego de caracteres MULTIBYTE. Su tamao mximo es 2000
caracteres o 2000 Bytes por fila, dependiendo del juego de caracteres, siendo la configuracin
predeterminada de 1 Byte.
NVARCHAR2.- Columna de longitud VARIABLE para juego de caracteres MULTIBYTE. Su tamao
mximo es 4000 caracteres o 4000 Bytes por fila, dependiendo del juego de caracteres,
siendo la configuracin predeterminada de 1 byte.
NUMBER.-Columna numrica de longitud VARIABLE. Abarca los tipos de datos ANSI/ISO1 NUMERIC,
DECIMAL, DEC, INTEGER, INT, SMALLINT. Si queremos representar un nmero decimal
sera NUMBRE(9,2), que quiere decir: 9 dgitos de los que 2 son decimales.
El nmero de BYTE que ocupa el nmero a almacenar, se calcula dividiendo la longitud total
por 2, se redondea a un nmero entero y se suma 1. Por tanto NUMBER(9) ocupara 6 Bytes.
DATE.- Columna de longitud FIJA de 7 Bytes, que nos permite almacenar la fecha y la hora. Su formato
predeterminado es: DD-MON-YY HH:MI:SS. Con HH en formato AM y PM.
LONG.- Columna que puede contener una cadena de longitud variable, con longitud mxima de 2GBytes.
RAW.- Columna de longitud VARIABLE para datos binarios, de longitud mxima 2000 Bytes. Podemos
decir que RAW es similar a VARCHAR2, pero con la diferencia de que no se realizan conversiones entre
conjuntos de caracteres distintos, de diferentes B.D.
LONG RAW.- Columna de longitud variable para datos binarios, de longitud mxima 2GBytes.
ROWID.- Datos binarios que representan un identificador de fila (RowID).
Los identificadores de fila se almacenan internamente como un nmero binario de longitud fija,
siendo esta longitud variable entre distintos S.O. Para poder manipular los identificadores de

American National Standards/International Organization for Standardization


- 62 -

fila, estos pueden ser convertidos a una cadena de caracteres mediante la funcin
ROWIDTOCHAR. Esta funcin genera una salida de 18 caracteres con el formato:
BBBBBBBB.FFFF.AAAA
Donde:
BBBBBBBB.- Identifica el bloque de dato dentro del Datafile.
FFFF.- Identifica la Fila dentro del bloque.
AAAA.- El nmero de archivo.
Cada parte es un nmero hexadecimal, por ejemplo:
0000001E.00FF.0001 representa el bloque 30. fila 255 u fichero 1.
Los tipos de la Familia LOB disponibles a partir de Oracle 8 o superior se crearon para solucionar y
ampliar las prestaciones de los tipos LONG y LONG RAW.
Los LOB internos son BLOB, CLOB y NCLOB y el LOG externo es BFILE. Los LOB internos, se
manipulan usando rdenes DML SQL o el paquete predefinido DBMS_LOB.
BLOB.- Objeto binario de GRAN TAMAO, hasta 4 GBytes.
CLOB.- Objeto de caracteres de GRAN TAMAO, hasta 4 Gbytes.
NCLOB.- Tipo de dato CLOB, para juego de caracteres multibyte, hasta 4Gbytes.
BFILE.- Archivo binario externo, siendo el S.O. quien determina el Tamao. Su acceso es de slo lectura.
Su informacin no es gestionada por Oracle, sino por el S.O. por lo que no estn sujetos a
transacciones.
UROWID.- Datos binarios utilizados para el direccionamiento de datos, de longitud mxima 4000 bytes.
Usado para el manejo de tablas e ndices particionados.
FLOAT.- Abarca los tipos de datos ANSI/ISO estndar FLOAT, REAL, DOUBLE PRECISION, todos ellos
podemos englobarlo dentro del NUMBER.

- 63 -

5.3. DEFINICIN DE ESQUEMA


Los ESQUEMAS (Schemas) es dnde se organiza de forma LOGICA los distintos objetos relacionados
de la B.D. (Tablas, ndices, Vistas, Sinnimos, Secuencias, Agrupamientos, Tipos de Origen, Tipos de
Usuario).

Esta forma de organizacin lgica, nos permite tener objetos con el mismo nombre, por ejemplo dos
tablas, en esquemas distintos sin crear ningn conflicto a la gestin interna de Oracle.
Hay que tener MUY CLARO que toda nuestra estructura lgica de la B.D. se organiza en el Esquema,
adems de que un esquema est directamente relacionado con un USUARIO, tal que el ESQUEMA
tiene el mismo nombre que el USUARIO. Por ello, se crean al crear un objeto perteneciente al usuario.

- 64 -

5.4. PASOS PARA CREAR UNA TABLA


Para crear una tabla podemos crearla mediante una sentencia SQL o mediante la herramienta grfica
OMC (Oracle Manager Console). Si usamos el OMC, Oracle nos proporciona un asistente.
Los pasos seran:
Paso 1.- Abrimos el OMC y seleccionamos el apartado Esquema y hacemos clic derecho sobre
cualquiera de los esquemas. Esto hace que nos aparezca una ventana flotante para poder crear distintos
objetos.

Paso 2.- Seleccionamos el objeto Tabla y pulsamos el botn &Crear, comprobando que tengamos
activa la opcin &Usar Asistente. En este punto, nos aparecer la primera ventana del asistente Paso 1
de 13.

- 65 -

En ella especificamos el nombre de la Tabla, VEHICULOS. Al especificar el esquema del cul va a


formar parte ese objeto, automticamente se le asigna su Tablespaces de Datos.

- 66 -

Paso 3.- La siguiente ventana Paso 2 de 13, nos permite especificar las columnas que componen
nuestra tabla.
Campos o Columnas: Matricula, Modelo, Color, Cilindrada, Fecha_Compra, Precio_Venta

Paso 4.- La siguiente ventana del asistente Paso 3 de 13, nos permitir especificar qu columna de las
que componen la Tabla es la clave primaria. Adems de qu nombre deseamos poner a la restriccin que
comprueba y verificar que sea nico por cada fila el valor introducido en dicha columna o campo. Oracle
crea una asignacin automtica.
Para ello, slo tendremos que seleccionar la opcin S, deseo crear una clave primaria, y especificar en
la columna Orden el orden de creacin. Por nombre de restriccin, no usaremos en este ejemplo el
Asignado por el Sistema, por lo que usaremos el nombre PK_VEHICULO.

- 67 -

Paso 5.- La siguiente ventana del asistente, nos permite especificar las restricciones de valor nulo y de
valor nico en las distintas columnas de nuestra B.D. Aquellas columnas que deseemos sean nicas,
podemos especificar el nombre de la restriccin, o bien, que Oracle los asigne automticamente.
En nuestro ejemplo slo especificaremos que la columna COLOR pueda tomar el valor NULO (NULL).

- 68 -

Paso 6.- Es este paso del asistente Paso 5 de 13, se detalla qu columna de nuestra tabla es una clave
ajena de otra tabla, tambin conocida como FOREING KEY. Para este ejemplo no tenemos ninguna.
Si la hubiese, tendramos que detallar el esquema en el que est la tabla Maestra (Esquema de
Referencia), nombre de la misma (Tabla de Referencia) y columna de la tabla que se hereda (Columna
de Referencia).

Paso 7.- El Paso 6 de 13, nos permite realizar un control sobre posibles valores a tomar por la columna
o conversiones automticas.
En nuestro ejemplo obligaremos a que los posibles valores de la columna MODELO sean: OPEL, SEAT,
RENAULT, MERCEDES, AUDI. Tambin que la MATRICULA sus valores sean convertidos a mayscula
UPPER(MATRICULA).

- 69 -

- 70 -

Paso 8.- En el Paso 7 de 13, se permite la modificacin de los parmetros de almacenamiento por
defecto para la Tabla.
Si NO SE SELECCIONA la opcin Sustituir parmetros de almacenamiento por defecto, Oracle
gestionar el tamao automticamente, basndose en el Tamao Inicial y en la Tasa de Crecimiento
aproximado de cada fila de la tabla.

Nmero Inicial de Filas: Nmero de filas de la tabla. Oracle, utiliza el nmero de filas para determinar el
tamao de la primera extensin de segmento.
Ratio de Crecimiento: Ratio de crecimiento de la tabla esperado en filas / unidad de tiempo (da,
semana, mes, ao). Este valor es usado por Oracle para determinar el tamao (en bytes) de la siguiente
extensin de segmento.
Las opciones Actividad de Actualizacin y Actividad de Insercin permiten a Oracle definir los
parmetros del bloque de datos ptimos que minimizan el encadenamiento y la migracin de filas.

- 71 -

Actividad de Actualizacin.- Determina el porcentaje de espacio de cada bloque de datos de la tabla


reservado para futuras actualizaciones de las filas de la tabla (PCTFREE).
Superior: Define el porcentaje de cada bloque de datos para actualizaciones de las filas
existentes y permite inserciones de las nuevas filas hasta rellenar un mximo de un 90 por ciento
de cada bloque de datos.
Tamao de Fila de Aumento por Actualizacin: Disponible si la Actividad de Actualizacin es
alta, reserva el 20 por ciento de cada bloque de datos para actualizaciones de las filas
existentes, incluidas las supresiones.
Inferior o Ninguno: Reserva el 5 por ciento de cada bloque de datos para actualizaciones de las
filas existentes y permite inserciones de nuevas filas hasta rellenar un mximo de un 95 por
ciento de cada bloque de datos.
Actividad de Insercin.-Determina el porcentaje mnimo de espacio utilizado que Oracle mantiene para
cada bloque de datos de la tabla (PCTUSED).
Superior: Define el porcentaje mnimo de espacio utilizado en un 40 por ciento del bloque de
datos de la tabla.
Tamao de Fila de Aumento por Actualizacin: Disponible si la Actividad de Insercin es alta,
define el porcentaje mnimo de espacio utilizado en un 60 por ciento del bloque de datos de la
tabla.
Inferior o Ninguno: Define el porcentaje mnimo de espacio utilizado en un 60 por ciento del
bloque de datos de la tabla.
Paso 9.- En este paso, se especificar si queremos particionar la Tabla.
Con el particionamiento, se solucionan los problemas de rendimiento y soporte a tablas e ndices de
tamao muy grande ( 2 GByte) dividindolas en diferentes partes. Esto permite a las sentencias SQL
manejar las distintas particiones y no la Tabla al completo o el ndice.

- 72 -

El poder particionar, tambin nos permite asignar las particiones a ms de un Tablespaces distinto, por lo
que podemos:
- Reducir la posibilidad de corrupcin de datos, por tratarse de tamaos muy grandes.
- Podemos hacer copias de seguridad de las particiones de forma individual.
- Reducir o dividir la carga de E/S si asignamos esas particiones en unidades fsicas de disco
distintas.
El particionamiento, podemos hacerlo por bloques de filas, segn los rangos de valores de columna
especificados.
IMPORTANTE: Si una Tabla posee un tipo de dato LONG o LONG RAW, NO podremos particionarla. En
su lugar, a la hora de disear la tabla, definimos el campo del tipo LOB.

Aunque el Asistente slo nos permite particionar por un solo campo, la Tabla puede ser particionada
por ms de un campo.

- 73 -

Nota.- El particionamiento slo es permitido en versiones superiores a Oracle 8.


Una forma de ver si nuestro SGBD Oracle lo permite es abriendo la aplicacin SQL*Plus:

Paso 10.- Si no hemos especificado el particionamiento, pasamos directamente a la ventana Paso 13 de


13, la cual nos muestra la sentencia SQL de creacin de la Tabla.

- 74 -

Si hubisemos seleccionado la particin, los pasos siguientes antes de llegar al Paso 13 de 13 nos
solicitan informacin para definir el particionaminto.
Una vez pulsado el botn Terminar en la ventana Paso 13 de 13, nos debe aparecer la ventana de
confirmacin indicando que la Tabla ha sido creada.

Si observamos en el apartado de Esquema de la consola del Oracle Enterprise Manager, podemos ver
como dentro de la carpeta Tablas, aparece la tabla creada, VEHICULOS.

- 75 -

La sintaxis de creacin de la TABLA mediante sentencia SQL es:


CREATE TABLE "USR_PRUEBA"."VEHICULOS"
("MATRICULA"

VARCHAR2(15)

NOT NULL,

"MODELO"

VARCHAR2(15)

NOT NULL,

"COLOR"

VARCHAR2(10),

"CILINDRADA"

NUMBER(4)

NOT NULL,

"FECHA_COMPRA"

DATE

NOT NULL,

"PRECIO_VENTA"

NUMBER(7, 2)

NOT NULL,

CONSTRAINT "PK_VEHICULO" PRIMARY KEY("MATRICULA"),


CHECK(MATRICULA=UPPER(MATRICULA)),
CHECK(MODELO IN ('OPEL', 'SEAT','RENAULT','MERCEDES','AUDI')))
TABLESPACE "PRUEBA_DEFAULT";
Ahora bien, Oracle nos proporciona una utilidad para obtener la sentencia DDL de un objeto. Para
obtener el de la tabla creada, slo tendremos que posicionarnos en el objeto desde la consola del OEM y
hacer clic derecho. Del men que aparece, seleccionamos la opcin Mostrar DDL de Objeto....

- 76 -

Oracle nos muestra una ventana con el cdigo SQL, PERO mucho ms detallado, que el mostrado por el
asistente de creacin de tablas.

Organizando la sentencia, sta quedara:


CREATE TABLE "USR_PRUEBA"."VEHICULOS"
("MATRICULA"

VARCHAR2(15 byte)

NOT NULL,

"MODELO"

VARCHAR2(15 byte)

NOT NULL,

"COLOR"

VARCHAR2(10 byte),

"CILINDRADA"

NUMBER(4)

NOT NULL,

"FECHA_COMPRA"

DATE

NOT NULL,

"PRECIO_VENTA"

NUMBER(7, 2)

NOT NULL,

CONSTRAINT "PK_VEHICULO" PRIMARY KEY("MATRICULA") USING INDEX


TABLESPACE "PRUEBA_DEFAULT"
STORAGE (
INITIAL 64K
NEXT 0K
- 77 -

MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0)
PCTFREE 10 INITRANS 2 MAXTRANS 255,
CONSTRAINT "SYS_C003038" CHECK(MATRICULA=UPPER(MATRICULA)),
CONSTRAINT "SYS_C003039" CHECK(MODELO IN ('OPEL', 'SEAT', 'RENAULT','MERCEDES','AUDI')))
TABLESPACE "PRUEBA_DEFAULT"
PCTFREE 10
PCTUSED 0
INITRANS 1
MAXTRANS 255
STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1
MAXEXTENTS 2147483645 PCTINCREASE 0)
LOGGING
En esta sentencia, podemos distinguir:

Los valores de los campos VARCHAR2, se especifican en byte.

La clave primaria es usada como ndice.

Se detallan los valores

de almacenamiento de la TABLA, concretamente de las

extensiones:
STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0)
MUY IMPORTANTE: En los TABLESPACES gestionados localmente, el tablespaces se encarga de
gestionar su propio espacio manteniendo un mapa de bits en cada DATAFILES de
los bloques libres y ocupados del DataFiles, por lo que cada vez que una extensin
se libera o asigna para un nuevo uso, Oracle actualizar dicho mapa de bits. En
este sentido conviene aclara que dichas extensiones no necesitan ser agrupadas
manualmente ya que Oracle las determinar automticamente.

1. INITIAL - Valor de la primera Extensin del objeto (Tabla). En este caso es tamao de
8 bloques de 8Kbyte cada uno.

- 78 -

2. NEXT.- Su valor es almacenado en el Diccionario de Datos y se utiliza para la


creacin de las nuevas EXTENSIONES de la Tabla. Cualquier cambio en este valor
slo afecta a las nuevas extensiones.
3. MINEXTENTS.- Mnimo nmero de extensiones que debe presentar una tabla, es
decir, nmero mnimo de extensiones que debe tener un segmento.
4. MAXEXTENTS.- Nmero mximo de extensiones que puede presentar una Tabla.
Podemos asignarles un valor o indicar que es ilimitado.
Si es ILIMITADO, permite crear un nmero de extensiones que slo est limitada por la
cantidad de espacio contiguo existente en el tablespaces.
Si se indica un VALOR, este es el nmero mximo de extensiones. Por defecto, si no se
especifica nada el valor asignado depender del bloque de datos por defecto.
5. PCTINCREASE.- Su valor se almacena en el Diccionario de Datos, y es usado por
Oracle para calcular el tamao de futuras extensiones creadas a partir de la anterior
que se cre. Valor en porcentaje.
Si es distinto de 0, el proceso en segundo plano SMON realizar agrupaciones
peridicas de extensiones libres contiguas.
Su valor es 0, ya que hemos creado un TABLESPACES Gestionado localmente, por lo
que no actuar el proceso SMON.

Adems de los parmetros de almacenamiento de extensiones, cada tabla posee unos

parmetros de bloques que controlan su utilizacin.


Estos valores, pueden ser asignados durante la creacin de la tabla o posteriormente, con el objetivo
de mejorar la utilizacin del espacio y minimizar la migracin de filas entre los bloques de la tabla.
Dependiendo de dicho parmetro, las modificaciones pueden afectar a todos los bloques o slo a los
nuevos bloques.
Un Bloque o Data Block se compone de las siguientes partes:
Cabecera de Bloque.- Contiene datos relativos al bloque, como la direccin del bloque y el tipo de
segmento al que pertenece (Tabla, ndice o rollback).

- 79 -

Directorio de Tablas.- Guarda informacin de las Tablas que tienen datos en el bloque.
Directorio de Filas.- Guarda informacin sobre las filas de las tablas que se encuentran en ese
momento en el bloque. Esta informacin est compuesta por la direccin de la fila en la zona Datos
de Filas, en la cul Oracle debe localizar los Datos.
Al espacio ocupado por la Cabecera de Bloque, Directorio de Tablas y Directorio de Filas
se le denomina overhead.
Espacio Libre.- Zona reservada para la insercin de nuevas filas en el Bloque o para las
actualizaciones que requieran ms tamao del que disponan originalmente a cuando fueron
insertados. Este es el caso, por ejemplo, de las columnas de tipo Varchar2.
Datos de Filas o Espacio de Datos.- Almacena las filas de datos de las Tablas, ndices y
Segmentos de Rollback, es decir, los datos propiamente dicho.
Los parmetros que afectan al bloque son:
PCTFREE 10 PCTUSED 0 INITRANS 1 MAXTRANS 255
1. PCTFREE.- Su valor indica el PORCENTAJE de espacio mnimo libre reservado en
cada bloque de datos para ampliaciones resultantes de actualizaciones e inserciones
de filas en el bloque de datos. Se establece al crear la tabla o el ndice.
Por defecto 10 %, pudiendo asignar un valor entre 0 y 99.
Por ejemplo: Si ponemos su valor a 20 al crear la tabla, cuando insertemos en la tabla
y el espacio libre en el bloque baje de este 20%, no se podr insertar ms en ese
bloque, dejando el espacio sobrante para ampliaciones de actualizaciones.
El valor de este parmetro solo afecta a las futuras inserciones.
2. PCTUSED.- En este parmetro, se especifica la cantidad de espacio libre que debe
haber en el bloque para poder insertar en l. Su valor afecta a todos los bloques. Su
valor por defecto es 40 %.

- 80 -

Por ejemplo:
ALTER TABLE "USR_PRUEBA"."VEHICULOS" PCTUSED 40;
Esto quiere decir que en un bloque NO se pueden insertar nuevas filas de datos, hasta
que el espacio ocupado por las filas de ese bloque no baje del 40 %.
Nota.- En datos del tipo ndice, no tiene utilidad este parmetro (PCTUSED), por la
propia estructura interna de estos datos. (rbol binario)
Las vistas del Diccionario de Datos, asociadas al usuario SYS que nos permiten saber
el valor de dicho parmetro son dba_tables y dba_indexes.
Por ejemplo:
select TABLE_NAME,PCT_FREE,PCT_USED
from dba_tables
where OWNER='USR_PRUEBA';

Otro aspecto a tener muy en cuenta, es el ENCADENAMIENTO y LA MIGRACIN DE


FILAS.
Encadenamiento de Filas (Chained row).- Sucede cuando los datos de una Fila no caben
en un slo bloque y Oracle debe distribuirlos en ms de un bloque reservado para la
extensin.
Esto sucede con columnas del tipo de datos Long, Long Raw, CLOB, etc.
Migracin de Filas.- Sucede cuando se realizan actualizaciones en columnas de datos de
tipo variable, por ejemplo Varchar2. Si no tenemos espacio suficiente para la actualizacin,
valor del PCTFREE, Oracle migra toda la fila a otro bloque con capacidad libre.
Estos dos fenmenos, reducen considerablemente el RENDIMIENTO de Oracle a la hora de
manejar y manipular los datos.
Cmo DETECTAR estos fenmenos?

- 81 -

Para ello, usamos la sentencia SQL:


ANALYZE TABLE [esquema].tabla
{COMPUTE STATISTICS | ESTIMATE STATISTICS [SAMPLE interger { ROW | PERCENT
} ] };
COMPUTE STATISTICS.- Nos proporciona informacin estadstica, basndonos en un
recorrido completo de la tabla.
ESTIMATE STATISTICS.- Genera informacin estadstica, basada en un nmero de filas
(SAMPLE interger ROW) de la tabla, por defecto 1064, o en un porcentaje de filas
(SAMPLE interger PERCENT).
La informacin a analizar o a estudiar, se guarda en la comuna CHAIN_CNT de la vista
DBA_TABLES, del Diccionario de Datos. Para consultar dicho valor usaremos la sentencia
SQL:
SELECT chain_cnt FROM dba_tables
WHERE table_name=tabla AND owner=usuario_propietario;
Si observamos que su valor es grande, necesitaremos reorganizar la tabla:
TRUNCATE TABLE [esquema.] tabla
[ { DROP | REUSE } STORAGE ];
Por defecto, la opcin es DROP que borra todas las filas de la tabla y libera el espacio
ocupado por la tabla, pudiendo ser usado por otra tabla.
REUSE.- Elimina las filas de las tablas y conserva ese espacio para que se puedan seguir
almacenando datos en la tabla.
Hay que tener mucho cuidado con este tipo de sentencia DDL, ya que no genera segmento
de Rollback, por lo que no existe la posibilidad de deshacer.
Tambin, podemos chequear la tabla para comprobar si existen bloques corruptos.
ANALIZE TABLE [esquema.] tabla
VALIDATE STRUCTURE [CASCADE];

- 82 -

Tambin, podemos utilizar el paquete predefinido de Oracle, DBMS_UTILITY con el


procedimiento ANALYZE_SCHEMA
(esquema VARCHAR2
mtodo VARCHAR2,
filas_estimadas NUMBER DEFAULT NULL,
porcentaje_estimado NUMBER DEFAULT NULL);
Dnde:
esquema.- Nombre del esquema que se analiza.
mtodo.- Puede ser NULL o ESTIMATE. Si es ESTIMATE, entonces filas_estimadas o
porcentaje_estimado debe ser distintos de cero.
filas_estimadas.- Nmero de filas a estimar.
porcentaje_estimado.- Porcentaje a estimar, si se ha especificado un valor en
filas_estimadas, este parmetro se ignora.
Este paquete predefinido es propiedad del usuario SYS. Para poder ser usado por otro
usuario, debe tener el privilegio de EXECUTE. El procedimiento ANALYZE_SCHEMA,
analiza todas las tablas, agrupaciones e ndices del esquema especificado.
Ejemplo:
execute DBMS_UTILITY.ANALYZE_SCHEMA(USR_PRUEBA,ESTIMATE,0,40);
3. INITRANS.- Nmero inicial de entrada de la transaccin reservadas en cada bloque de
datos asociado al objeto. Sus posibles valores, van desde 1 a 255, por defecto es 1 y se
recomienda no cambiarlo.
Cada transaccin que actualiza un bloque, necesita una entrada de transaccin en el
bloque. Este valor asegura un mnimo de transacciones concurrentes que pueden
actualizar el bloque y ayuda a evitar la sobrecarga de reserva dinmica de espacio para
una entrada de transaccin.
4. MAXTRANS.- Nmero mximo de transacciones simultaneas o concurrentes que
pueden actualizar un bloque de datos asociados al objeto. Su valor puede ir desde 1 a
255, y es calculado en funcin del tamao del bloque. El valor asignado se recomienda
no cambiarlo.

- 83 -

Por tanto, si el nmero de transacciones concurrentes que actualizan un bloque


superan el valor especificado en el parmetro INITRANS, Oracle reserva espacio
dinmicamente para entradas de transacciones en el bloque hasta que se sobrepase el
valor del parmetro MAXTRANS, o hasta que el bloque no tiene ms espacio libre.
Todos los parmetros anteriores, pueden ser modificados usando la pestaa Almacenamiento de la
Tabla dentro del Esquema correspondiente, en el Enterprise Manager Console.

En esta ventana, aparece la opcin de Conjunto de Buffers cuya funcionalidad afecta al


objeto del esquema, es decir, mantiene en memoria cach todos los bloques del objeto.
Los posibles valores son Default, Keep y Recycle.
Keep.-

Mantiene siempre el objeto en memoria para evitar operaciones de


Entrada/Salida a disco.

Recycle.- Elimina los bloques de la memoria en el momento que no son necesarios,


evitando que un objeto ocupe espacio de cach innecesariamente.

- 84 -

Esta ventana presenta la opcin de CLCULO AUTOMTICO. En la cul se nos solicita la siguiente
informacin:
Ratio de Crecimiento.- Es el Ratio de crecimiento de la tabla esperado en filas/unidad de
tiempo (da, semana, mes o ao). Siendo el crecimiento mayor en da.
Oracle, utiliza el ratio de crecimiento para determinar el tamao (en bytes) de la siguiente
extensin (NEXT). Por tanto, el valor mnimo es un bloque (8192 Byte = 8Kbyte) .
Cuanto mayor sea la relacin filas/da, mayor ser el valor de NEXT.
Actividad de Actualizacin. (PCTFREE)
Determina el porcentaje de espacio que queda libre para las actualizaciones en cada uno de
los bloques de datos del ndice.
Superior.- Define el porcentaje de cada bloque de datos para actualizaciones de las
filas existentes.
Por ejemplo: Para un Ratio de 100 filas / da, tendramos un NEXT de 40960
Byte ( 5 bloques de 8KByte), un PCTFREE del 0 % y un PCTUSED del 60 %.
Tamao de Fila de Aumento por Actualizacin.- Disponible si la Actividad de
Actualizacin es alta, reserva el 20 por ciento de cada bloque de datos para
actualizaciones de las filas existentes, incluidas las supresiones.
Para el ejemplo anterior, obtendramos un PCTFREE del 20 %.
Inferior o Ninguno.- Reserva el 5 por ciento de cada bloque de datos para
actualizaciones de las filas existentes, es decir, un PCTFREE del 5 %.
Actividad de Insercin. (PCTUSED)
Determina el porcentaje de espacio que queda libre para las inserciones en cada uno de los
bloques de datos.
Superior.- Define el porcentaje de espacio reservado para las inserciones en un 40 por
ciento. Si incluimos las supresiones, dicho valor aumenta un 20 %, por tanto, PCTUSED
vale 60%.
- 85 -

Inferior o Ninguno: Define el porcentaje de espacio reservado para las inserciones


siempre en un 60 %.
Algunos ejemplos de sentencias SQL usadas para modificar dichos valores de
almacenamiento seran:
Ejemplo 1:
ALTER TABLE "USR_PRUEBA"."VEHICULOS"
STORAGE ( NEXT 24K MAXEXTENTS UNLIMITED PCTINCREASE 10);
Ejemplo 2:
ALTER TABLE "USR_PRUEBA"."VEHICULOS" MAXTRANS 200;
Ejemplo 3:
ALTER TABLE "USR_PRUEBA"."VEHICULOS" PCTFREE 20 PCTUSED 40
INITRANS 2
STORAGE ( NEXT 40960 PCTINCREASE 0);

- 86 -

RECUERDE

Las TABLAS son la estructura lgica de toda aplicacin de B.D.

Los tipos de DATOS usados con mayor frecuencia son: Number, Varchar2 y Date.

Los USUARIOS estn asociados a los ESQUEMAS.

Las TABLAS se pueden crear usando sentencias SQL o la herramienta grfica.

Al crear el TABLESPACE, se aconseja que ste sea gestionado localmente.

- 87 -

Tema 6

OPERACIONES SOBRE
TABLAS

6.1. INSERCIONES DE DATOS ______________________________________ 91


6.2. CONSULTAS DE DATOS _______________________________________ 95
6.3. ACTUALIZACIN Y BORRADO DE DATOS ________________________ 97
6.4. LA CLAUSULA WHERE ______________________________________ 99
6.5. RELACIONES ENTRE INSERT Y SELECT _________________________ 101
6.6. LA VISTA V$NLS_PARAMETERS _______________________________ 104
6.7. FUNCIONES PREDEFINIDAS ___________________________________ 106
6.7.1. Funciones de Carcter ____________________________________ 106
6.7.2. Funciones de Conversin __________________________________ 108
6.7.3. Funciones Numricas _____________________________________ 114
6.7.4. Funciones de Fechas _____________________________________ 115
6.7.5. Funciones de grupo ______________________________________ 118

- 89 -

6.1. INSERCIONES DE DATOS


Para insertar filas en una tabla, usaremos la sentencia SQL INSERT , cuya sintaxis es:
INSERT INTO [esquema.] tabla [ (columna1, columna2,....)]
VALUES (valor1, valor2, ....);
Ejemplo 1:
INSERT INTO vehiculos(matricula,modelo,color,cilindrada,fecha_compra,precio_venta)
VALUES (2037-BBA, RENAULT,Blanco,1400,10/01/01,6010.50);
Igual a:
INSERT INTO vehiculos VALUES (2037-BBA, RENAULT,Blanco,1400,10/01/01,6010.50);
Ejemplo 2:
INSERT INTO vehiculos VALUES (2235-AAB, SEAT,null,1400,14/03/01,6650.50);
Igual a:
INSERT INTO vehiculos(matricula,modelo,color,cilindrada,fecha_compra,precio_venta)
VALUES (2235-AAB, SEAT,null,1400,14/03/01, 6650.50);
Igual a:
INSERT INTO vehiculos(matricula,modelo,cilindrada,fecha_compra,precio_venta)
VALUES (2235-AAB, SEAT,1400,14/03/01, 6650.50);
Sin la columna COLOR, ya que es la nica que en el proceso de creacin se especific que pudiese no
tomar valor.
Para ejecutar estas sentencias, Oracle nos proporciona dos herramientas:
SQL Plus
SQLPlus Worksheet

- 91 -

Desde SQLPlus Worksheet, una vez conectado, slo tendramos que ejecutar la sentencia o sentencias.
Para ejecutar una sentencia, slo tendremos que pulsar la tecla F5 o hacer clic en el botn de Ejecutar.

- 92 -

Otra posibilidad es tener las instrucciones SQL escritas en un fichero de texto con extensin SQL y cargar
dicho fichero en el Worksheet.

Ahora bien desde la versin 8i, Oracle a travs de la herramienta grfica Oracle Enterprise Console,
nos proporciona la introduccin de datos. Slo tendremos que posicionarnos en la tabla y seleccionar,
una vez pulsado el clic derecho, la opcin Ver/Editar Contenido....

- 93 -

- 94 -

6.2. CONSULTAS DE DATOS


Para consultar datos de una tabla, hacemos uso de la sentencia SELECT, cuya sintaxis es:
SELECT columna1, columna2,.......
FROM [esquema.] tabla
[WHERE condiciones]
[ORDER BY columna1,columna2,.........]
[GROUP BY columna1,columna2,.........];
Podemos usar el carcter comodn * , para especificar todas las columnas o campos de la tabla.
Ejemplo 1:
SELECT matricula,modelo,color,cilindrada,fecha_compra,precio_venta FROM vehiculos;
Igual a:
SELECT * FROM vehiculos;

- 95 -

Las clusulas WHERE la estudiaremos en un apartado independiente.


Las columnas pueden tener alias, mostrndose este en lugar del nombre de la columna.

ORDER BY
Esta clusula es utilizada para mostrar el resultado de la consulta de forma ordenada por la columna o
columnas especificadas.
Ejemplo:
SELECT * FROM vehiculos ORDER BY modelo;

GROUP BY
Permite realizar consultas agrupando las columnas.
Ejemplo:
SELECT cilindrada FROM vehiculos group BY cilindrada;

- 96 -

6.3. ACTUALIZACIN Y BORRADO DE DATOS


La actualizaciones o modificaciones de los datos de las tablas se llevan a cabo usando la sentencia SQL
UPDATE.
UPDATE [esquema.] tabla SET columna1=valor_nuevo1, columna2=valor_nuevo2, ......
[WHERE condiciones];
Ejemplo 1:
UPDATE vehiculos SET modelo= OPEL, fecha_compra=20/03/01 WHERE matricula= 2235-AAB;

Para borrar los datos de una tabla usaremos la sentencia SQL DELETE, cuya sintaxis es:
DELETE [FROM] [esquema.] tabla
[WHERE condiciones];
Si no se especificase la clusula WHERE, borraramos todas las filas de la tabla.
Ejemplo 1:
DELETE FROM vehiculos WHERE matricula= 2235-AAB;

- 97 -

Ejemplo 2:
DELETE FROM vehiculos;
Igual a:
DELETE vehiculos;

- 98 -

6.4. LA CLAUSULA WHERE


Esta clusula forma parte de las instrucciones o sentencias SELECT, UPDATE y DELETE. Su finalidad
es aplicar la accin de las sentencias anteriores a un conjunto de filas que cumplan la condicin o
condiciones especificadas en la clusula WHERE.
Para especificar ms de una condicin en la clusula WHERE, usaremos los operadores booleanos AND,
OR y NOT.
Dentro de la propia condicin, podemos usar los operadores:
= , > , < , >= , <= , <>, != , LIKE, IN, BETWEEN, IS NULL.
LIKE
Este operador se usa para comparacin con patrones en cadena de caracteres. El carcter % equivale a
un conjunto de caracteres y el carcter _ equivale a un slo carcter.
Ejemplo:
SELECT * FROM vehiculos WHERE matricula LIKE '%AAB';
IN
Este operador compara la columna con un conjunto de posibles valores.
Ejemplo:
SELECT * FROM vehiculos WHERE modelo IN ('RENAULT','SEAT')
BETWEEN
Este operador usa los operadores >= y <= en uno slo.
Ejemplo:
SELECT * FROM vehiculos WHERE cilindrada BETWEEN 1000 and 1400;
SELECT * FROM vehiculos WHERE precio_venta BETWEEN 6010.40 and 6500.50;

- 99 -

IS NULL
Para consultar filas dnde existan columnas con valor NULL, usamos IS NULL ya que la condicin =
NULL, no dara un resultado correcto.

- 100 -

6.5. RELACIONES ENTRE INSERT Y SELECT


Podemos realizar el INSERT conjuntamente con SELECT para realizar de esta forma copias masivas de
unas tablas a otras dnde las columnas a copiar sean idnticas en tipos de datos.
INSERT INTO vehiculos_copia SELECT modelo,precio_venta FROM VEHICULOS;

Otra forma de hacer una copia de una tabla es crear la tabla y seleccionar los datos en el proceso de
creacin.
CREATE TABLE nueva_tabla AS SELECT * FROM [esquema.] tabla;

- 101 -

La tabla creada contiene la misma estructura de datos que la tabla origen, PERO NO las restricciones.
Desde la herramienta Enterprise Manager Console, podemos hacer una copia de la tabla usando el
botn Crear como.... Esta opcin nos permite crear una copia de la tabla tanto de datos como de
restricciones.

- 102 -

- 103 -

6.6. LA VISTA V$NLS_PARAMETERS


La vista v$nls_parameters, me informa de los valores de NLS_LANGUAGE, NLS_TERRITORY, etc.,
establecidos en la B.D.
Ejemplo:
Select * from v$nls_parameters;
Valores devueltos por la vista en una B.D. Oracle 8.05:
PARAMETER

VALUE

NLS_LANGUAGE

SPANISH

NLS_TERRITORY

SPAIN

NLS_CURRENCY

NLS_ISO_CURRENCY

SPAIN

NLS_NUMERIC_CHARACTERS

,.

NLS_CALENDAR

GREGORIAN

NLS_DATE_FORMAT

DD/MM/RR

NLS_DATE_LANGUAGE

SPANISH

NLS_CHARACTERSET

WE8ISO8859P1

NLS_SORT

SPANISH

NLS_NCHAR_CHARACTERSET

WE8ISO8859P1

11 filas seleccionadas.
Valores devueltos por la vista en una B.D. Oracle 9i:
PARAMETER

VALUE

NLS_LANGUAGE

SPANISH

NLS_TERRITORY

SPAIN

NLS_CURRENCY

- 104 -

NLS_ISO_CURRENCY

SPAIN

NLS_NUMERIC_CHARACTERS

,.

NLS_CALENDAR

GREGORIAN

NLS_DATE_FORMAT

DD/MM/RR

NLS_DATE_LANGUAGE

SPANISH

NLS_CHARACTERSET

WE8MSWIN1252

NLS_SORT

SPANISH

NLS_TIME_FORMAT

HH24:MI:SSXFF

NLS_TIMESTAMP_FORMAT

DD/MM/RR HH24:MI:SSXFF

NLS_TIME_TZ_FORMAT

HH24:MI:SSXFF TZR

NLS_TIMESTAMP_TZ_FORMAT

DD/MM/RR HH24:MI:SSXFF TZR

NLS_DUAL_CURRENCY

NLS_NCHAR_CHARACTERSET

AL16UTF16

NLS_COMP

BINARY

NLS_LENGTH_SEMANTICS

BYTE

NLS_NCHAR_CONV_EXCP

FALSE

19 filas seleccionadas.
Ver la lista de lenguajes y territorios soportados por Oracle 9i en el Anexo A.

- 105 -

6.7. FUNCIONES PREDEFINIDAS


El lenguaje SQL, nos proporciona funciones SQL predefinidas. Dichas funciones las podemos agrupar en
diferentes categoras:
6.7.1. Funciones de Carcter
CHR(x) .- Devuelve el carcter correspondiente al nmero x del conjunto de caracteres.
Select chr(123) from dual;
CONCAT(cadena1, cadena2).- Devuelve la unin de la cadena1 con la cadena2, es idntica

al

operador ||.
INITCAP(cadena).- Convierte a mayscula la primera letra de la cadena y a minscula el resto. Si en la
cadena existen palabras separadas por blancos, tambin el primer carcter es convertido a mayscula.
LOWER(cadena) y UPPER(cadena).- Devuelven la cadena en minscula (Lower) y mayscula (Upper)
respectivamente.
LTRIN(cadena1, [cadena2]) y RTRIN(cadena1, [cadena2]).- Devuelve la cadena1, quitando los
caracteres por la izquierda y derecha respectivamente especificados en cadena2. Si no se especifica
cadena2, el valor tomado es el espacio en blanco.
REPLACE(cadena, cadena_a_buscar, [nuevo_valor]).- Esta funcin reemplaza en cadena la
cadena_a_buscar por el valor dado en nuevo_valor. Si nuevo_valor se omite, en cadena se reemplazan
todos los valores existentes que coincidan con nuevo_valor, por blancos.
RPAD(cadena1,x, [cadena2]).- Devuelve la cadena1, rellena por la derecha con los valores de la
cadena2, hasta completar el nmero de caracteres especificados en x. Si el nmero de caracteres de
cadena1 y cadena2 es menor a x, se repetir la cadena2.
SUBSTR(cadena,a[,b]).- Devuelve una subcadena de la cadena dada, de b caracteres de longitud desde
la posicin a.

- 106 -

Ejemplo:

TRANSLATE(cadena, valor_inicial, valor_final).- Esta funcin reemplaza en cadena los caracteres


especificados en valor_inicial por valor_final.
Valor_final, no puede tomar el valor NULL.
Ejemplo:
Select TRANSLATE('ABCABC', 'B', 'X') Resultado from dual;
Resultado: AXCAXC
Las funciones anteriormente explicadas, devuelven cadenas de caracteres. Existen funciones que reciben
como argumento cadenas de caracteres pero devuelven un nmero. Algunas de estas son:
ASCII(cadena).- Devuelve el nmero correspondiente al carcter especificado en el parmetro cadena.
Ejemplo: Select ASCII('&') Resultado from dual;
Resultado: 38
Si ejecutamos la sentencia Select CHR(38) Resultado from dual, mostrar el carcter &.

- 107 -

INSTR(cadena1, cadena2 [,a [,b] ] ).- Devuelve la posicin dentro de la cadena1 dnde est contenida
la cadena2. Por defecto se explora desde la izquierda empezando en la posicin a, si dicho valor es
negativo, se comienza desde la derecha. En b se especifica el nmero de la repeticin dentro de
cadena1. Si devuelve un cero es que cadena2 no existe en cadena1.
Ejemplo:

LENGTH(cadena).- Devuelve la longitud de una cadena, incluido los espacios en blanco existentes en
cualquier parte de la cadena.

6.7.2. Funciones de Conversin


Son usadas para realizar conversiones entre tipos de datos.
CONVERT(cadena, conjunto_caracteres_destino [,conjunto_caracteres_fuente] ).- Convierte la
cadena de caracteres desde el conjunto_caracteres_fuente al conjunto_caracteres_destino. Si no se
especifica el conjunto_caracteres_fuente, se toma por defecto el conjunto de caracteres especificado
en el proceso de instalacin de la B.D.

- 108 -

Ejemplo:
Select CONVERT('', 'WE8MSWIN1252') Resultado from dual;
Resultado:
TO_CHAR(fechas [,formato [,NLS_DATE_LANGUAGE] ]).- Convierte la fecha a una cadena de
caracteres del tipo varchar2.
El parmetro formato se usa para controlar el resultado de salida.
NLS_DATE_LANGUAGE se usa para el idioma de salida de los componentes de la cadena devuelta (da
y mes) y las abreviaturas de fecha (AM, PM, aC, dC). Los idiomas soportados se especifican en el
parmetro de configuracin de Oracle denominado NLS_LANGUAGE que en nuestro caso es
AMERICAN. El valor se asigna de la siguiente forma: NLS_DATE_LANGUAGE=idioma.

- 109 -

- 110 -

El parmetro formato puede tomar los siguientes valores:


texto

Texto encerrado entre dobles comillas.

Da de la semana (1-7).

DD

Da del mes (1-31).

DDD

Da del ao (1-366).

DY

Nombre Abreviado del da. (Las tres primeras letras)

DAY

Nombre del da, rellenado con espacios en blanco hasta nueve caracteres.

IW

Nmero de Semana del Ao.(1-52 53)

Semana del mes. (1-5)

IYYY,IYY,IY,I

Los cuatro, tres, dos o un dgito del ao.

Y,YYYY

Ao con una coma en esa posicin.

YEAR

Ao en letras.

HH,HH12,HH24

Horas especificadas de 1 a 12 de 0 a 23.

MI

Minutos. (0-59)

MM

Meses en nmero. (1-12)

MON

Nombre abreviado del mes.

MONTH

Nombre del mes, rellenado con espacios en blanco hasta nueve caracteres.

PM, P.M.

PostMeridian (Despus de Medio da)

Trimestre del ao. (1-4)

RM

Meses en nmeros romanos.

SS

Segundos (0-59)

WW

Semana del ao (1-53). La primera semana comienza el primer da del ao hasta el


sptimo da.

Ejemplos:
Select TO_CHAR (to_date('22/12/03'),' "Semana" IW "del Ao 2003" ') Resultado from dual;
RESULTADO
Semana 52 del Ao 2003

- 111 -

TO_CHAR(numero [,formato [,NLS_NUMERIC_ CHARACTERS NLS_CURRENCY]]).- Convierte el


valor de numero de tipo NUMBER a VARCHAR2.
El parmetro formato se usa para controlar el resultado de salida.
En NLS_NUMERIC_CHARACTERS =decimalmiles

especifica el separador decimal y de miles

(Grupo), entre dobles comillas simples.


En NLS_CURRENCY=moneda se especifica la moneda. El valor por defecto de este parmetro lo
determina NLS_TERRITORY.
Ejemplo:
'NLS_NUMERIC_CHARACTERS=' ',.' ' NLS_CURRENCY=' 'Euros' ' '
El parmetro formato puede tomar los siguientes valores:
9

Cada nmero 9 representa un dgito significativo del resultado.

Devuelve ceros por la izquierda.

FM

Devuelve un valor sin blancos a la izquierda.

RM o rm

Devuelve el nmero como nmero romano en mayscula o minscula


respectivamente.

EEEE

Devuelve el valor utilizando notacin cientfica.

Devuelve un punto Decimal en la posicin especificada.

Devuelve un separador de grupo en la posicin especificada.

.,

Devuelve un punto o coma en la posicin especificada independientemente de G o


D

Devuelve el smbolo de Moneda Local en la posicin especificada.

Devuelve la moneda ISO. (EUR)

PR

Nmeros negativos entre < >

Signo + o - por la izquierda.

Ejemplos:

Select TO_CHAR(1457,'09999') from dual;

- 112 -

Resultado: 01457

Select TO_CHAR(15,'RM') from dual;

Resultado: XV

Select TO_CHAR(1000000,'9EEEE') from dual;

Resultado: 1E+06

Select TO_CHAR(1000000,'9G999G999D99') from dual;

Resultado: 1.000.000,00

Select TO_CHAR(1000000.78,'9,999,999.99') from dual;

Resultado: 1,000,000.78

Select TO_CHAR(10000.78,'L9G999G999D99') from dual;

Resultado: 10.000,78

Select TO_CHAR(10000.78,'C9G999G999D99') from dual;

Resultado: EUR10.000,78

Select TO_CHAR(-10000.78,'S9G999G999D99') from dual;

Resultado: -10.000,78

- 113 -

TO_DATE (cadena [,formato [,NLS_DATE_LANGUAGE]]).- Convierte una cadena VARVHAR2 o CHAR


en un valor de tipo DATE. El formato es una cadena del tipo de formato especificado en
TO_CHAR(fechas [,formato [,NLS_DATE_LANGUAGE] ]). TO_CHAR y TO_DATE tienes funciones
inversas.
Ejemplo:
Select TO_DATE('Mar 14 Ene','DY DD Mon') from dual;
Resultado: 14/01/03
TO_NUMBER(cadena [,formato[,NLS_DATE_LANGUAGE]]).- Convierte la cadena CHAR o VACHAR2
a un tipo NUMBER. Si se especifica un formato, la cadena debe ser igual al formato especificado.
Ejemplo:
Select TO_NUMBER('02.78','09.99') from dual;
Resultado: 2,78

6.7.3. Funciones Numricas


Estas funciones permiten argumentos de tipo NUMBER y devuelven valores de tipo NUMBER.
Algunas de estas funciones son:
ABS(x).- Devuelve el valor absoluto de x.
MOD(x,y).- Devuelve el resto de dividir x entre y. Si y es cero, devuelve x.
POWER(x,y).- Devuelve x elevado a y. No necesitan ser nmeros enteros positivos ni x ni y, salvo si x
es negativo, entonces y debe ser un nmero entero.
ROUND(x, [,y]).- Devuelve el valor de x redondeado a y posiciones a partir del nmero decimal.
Ejermplo:
Select ROUND(435.56789,4) from dual;

- 114 -

Resultado: 435,5679
TRUNC(x, [,y]).- Devuelve el valor de x redondeado a y posiciones a partir del nmero decimal.
Ejermplo:
Select TRUNC(-123.556), TRUNC(-123.356,2) from dual;
Resultado:
TRUNC(-123.556) es -123
TRUNC(-123.356,2) es -123,35
SIGN(x).- Devuelve 1 si x es positivo, 0 si x es cero y 1 si x es negativo.
SQRT(x).- Devuelve la raz cuadrada de x.

6.7.4. Funciones de Fechas


Las funciones de fecha admiten parmetros del tipo DATE y devuelven valores del tipo DATE, salvo la
funcin MONTHS_BETWEEN que devuelve un valor de NUMBER. Algunas de estas funciones son:
SYSDATE.- Devuelve la fecha y hora del sistema, no admite argumentos.
Ejemplo:
Select to_char(SYSDATE,'dd/mm/yy hh24:mi:ss') from dual;
Resultado:08/01/03 23:11:18
ADD_MONTHS(fecha,x).- Devuelve la fecha ms x meses. El valor de x debe ser un nmero entero.
LAST_DAY(fecha).- Devuelve la fecha del ltimo da especificada en fecha. Esta funcin es til para
calcular el nmero de das que faltan para completar el mes actual.

- 115 -

Ejemplos:
Select LAST_DAY('08-01-03') from dual;
Resultado: 31/01/03
Select LAST_DAY('08-01-03') - TO_DATE('08-01-03') from dual;
Resultado: 23
Select LAST_DAY('08-01-03') - TO_DATE(sysdate) from dual;
Resultado: 23
MONTHS_BETWEEN(fecha1,fecha2).- Devuelve el nmero de meses existentes entre ambas fechas. Si
los das son los mismos entre ambas fechas, el resultado es un nmero entero, si son das distintos se
mostrar una parte decimal.
Ejemplos:
Select MONTHS_BETWEEN('01/01/03','01/01/02') from dual;
Resultado: 12
Select MONTHS_BETWEEN('02/01/03','01/01/02') from dual;
Resultado: 12,0322581
Select MONTHS_BETWEEN('31/01/03','01/01/02') from dual;
Resultado: 12,9677419
NEW_TIME(fecha,franja_horaria_1,

franja_horaria_2).-

Devuelve

la

fecha

hora

de

la

franja_horaria_2 correspondiente a la fecha especificada en fecha de la franja_horaria_1. Los valores


de los parmetros franja son cadenas de caracteres, cuyos valores pueden ser:

- 116 -

Franjas Horarias:
AST (Atlantic Standard Time) ( 4 horas menos a la GMT) (Horario Estndar del Atlntico)
ADT (Atlantic Daylight Time) ( 3 horas menos a la GMT) (Horario de Verano del Atlntico)
BST (Bering Standart Time)
BDT (Bering Daylight Time)
CST (Central Standart Time) (Horario Estndar de la zona Central)
CDT (Central Daylight Time)
EST (Eastern Standart Time) (Horario Estndar de la costa Este)
EDT (Eastern Daylight Time)
GMT (Greenwich Mean Time) (Horario del meridiano de Greenwich)
HST (Alaska-Hawaii Standart Time)
HDT (Alaska-Hawaii Daylight Time)
MST (Mountain Standart Time) (Horario Estndar de las Rocosas)
MDT (Mountain Daylight Time) (Horario de Verano de las Rocosas)
NST (Newfoundland Standart Time) (Horario Estndar de Terranova)
PST (Pacific Standart Time)
PDT (Pacific Daylight Time)
YST (Yukon Standart Time)
YDT (Yukon Daylight Time)
Ejemplos:
Select to_char(NEW_TIME(TO_DATE('8/01/02 22:00:00','DD/MM/YY HH24:MI:SS'),'GMT','AST')
,'DD/MM/YY HH24:MI:SS') from dual;
Resultado:
08/01/02 18:00:00
Podemos consultar la Pgina Web:
http://www.barceloviajes.com/franjah/horamundial.asp
NEXT_DAY(fecha,da_de_la_semana).- Devuelve la fecha del da especificado en da_de_la_semana
posterior a la fecha indicada en fecha.

- 117 -

Ejemplo:
Select NEXT_DAY('8/01/03','Martes') from dual;
Resultado: 14/01/03
6.7.5. Funciones de grupo
Estas funciones devuelven un slo resultado aplicndose sobre un conjunto de filas de datos. Son usadas
conjuntamente con la clusula GROUP BY.
Las clusulas DISTINCT y ALL pueden usarse con algunas de estas funciones de grupo.
Al usar DISTINTC la funcin slo toma aquellos valores de la consulta que sean distintos entre s.
Al usar ALL la funcin toma todos los valores devueltos por la consulta, esta es la clusula por defecto.
Partiendo de la tabla EMP del usuario SCOTT, es decir:

tendramos:
Ejemplo:

Select DISTINCT deptno from emp;


- 118 -

Resultado:
DEPTNO
10
20
30

Select deptno from emp GROUP BY deptno;

Resultado:
DEPTNO
10
20
30
AVG( [ DISTINCT || ALL] columna ).- Devuelve la media de los valores de las columnas agrupadas.
Ejemplo:

Select avg(sal) from emp;

Resultado: 2073,21429

Select avg(sal) Media,deptno from emp group by deptno;

Resultado:
Media

DEPTNO

2916,66667

10

2175

20

1566,66667

30

Select avg(distinct sal),deptno from emp group by deptno;

Si existe algn valor para la columna sal repetido, ste no se tiene en cuenta.
Resultado:
Media

DEPTNO

2916,66667

10

1968,75

20

1630

30

COUNT( * || [ DISTINCT || ALL] columna ).- Nmero de filas de la consulta.


Ejemplo:

Select count(*) Total_Filas from emp;


- 119 -

Resultado: 14

Select count( deptno) Total_Filas from emp where deptno=20;

Resultado: 5

Select count(distinct deptno) Total_Filas from emp where deptno=20;

Resultado: 1
MAX(columna ).- Devuelve el valor mximo de la columna consultada.

Select max(sal) from emp;

Resultado: 5000

Select max(sal),deptno from emp group by deptno;

Resultado:
MAX(SAL) DEPTNO
5000

10

3000

20

2850

30

MAX(columna ).- Devuelve el valor mnimo de la columna consultada.

Select min(sal) from emp;

Resultado: 800

Select min(sal),deptno from emp group by deptno;

Resultado:
MIN(SAL) DEPTNO
1300

10

800

20

950

30

SUM([ DISTINCT || ALL] columna ).- Suma de las columnas.

Select sum(sal) from emp;

Resultado: 29025

Select sum(sal),deptno from emp group by deptno;

Resultado:
SUM(SAL)

DEPTNO

8750

10

10875

20

9400

30

- 120 -

RECUERDE

Oracle usa sentencias INSERT para las inserciones de datos.

Sentencias UPDATE para las actualizaciones de los datos.

DELETE para borrado de datos.

Oracle nos proporciona una serie de funciones predefinidas para el manejos de los datos.

- 121 -

Tema 7

CONSULTAS

7.1. CLUSULA HAVING__________________________________________ 125


7.2. OPERACIONES DE CONJUNTOS EN CONSULTAS SQL _____________ 126
7.3. UNIONES INTERNAS Y EXTERNAS ______________________________ 127
7.4. SUBCONSULTAS ____________________________________________ 132
7.4.1. Select como parte de una clusula Where o Having_______________ 132
7.4.2. Select como una tabla_____________________________________ 134
7.4.3. Select como una columna a mostrar __________________________ 134
7.4.4. Select como parte de una clusula Having _____________________ 136
7.5. CONSULTAS RECURSIVAS ____________________________________ 137
7.6. CONSULTAS CON LA FUNCIN DECODE ________________________ 139

- 123 -

7.1. CLUSULA HAVING


La clusula HAVING se usa conjuntamente con la clusula GROUP BY. Acta igual que una clusula
WHERE, salvo que la condicin se aplica al resultado de la agrupacin. Sera:
Select campo1, count(campo2) from tabla
Where campo1 = condiccin
Groub by campo1
Having count(campo2) = condicin;
En este tipo de sentencias, Oracle filtra los registros segn la condicin del where antes de agrupar. Una
vez filtrado agrupa, y despus aplica la condicin de la clusula having.
Veamos un ejemplo aplicado a la tabla EMP (Empleados) del usuario Scott/tiger de Oracle. Aqu, se
solicitan nmeros de los departamentos que posean ms de dos empleados cuyo puesto de trabajo sea
CLERK. (Comercial).

- 125 -

7.2. OPERACIONES DE CONJUNTOS EN CONSULTAS SQL


SQL, nos permite hacer uso de los operadores de conjuntos para obtener datos de ms de una tabla.
Estos son UNION, UNION ALL, INTERSECT y MINUS.
A la hora de hacer uso de estos operadores, los campos o columnas implicadas deben ser del mismo tipo
de dato.
UNION.- Al usar este operador obtenemos todas las filas de las tablas implicadas, pero sin repeticin de
datos.
Por ejemplo, si partimos de una tabla A={1,2,3,4,5} y otra B={4,5,7,8,9} y realizamos:
Select * from A
UNION
Select * from B;
El resultado es: 1,2,3,4,5,7,8,9.
UNION ALL.- Todas las filas de las tablas, incluyendo los valores repetidos. Para las tablas del ejemplo
anterior tendramos:
Select * from A
UNION ALL
Select * from B;
El resultado es: 1,2,3,4,5,4,5,7,8,9.
INTERSECT.- Nos proporciona las filas comunes de las tablas especificadas.
Para el conjunto de valores de las tablas A y B anteriores obtendramos:
Select * from A
INTERSECT
Select * from B;
El resultado es: 4,5.
MINUS.- Este operador nos muestra todas las filas de la primera tabla salvo los que sean comunes a la
segunda tabla. Para los datos A={1,2,3,4,5} y B={4,5,7,8,9} tendramos:
Select * from A
MINUS
Select * from B;
El resultado es: 1,2,3.

- 126 -

7.3. UNIONES INTERNAS Y EXTERNAS


Uniones Internas.- Son aquellas que combinan las filas de dos o ms tablas usando para ello campos o
columnas de las tablas comunes, es decir, usando las columnas Primery Key y Foreing Key.
Este tipo de uniones slo devuelve las filas comunes entre ambas tablas, NUNCA devuelve filas que no
estn en una tabla y en otra no.
Un ejemplo aplicado a las tablas EMP y DEPT del usuario Scott/tiger sera la siguiente:

Con esta select obtendramos los nombres de los empleados, sus puestos de trabajo y el nombre del
departamento al que pertenece.
Uniones Externas.- Combina filas de tablas relacionadas entre s por una o ms columnas comunes. La
diferencia con las uniones internas, es que este tipo de uniones puede devolver filas de una tabla que no
existan en otra.
- 127 -

Para ello, usamos la simbologa(+), en la parte de la condicin de la clusula where de la tabla de la cual
esperamos no obtener filas.
Por ejemplo si tuvisemos dos tablas CLIENTES y PEDIDOS y quisiramos obtener todos los datos de
TODOS los clientes hayan o no realizado pedidos, el operador (+) debe ir asociado a la tabla PEDIDOS.
Haciendo uso del usuario Scott/tiger, vamos a insertar un Departamento nuevo en la tabla DEPT:
insert into dept values(99,'INFORMATICA','SEVILLA');
Si ejecutamos la consulta de la unin interna pero especificando la simbologa (+) en la columna asociada
a la tabla EMP obtendremos todos los departamentos existente tengan o no empleados.
Es decir:
select e.DEPTNO,e.ename,e.job,d.dname,d. DEPTNO
from emp e, dept d
where e. DEPTNO (+)=d. DEPTNO;

- 128 -

Ahora bien, el caso contrario:


select e.DEPTNO,e.ename,e.job,d.dname,d.DEPTNO
from emp e, dept d
where e.DEPTNO=d.DEPTNO (+) ;
me debe mostrar todos los empleados existentes, tengan o no departamento asociado.
Este caso nunca se dar ya que por la propia definicin de la estructura de la tabla empleado se ha
impuesto una restriccin FOREING KEY hacia el campo DEPTNO.

- 129 -

El resultado sera igual al de una consulta interna.

Estas UNIONES EXTERNAS son conocidas tambin como JOIN que pueden ser JOIN por la derecha
(RIGHT JOIN) o JOIN por la izquierda (LEFT JOIN), dependiendo de lo que se desee obtener.
El equivalente a:
select e.DEPTNO,e.ename,e.job,d.dname,d. DEPTNO
from emp e, dept d
where e. DEPTNO (+)=d. DEPTNO;
Sera:
select emp.DEPTNO,emp.ename,emp.job,dept.dname,dept.deptno
from dept LEFT JOIN emp ON
emp.deptno=dept.deptno;
Es decir, JOIN LEFT por la izquierda y a la izquierda tenemos la tabla DEPT (departamento), nos
seleccionar todos los departamentos tengan o no empleados.

- 130 -

Este mismo resultado lo podemos obtener con RIGHT JOIN, pero cambiando las tablas, es decir,
empleado (emp) a la izquierda y departamento (dept) a la derecha.

select
emp.DEPTNO,emp.ename,emp.job,
dept.dname,dept.deptno
from emp RIGHT JOIN dept ON
emp.deptno=dept.deptno;

- 131 -

7.4. SUBCONSULTAS
Una subconsulta es una sentencia SELECT dentro de otra sentencia SELECT (consulta principal).
La sentencia Select se puede encontrar como:

Como parte de una clusula Where.

Como una tabla.

Una columna a mostrar.

Como parte de una clusula Having.

Adems, siempre deben ir entre parntesis y nunca deben contener la clusula ORDER BY, ni pueden
ser UNION de varias sentencias select.

7.4.1. Select como parte de una clusula Where o Having


Supongamos que tenemos una tabla Clientes y otra Ventas. En esta ltima se almacenan el total de
ventas realizadas a los clientes. Partiendo de la estructura:
CLIENTES={ID_CLIENTE, Descrip_Cliente}
VENTAS={ID_VENTA, TOTAL_VENTAS, CLI_ID_CLIENTE}
Si tenemos los datos:
CLIENTES
100

Juan Martos Galn

150

La papelera s.a.

160

Librera Tcnica s.l.

200

Mara Garca Acosta

210

Jos Martn Rubio

VENTAS
1

2.500

100

5.000

150

9.500

160

2.350

200

3.750

210

- 132 -

Si queremos obtener los clientes cuyas ventas superan la media de ventas de la empresa, sera:
Select Descrip_Cliente,total_ventas from clientes,ventas
where ID_CLIENTE=CLI_ID_CLIENTE
and TOTAL_VENTAS > ( select avg(TOTAL_VENTAS) from VENTAS);
Resultado:
La papelera s.a.

5000

Librera Tcnica s.l.

9500

Jos Martn Rubio

3750

Otro ejemplo aplicado a la tabla EMP del usuario Scott/tiger podra ser: Obtener los nombres y salarios
de los empleados cuyo sueldo sea superior a la media de sueldos de la empresa?

- 133 -

7.4.2. Select como una tabla


Si en el ejemplo anterior se desease mostrar el valor de la media, podramos incluir la sentencia select
como una tabla referenciada en la consulta principal, es decir, en el from.

7.4.3. Select como una columna a mostrar


Este es el caso en el cual la sentencia select es tratada como una columna de la sentencia select
principal.
Por ejemplo, supongamos dos tablas:
CLIENTES={ID_CLIENTE, Descrip_Cliente}
VENTAS={ID_VENTA, TOTAL_VENTAS, FECHA_VENTA, CLI_ID_CLIENTE}

- 134 -

Si tenemos los datos:


CLIENTES
100

Juan Martos Galn

150

La papelera s.a.

160

Librera Tcnica s.l.

200

Mara Garca Acosta

210

Jos Martn Rubio

VENTAS
1

2.500

2/1/03

100

5.000

10/1/03

150

9.500

5/01/03

160

2.350

12/01/03 200

3.750

15/01/03 210

1.250

18/01/03 150

3.500

4/01/03

160

7.500

4/01/03

210

2.900

10/12/02 100

10

7.000

11/01/03 210

Si deseamos obtener la ltima fecha de venta de cada uno de nuestros clientes sera:
Select

Id_cliente,Descrip_Cliente,

(select

MAX(FECHA_VENTA)

cli_id_cliente=id_cliente)
From clientes.

- 135 -

from

VENTAS

where

Este mismo resultado se podra obtener mediante el uso de GROUP BY y ORDER BY.
Select Id_cliente,Descrip_Cliente, MAX(FECHA_VENTA)
From clientes,VENTAS
WHERE id_cliente =cli_id_cliente
GROUP BY Id_cliente,Descrip_Cliente
ORDER BY 1;

7.4.4. Select como parte de una clusula Having


Hemos dicho que la clusula HAVING se aplica a las condiciones que afectan a funciones de
agrupamiento (SUM, MAX, COUNT,.....).
Una consulta muy tpica es aquella que deseamos que nos muestre el artculo ms vendido y en qu
cuanta o el cliente que ms nos ha comprado y qu cantidad.

- 136 -

Basndonos en los datos de las tablas CLIENTES y VENTAS, para obtener el cliente que ms compras
ha realizado, sera la siguiente sentencia SQL:
select sum(TOTAL_VENTAS),ID_CLIENTE,DESCRIP_CLIENTE
from clientes c, ventas v
where c.id_cliente=v.cli_id_cliente
group by ID_CLIENTE,DESCRIP_CLIENTE
having sum(TOTAL_VENTAS) = (SELECT max(SUM(TOTAL_VENTAS)) FROM VENTAS GROUP BY
CLI_ID_CLIENTE);

7.5. CONSULTAS RECURSIVAS


Son un tipo de consultas que se crean para recorrer tablas dnde una columna foreing key puede tomar
el valor nulo o el valor de la columna primery key de una fila o registro de la misma tabla.
Por ejemplo: supongamos una tabla que almacena la informacin de los mens de una aplicacin
informtica:

- 137 -

MENU
ID_MENU

DESCRIPCION

ID_PADRE

ARCHIVO

Salir

NAVEGADOR

Refrescar

Buscar

Si deseamos saber cuantos submens o hijos poseen los nodos o men principales, debemos hacer una
consulta como:
select m1.id_menu,m1.descripcion,count(*)
from menu m1, menu m2
where m1.id_menu=m2.id_padre
group by m1.id_menu,m1.descripcion;
El resultado sera:

- 138 -

7.6. CONSULTAS CON LA FUNCIN DECODE


La funcin DECODE es equivalente a la instruccin de bifurcacin IF-THEN-ELSE. Su sintaxis es:
DECODE(expresion, valor_a_comparar1, valor1, valor_a_comparar2, valor2,.............,valorfinal)
La expresin se compara con los valores_a_comparar si cumple alguno, entonces devuelve valor si
no cumple ninguno de ellos, devuelve valorfinal.
Dentro de una consulta SQL, sera:
select decode(job,'ANALYST','Analista de cuentas',job) from emp;

- 139 -

RECUERDE

La clusula HAVING es como una clusula WHERE, pero se aplica a las columnas de
agrupacin.

Podemos usar en las consultas los operadores de conjunto.

Una consulta puede formar parte de otra consulta.

- 140 -

Tema 8

PL/SQL

8.1. DEFINICIN DE PL/SQL _______________________________________ 143


8.2. PARTES DE UN PROGRAMA PL/SQL ____________________________ 144
8.2.1. Bloques _______________________________________________ 144
8.2.2. Variables y Constantes ____________________________________ 145
8.2.3. Instrucciones o Estructuras de Control ________________________ 154
8.2.4. Tratamientos de Errores (Exception) __________________________ 156

- 141 -

8.1. DEFINICIN DE PL/SQL


Podemos definir PL/SQL (Procedural Language/Structured Query Language) como un lenguaje de
programacin utilizado para acceder a la informacin existente en una B.D. relacional.
La gran ventaja de PL/SQL es que incluye las caractersticas de un lenguaje de 3GL y 4GL, es decir,
tercera y cuarta generacin. Por lo que podemos usar instrucciones del tipo INSERT, DELETE, UPDATE,
etc. propias de los lenguajes de 4GL, dnde se dice lo que queremos hacer pero no se detalla cmo
hacerlo. Al mismo tiempo, con PL/SQL podemos usar las caractersticas de los lenguajes de 3GL cmo:

Declaraciones de variables.

Instrucciones de bifurcacin, repeticin.

Declaraciones de procedimientos, funciones, etc.

Ejemplo de cdigo PL/SQL:


DECLARE
vi_password

NUMBER

:= 12525;

vi_nombre

VARCHAR2(10) := Juan;

vi_apellido1

VARCHAR2(10) :=Garca;

vi_apellido2

VARCHAR2(10) :=Martn;

BEGN
UPDATE usuarios SET password = vi_password WHERE nombre = vi_nombre
AND apellido1 = vi_apellido1,
AND apellido2 = vi_apellido2;
IF SQL%NOTFOUND THEN
INSERT INTO usuarios (nombre,apellido1,apellido2,edad)
VALUES (vi_nombre,vi_apellido1,vi_apellido2,vi_edad);
END IF
END;

Podemos observar instrucciones propias de un lenguaje de cuarta y tercera generacin.

- 143 -

8.2. PARTES DE UN PROGRAMA PL/SQL

8.2.1. Bloques
Todo programa PL/SQL se divide en bloques o secciones. La estructura de un bloque es:

DECLARE
/* Bloque declarativo.- Es dnde declaramos las variables internas, cursores,
procedimientos y funciones locales del bloque. */

BEGIN
/* Bloque principal o ejecutable.- Dnde desarrollamos la ejecucin del programa. */

EXCEPTION
/* Bloque exception o errores.- En l tratamos las excepciones de ERROR*/
END; - - El punto y coma es obligatorio.
La nica parte que es obligatoria dentro de un bloque es la seccin o bloque ejecutable. Por lo que
podemos desarrollar bloques sin secciones declarativas y sin secciones de error, bien porque no se
requieran o no las necesitemos.
Ejemplo 1:
BEGN
-- Bloque ejecutable
END;

- 144 -

Ejemplo 2:
DECLARE
-- Bloque declarativo
BEGN
-- Bloque ejecutable
END;
Los bloques pueden estar situados de forma secuencial o anidados.

8.2.2. Variables y Constantes


Las variables son las encargadas de almacenar la informacin que interactuar con la B.D. Las
constantes son un tipo de variable cuyo valor es invariable.
Ambas se declaran en la seccin DECLARE de un bloque PL/SQL.
Su sintaxis es:
nombre_variable [CONSTANT] tipo_de_dato [ [NOT NULL] {DEFAULT || :=} expresin ]
Los tipos de datos son:

- 145 -

BINARY_INTEGER

Valores enteros entre:


2.147.483.647 y 2.147.483.647
Si su valor es desbordado no se produce error.
Esto no ocurre en Oracle 9i.

NUMBER

Valores fijos o de coma flotante desde 1-130 a 10125

PLS_INTEGER

Valores enteros entre:


2.147.483.647 y 2.147.483.647
Si su valor es desbordado produce el error:
ORA-1426: numeric overflow

CHAR

Almacena cadena de caracteres de longitud fija:


32.767 bytes. Un CHAR de un campo o columna de
la B.D. slo admite 2.000 byte.

VARCHAR2

Puede contener cadena de caracteres de longitud


variable hasta 32.767 bytes. Un VARCHAR2 de un
campo o columna de la B.D. slo admite 4000
caracteres.

DATE

Guarda valores relacionados con fechas, horas,


minutos y segundos.

BOOLEAN

TRUE, FALSE

ROWID

Direccin fsica de una fila de la tabla.

UROWID

Direccin fsica de una fila de la tabla particionada.

CLOB

Almacena caracteres de GRAN TAMAO, hasta 4


GBytes.

BLOB

Almacena objetos binarios de GRAN TAMAO,


hasta 4 GBytes.

BFILE

Archivo binario externo, siendo el S.O. quien


determina el Tamao. Su acceso es de slo lectura.
Su informacin no es gestionada por Oracle, sino
por el S.O. por lo que no estn sujetos a
transacciones.

- 146 -

Tipos de Datos Especiales:


RECORD
TABLE
VARRAY
REF_CURSOR
RECORD
Es un tipo de dato definido por el usuario que engloba a ms de un tipo de dato simple.
Ejemplo 1:
-- Declaramos el tipo.
TYPE reg_cliente IS RECORD
(
id_cliente NUMBER(5),
Descripcion VARCHAR2(30)
);
-- Declaramos una variable del tipo anterior.
vi_registro reg_cliente;
Ejemplo 2:
TYPE reg_fecha_hora IS RECORD
(
dia number(2),
mes numer(2),
anyo number(4),
hora number(2),
minuto number(2)
);
-- Declaramos una variable del tipo anterior.
vi_datos reg_fecha_hora;

- 147 -

Para referencia a un componente del tipo RECORD es:


nombre_variable.componente;
Ejemplo:
vi_registro.descripcion;
vi_datos.dia;
Operador %TYPE y %ROWTYPE
Estos operadores nos sirven para asignar el tipo de dato de una columna de una tabla (campo) o de toda
una fila (registro) de la tabla.
Ejemplo 1:
DECLARE
vi_descripcion clientes.descripcion%TYPE;
Ejemplo 2:
DECLARE
vi_registro_clinete clientes%ROWTYPE;
Ejemplo 3:
Podemos leer un registro concreto de una tabla y almacenar su contenido en una variable de tipo registro.
DECLARE
TYPE reg_cliente IS RECORD
(
id_cliente NUMBER(3),

- 148 -

Descripcion VARCHAR2(30)
);
vi_registro reg_cliente;
BEGIN
select id_cliente,descrip_cliente INTO vi_registro from clientes where id_cliente=200;
dbms_output.put_line(vi_registro.id_cliente);
dbms_output.put_line(vi_registro.descripcion);
END;

Usando el operador %ROWTYPE, tendramos:

- 149 -

TABLE
Podemos decir que este tipo de dato es un Array, Vector, Tabla o Matriz especial ya que como
diferencia su ndice no tiene porque empezar en 0 1, pudiendo tomar valores desde los nmeros
2.147.483.647 a 2.147.483.647, es decir, BINARY_INTEGER.
Al igual que los RECORD, para poder hacer uso de Matrices, debemos definir primero un tipo de dato
propio y despus una variable de ese tipo.
Para declarar el TIPO sera:
TYPE nombre_tabla IS TABLE OF tipo_dato INDEX BY BINARY_INTEGER;
Despus necesitaremos una Variable de ese tipo:
vi_matriz nombre_tabla;
El tipo_dato es un tipo de dato bsico. Podemos especificar tambin como tipo de dato el tipo de un
campo de una tabla.
Ejemplos:
DECLARE
-- Tipos
TYPE matriz_fecha IS TABLE OF date INDEX BY BINARY_INTEGER;
TYPE matriz_cliente IS TABLE OF clientes.id_cliente%TYPE INDEX BY BINARY_INTEGER;
-- Variables
vi_matriz_fecha matriz_fecha;
vi_matriz_cliente matriz_cliente;
Para tomar un valor de la matriz o asignrselo a la matriz es:
nombre_variable_tipo_matriz (indice);
Para el ejemplo sera:
vi_matriz_fecha(1):=sysdate;

- 150 -

Tambin se pueden crear Matrices de Registros:


TYPE matriz_cliente IS TABLE OF clientes.%ROWTYPE INDEX BY BINARY_INTEGER;
vi_matriz_cliente matriz_cliente;
Para referenciar los datos sera:
vi_matriz_cliente(indice).descrip_cliente;
Ejemplo:
Vamos a almacenar en una tabla llamada vi_matriz_cliente en el ndice 160 el registro correspondiente al
cliente 160.

Oracle nos permite hacer uso de una serie de ATRIBUTOS de una matriz mediante el nombre de la
variable matriz y el nombre del atributo, es decir: vi_matriz_cliente.COUNT
Estos atributos son los siguientes:
COUNT
DELETE
EXISTS
FIRST
LAST
NEXT
PRIOR

Devuelve el nmero de filas de la tabla.


Borra filas de la tabla.
Devuelve TRUE si existe en la tabla el ndice especificado.
Devuelve el ndice de la 1 fila.
Devuelve el ndice de la ltima fila.
Devuelve el ndice de la siguiente fila a la especificada.
Devuelve el ndice de la anterior fila a la especificada.

- 151 -

vi_matriz.DELETE.- Borra toda la matriz.


vi_ matriz.DELETE(indice).- Borra el elemento de la matriz cuyo ndice es el especificado en ndice.
vi_ matriz.DELETE(indice_inicial, indice_final).- Borra los elementos de la matriz cuyos ndices estn
entre indice_inicial e indice_final.
vi_ matriz.EXISTS(indice).- Devuelve TRUE si la tabla contiene una fila con el ndice especificado en
ndice.
vi_ matriz.NEXT(indice).-Obtenemos el siguiente ndice de la tabla, al especificado en el ndice.
vi_ matriz.PRIOR(indice).- Obtenemos el ndice anterior de la tabla, al especificado en el ndice.

VARRAY
Este tipo de dato es equivalente a las matrices, vectores o arrays de otros lenguajes de programacin,
dnde el ndice comienza en 1 y se especifica en su declaracin el ndice lmite.
Su sintaxis es:
TYPE nombre_del_array IS VARRAY(tamao_maximo)} OF tipo_dato [NOT NULL]
NOTA: tipo_dato no puede ser: BOOLEAN, NCHAR, NCLOB, NVARCHAR2, REF CURSOR, TABLE ni
por supuesto otro tipo VARRAY.
Ejemplos:
DECLARE
TYPE array_fecha IS VARRAY(20) OF date;
TYPE array_registro IS VARRAY(10) OF cliente%ROWTYPE;
Una vez especificado el tipo, necesitamos la variable:
vi_array array_registro;
Al tipo de datos VARRAY, podemos aplicarle los mismos atributos que existen para el tipo e dato TABLE.

- 152 -

Ejemplo de VARRAY:

REF CURSOR
Este tipo de dato nos permite definir variables de tipo cursor. Sern tratadas en el tema correspondiente a
los cursores.
El AMBITO de una variable est sujeto al mdulo DECLARE existente por encima de un bloque de
cdigo BEGIN-END. Por ejemplo:
DECLARE
Variable1 NUMBER(10);
BEGIN
DECLARE
Variable2 VARCHAR2(50);
BEGIN
/* AMBITO de Variable2 */
END;
END;

- 153 -

8.2.3. Instrucciones o Estructuras de Control


Las instrucciones o estructuras de control de PL/SQL son las tpicas de todo lenguaje de programacin,
es decir las instrucciones de BIFURCACION y los BUCLES.
Bifurcacin.
La sintaxis de la instruccin de bifurcacin es:
IF expresin THEN
Sentencias;

[ELSIF expresin THEN


secuencias;]
........

[ELSE
sentencias;]
END IF;

Ejemplo:
Partiendo de los datos de la tabla
VENTAS existentes en la imagen
grfica, deseamos saber si la suma
de las ventas del cliente cuyo
id_cliente es 100, superan los 5.000
Euros. Como resultado debemos
mostrar el mensaje Total de
compras superior a 5.000 Euros o
Total de compras inferior a 5.000
Euros

- 154 -

El resultado sera:

Bucles
Un bucle permite ejecutar una sentencia o conjunto de sentencias, un nmero determinado de veces.
Bucles LOOP
Su sintaxis es:
LOOP
Sentencias;
EXIT WHEN condicin;
END LOOP;
Este bucle finalizar cuando la condicin sea verdadera. La instruccin EXIT WHEN condicin; es
equivalente a usar
IF condicion THEN
EXIT;
END IF;

- 155 -

Bucles WHILE
Su sintaxis es:
WHILE condicion LOOP
Sentencias;
END LOOP;
Este bucle finalizar cuando la condicin sea falsa.
Bucles FOR
Su sintaxis:
FOR variable_contador IN [REVERSE] valor_inferior..valor_superior LOOP
Sentencias;
END LOOP;
variable_contador es el valor de INICIAL para recorrer el rango de valores comprendido entre
valor_inferior y valor_superior.
Ejemplo:
Supongamos que tenemos una tabla llamada PARES que queremos rellenar con todos los nmeros
pares desde el 2 al 10000.
DECLARE
vi_valor NUMBER(5) := 0;
BEGIN
FOR vi_contador IN 1..5 LOOP
vi_valor := vi_valor + 2;
insert into PARES values(vi_valor);
END LOOP;
END;

8.2.4. Tratamientos de Errores (Exception)


La forma en la que Oracle gestiona los errores es mediante las excepciones y los gestores de
excepciones.

- 156 -

Los TIPOS de ERRORES en un programa PL/SQL pueden ser:


Errores de Compilacin.- Son tratados al compilar el programa PL/SQL y se acta sobre ellos de forma
interactiva.
Errores de Ejecucin.- Son tratados por los gestores de excepciones y se acta sobre ellos
programando su resultado. Cuando se produce un error salta una excepcin la cual es tomada por el
gestor de excepciones, consiguiendo de esta forma separar la lgica de nuestra aplicacin del tratamiento
de errores.
EJEMPLO:
DECLARE
vi_valorA NUMBER(2) := 0;
vi_valorB NUMBER(2) := 12;
BEGIN
vi_valorB := vi_valorB / vi_valorA;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error al dividir por cero.');
END;
Las EXCEPCIONES las podemos dividir en dos tipos:

Excepciones definidas por el programador.

Excepciones predefinidas en Oracle.

a) Excepciones definidas por el programador


Son aquellas que crea el programador para su propio control de errores. Se declaran en el bloque
DECLARE del cdigo PL/SQL y son del tipo EXCEPTION.
Ejemplo:
DECLARE
control_error_1 EXCEPTION;
Este tipo de excepciones deben ser controladas por el programador y llamadas mediante la sentencia
RAISE nombre_excepcin;, pasando el control del cdigo PL/SQL al mdulo EXCEPTION.
- 157 -

b) Excepciones predefinidas en Oracle


Son una serie de excepciones de errores comunes que Oracle ha predefinido para que puedan ser
tratadas en los cdigos PL/SQL.
Algunas de ellas son:
ORA-0001

DUP_VAL_ON_INDEX

Se incumple una restriccin UNIQUE o PRIMERY KEY.

ORA-1001

INVALID_CURSOR

Operacin incorrecta con un CURSOR.

ORA-1012

NOT_LOGGED_ON

Sin conexin con Oracle.

ORA-1017

LOGIN_DENIED

Login o password incorrectos.

ORA-1403

NO_DATA_FOUND

Ningn dato encontrado.

ORA-1422

TOO_MANY_ROOMS

Select....INTO... con ms de una fila.

ORA-1476

ZERO_DIVIDE

Se intenta dividir por cero.

ORA-1722

INVALID_NUMBER

Fallo al convertir a un nmero.

ORA-6500

STORAGE_ERROR

Se produce cuando PL/SQL se queda sin memoria.

ORA-6501

PROGRAM_ERROR

Error interno PL/SQL.

ORA-6502

VALUE_ERROR

Error de conversin, truncamiento o aritmtico.

ORA-6511

CURSOR_ALREADY_OPEN

Se ha intentado abrir un cursor que est abierto.

Estas no tienen por que ser llamadas con la sentencia RAISE.


Dentro del mdulo o bloque EXCEPTION podemos controlar ms de una EXCEPTION bien separndolas
con el operador OR o mediante varias sentencias WHEN.
Todo podemos resumirlo como:
DECLARE
Nombre_exception_propia EXCEPTION;
BEGIN
.

.......;
........;
IF condicion THEN
RAISE Nombre_exception_propia;
END IF;

- 158 -

EXCEPTION
WHEN Nombre_exception_propia THEN
Sentencias;
WHEN Nombre_exception_predefinida THEN
Sentencias;
WHEN Nombre_exception_predefinidaA OR Nombre_exception_predefinidaB WHEN
Sentencias;
WHEN others THEN
Sentencias;
END;
IMPORTANTE.- La EXCEPCION ocurre cuando falla la sentencia a realizar.
Ejemplo: En este ejemplo se incumple la PRIMERY KEY de la tabla VENTAS, ya que existe el id_ventas
10. La exception se ejecuta al intentar realizar el INSERT, nunca llega a la lnea RAISE vi_error

Oracle nos proporciona dos funciones PREDEFINIDAS llamadas SQLCODE y SQLERRM las cuales nos
proporcionan el nmero del error (number) producido y el mensaje de error (longitud mxima 512
caracteres). Estas funciones predefinidas son muy tiles para la EXCEPTION others.
Si lo aplicamos al ejemplo anterior tendramos:

- 159 -

Podemos usar la funcin predefinida RAISE_APPLICATION_ERROR para crear nuestros propios


mensajes de error.
Ejemplo:

- 160 -

Si se usa un solo mdulo de EXCEPTION, podemos encontrarnos con problemas de localizacin del
error. Por ejemplo:
DECLARE
vi_id NUMBER := null;
BEGIN
select id_cliente INTO vi_id from clientes where id_cliente=100;
select id_cliente INTO vi_id from clientes where id_cliente=555;
select id_cliente INTO vi_id from clientes where id_cliente=200;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('N Error: ' || SQLCODE || ' Mensaje: ' || SQLERRM);
END;
No sabemos qu SELECT ha producido el error. Por este motivo, para localizarlo, podemos dividir los
select en sub-bloques.

- 161 -

RECUERDE

Usamos PL/SQL para realizar programas que nos permitan obtener y manipular la informacin
almacenada en una B.D.

Un programa PL/SQL se compone de tres bloques: Declaracin, Ejecucin y Excepcin.

Los tratamientos de errores pueden ser personalizados por el usuario o usar los predefinidos
por Oracle.

- 162 -

Tema 9

FUNCIONES,
PROCEDIMIENTOS,
PAQUETES Y
DISPARADORES

9.1. INTRODUCCIN _____________________________________________ 165


9.2. PROCEDIMIENTOS___________________________________________ 166
9.3. FUNCIONES ________________________________________________ 170
9.4. VISTAS RELACIONADAS CON LOS PROCEDIMIENTOS Y FUNCIONES _ 172
9.5. PAQUETES_________________________________________________ 174
9.6. DISPARADORES ____________________________________________ 176
9.7. DISPARADORES O TRIGGER MUTANTES ________________________ 178

- 163 -

9.1. INTRODUCIN
Los programas PL/SQL vistos anteriormente son bloques annimos, es decir, no quedan almacenados
como un objeto dentro de la B.D. para poder ser usados posteriormente. Para conseguir que un programa
PL/SQL quede almacenado en Oracle, debemos englobarlo en funciones o procedimientos.
Estos objetos son localizables dentro de la B.D. como cualquier otro objeto: Tablas, Indices, Usuarios,
Tablespaces, etc.
Estos objetos son localizables en el esquema y dentro de ste en la carpeta Tipos de Origen.

La principal ventaja de englobar los programas PL/SQL dentro de procedimientos o funciones, es que a
parte de almacenarse en la B.D, stos quedan compilados a la espera de ser llamados para su ejecucin
sin necesidad de que Oracle pierda tiempo en volver a compilar.

- 165 -

9.2. PROCEDIMIENTOS
Para crear un procedimiento podemos hacerlo desde la herramienta grfica Consola de Oracle
Enterprise Manager:

o mediante la orden CREATE PROCEDURE cuya sintaxis es:


CREATE [OR REPLACE] PROCEDURE nombre_procedimiento

[(argumento [ { IN || OUT || IN OUT } ] tipo,


....
argumento [ { IN || OUT || IN OUT } ] tipo,) ]
{ IS || AS }
<< Declaracin de variables LOCALES >>

- 166 -

BEGIN
<< Cuerpo del Procedimiento >>
EXCEPTION
<< Tratamiento de la excepciones >>
END [nombre_procedimiento];
Consideraciones:
1.- Si no se usa la clusula OR REPLACE y existe un procedimiento con ese nombre, Oracle no nos
dejar crearlo.
2.- El procedimiento puede tener o no argumentos, es decir, valores que posteriormente sern
usados dentro del propio cdigo PL/SQL.
3.- Si no especificamos la modalidad IN || OUT || IN OUT en el argumento, este se considerar de
tipo IN (entrada).
4.- Diremos que:

IN = Slo LECTURA

OUT = Slo ESCRITURA

IN OUT = Lectura / Escritura

4.- Un procedimiento es una orden DDL, por lo que lleva de forma implcita un COMMIT.
5.- Un procedimiento puede ser llamado desde un mdulo PL/SQL annimo o desde otro
procedimiento, usando tan solo el nombre del procedimiento.
6.- En la declaracin del procedimiento es INCORRECTO restringir el argumento con el tipo.
Es decir:
CREATE PROCEDURE calcular ( valor1 NUMBER(3,2), nombre VARCHAR2(30) ) AS
nos dara un ERROR.
Debemos hacerlo:
CREATE PROCEDURE calcular ( valor1 NUMBER, nombre VARCHAR2 ) AS
Por lo que las restricciones de los parmetros o argumentos existentes en la cabecera de un
procedimiento, vendrn determinadas por los parmetros de la aplicacin que llama al procedimiento,
conocidos con el nombre de parmetros reales.

- 167 -

Ejemplo:
Declare
Variable_1 NUMBER (5,2);
Variable_2 VARCHAR2(10);
/* Variable_1 y Variable_1 son parmetros reales */
Calcular(Variable_1, Variable_2);
7.- Una forma de restringir en la cabecera del procedimiento es haciendo uso de la orden %TYPE.
CREATE PROCEDURE calcular ( valor1 tabla.salario%TYPE, nombre VARCHAR2 ) AS
8.- Un parmetro puede ser inicializado en la cabecera del procedimiento siguiendo la siguiente
sintaxis:
nombre_parmetro [ IN || IN OUT ] tipo { := | DEFAULT } valor_de_inicilaizacion
Ejemplo:
Partiendo de la tabla CLIENTES cuya estructura es:
ID_CLIENTE

NOT NULL NUMBER(3)

DESCRIP_CLIENTE

NOT NULL VARCHAR2(30)

Crear un procedimiento llamado insertar_clientes que nos inserte un cliente dado:

- 168 -

Podemos observar cmo se ha creado un objeto procedimiento en la B.D.:

Para ver ejecutar el procedimiento anteriormente creado slo tendremos que hacer:

Para BORRAR un procedimiento, slo tendremos de ejecutar la orden:


DROP PROCEDURE nombre_procedimiento;

- 169 -

9.3. FUNCIONES
Son muy parecidas a los procedimientos, reciben argumentos, tienen apartados de declaracin, de
ejecucin y control de excepciones.
LA DIFERENCIA es que la funcin siempre devuelve un valor TEORICAMENTE y ste es devuelto en el
nombre de la propia funcin. Una funcin puede devolver ms de un valor si usamos los parmetros o
argumentos OUT, aunque se recomienda por tica que si devuelve ms de un valor se use el
procedimiento.
Su sintaxis es:
CREATE [OR REPLACE] FUNCTION nombre_funcion

[(argumento [ { IN || OUT || IN OUT } ] tipo,


....
argumento [ { IN || OUT || IN OUT } ] tipo,) ]
RETURN tipo_de_dato_de_retorno { IS || AS }
<< Declaracin de variables LOCALES >>
BEGIN
<< Cuerpo del Procedimiento >>
RETURN expresion;
EXCEPTION
<< Tratamiento de la excepciones >>
END [nombre_funcion];
Ejemplo:
Crear una funcin que nos devuelva el nmero total de clientes existentes en nuestra tabla CLIENTES
CREATE FUNCTION numero_clientes
RETURN number
as
vi_num_clientes NUMBER;

- 170 -

BEGIN
Select count(*) into vi_num_clientes from clientes;
RETURN vi_num_clientes;
END numero_clientes;

Podemos observar cmo la funcin es un objeto dentro de la B.D.

- 171 -

Para hacer uso de la funcin creada, slo con llamarla en un cdigo PL/SQL nos valdra.

Para BORRAR una funcin, slo tendremos que ejecutar la orden:


DROP FUNCTION nombre_funcion;
9.4. VISTAS RELACIONADAS CON LOS PROCEDIMIENTOS Y FUNCIONES.
Algunas de las vistas del Diccionario de Datos que nos informa de los procedimientos y funciones son:

user_objects

user_source

user_errors

user_objects.- Nos

muestra informacin de los objetos que tiene un usuario. Las columnas que

contienen son las siguientes:


OBJECT_NAME

VARCHAR2(128)

SUBOBJECT_NAME

VARCHAR2(30)

OBJECT_ID

NUMBER

- 172 -

DATA_OBJECT_ID

NUMBER

OBJECT_TYPE

VARCHAR2(18)

CREATED

DATE

LAST_DDL_TIME

DATE

TIMESTAMP

VARCHAR2(19)

STATUSVAR

CHAR2(7)

TEMPORARY

VARCHAR2(1)

GENERATED

VARCHAR2(1)

SECONDARY

VARCHAR2(1)

Podemos obtener informacin cmo: Nombre del Objeto, Fecha de Creacin, Fecha de ltima
modificacin, estado actual, etc.
user_source.- Contiene el cdigo fuente del procedimiento o de la funcin. Es decir, dicha vista est
constituida por las columnas:
NAME

VARCHAR2(30)

TYPE

VARCHAR2(12)

LINE

NUMBER

TEXT

VARCHAR2(4000)

Ejemplo:

- 173 -

user_errors.- Contiene la informacin de los mensajes de error en la compilacin de un procedimiento o


funcin.
NAME

NOT NULL VARCHAR2(30)

TYPE

VARCHAR2(12)

SEQUENCE

NOT NULL NUMBER

LINE

NOT NULL NUMBER

POSITION

NOT NULL NUMBER

TEXT

NOT NULL VARCHAR2(4000)

9.5. PAQUETES
Un paquete es una estructura PL/SQL que nos permite almacenar sentencias SQL y programas PL/SQL.
En un paquete se diferencian dos partes:
Cabecera del Paquete.
Cuerpo del paquete.

- 174 -

Cabecera del Paquete


Contiene informacin declarativa sobre el contenido del paquete. Nunca debe contener el cdigo PL/SQL
del cuerpo de una funcin o procedimiento.
Su sintaxis es:
CREATE [OR REPLACE] PACKAGE nombre_paquete
{ IS || AS}

[ Cabecera de PROCEDIMIENTO..]
[ Cabecera de FUNCION..]
[ Declaraciones de variable..]
[ Definicin de tipo..]
[ Declaracin de Excepcin..]
[ Declaracin_de_cursor;..]
END [nombre_paquete];
Cuerpo del paquete
Contiene el cdigo de los elementos que forman el paquete, es decir, el cdigo de la funcin,
procedimiento, etc.
Los elementos del cuerpo de un paquete NUNCA podrn ser compilados si no existe la declaracin de los
mismos en la cabecera del paquete.
Su sintaxis es:
CREATE [OR REPLACE] PACKAGE BODY nombre_paquete
{ IS || AS}
[BEGIN] => NO SE PONE en el BODY.
<<Cdigo PL/SQL de los elementos del paquete>>
END [nombre_paquete];

- 175 -

Tanto la cabecera como el cuerpo son almacenados por Oracle en el Diccionario de Datos como objetos
diferentes.
IMPORTANTE
Todo elemento del paquete (Procedimiento, funcin,...) puede ser referenciado como se muestra a
continuacin:
Nombre_paquete.elemto_del_paquete

9.6. DISPARADORES
Los disparadores mas comnmente conocidos como TRIGGER son similares a los procedimientos y a las
funciones, salvo que no pueden ser llamados desde otro bloque PL/SQL ni admiten argumentos.
Cuando sobre una tabla se lleva a cabo una operacin DML del tipo INSERT, UPDATE o DELETE es
cuando podemos hacer que se ejecute el disparador.
Su sintaxis es:
CREATE [OR REPLACE] TRIGGER nombre_trigger
{ BEFORE || AFTER } suceso_disparo ON referencia_tabla

[FOR EACH ROW [WHEN condicion_disparo] ]


cuerpo_disparo;
suceso_disparo.- Los sucesos que activan un disparador son INSERT, UPDATE y DELETE que se
lleven a cabo ANTES (Before) o DESPUES (After) sobre la tabla especificada en referencia_tabla.
El nivel de accin del disparador, puede ser:
1.- Especificado a cada fila de la tabla, ejecutndose el cuerpo_disparo por cada fila afectada
cuando la condicion_disparo es verdadera.
2.- Especificado a toda la TABLA (conocido tambin como a nivel orden), es decir el
cuerpo_disparo se ejecuta cuando se realiza un insert, update o delete sobre referencia_tabla.

- 176 -

Por tanto, en total podremos realizan 12 acciones distintas:


I = Insert ; U=Update, D=Delete
B= Before, A= After
O= Orden, F=Fila
I , B, O

U , B, O

D , B, O

I , B, F

U , B, F

D , B, F

I , A, O

U , A, O

D , A, O

I , A, F

U , A, F

D , A, F

El disparador o trigger se ejecuta al ejecutarse una orden DLL, siendo el proceso a seguir el siguiente:
1.- Si existe, ejecutar el disparador de tipo BEFORE (antes) con NIVEL DE ORDEN.
2.- Para cada fila implicada en la orden:
2.1.- Si existe, ejecutar por cada fila el disparador BEFORE.
2.2.- Si existe, ejecutar por cada fila el disparador AFTER.
3.- Si existe, ejecutar el disparador de tipo AFTER (despus) con NIVEL DE ORDEN.
Los pseudo-registros: OLD y: NEW
Sabemos que los disparadores por fila se ejecutan una vez por cada fila afectada de la orden DML que
hace saltar al disparador. Los pseudo-registros :old y :new nos permiten tener acceso a los datos de la
fila afectada.
Estos pseudo-registros son del tipo tabla_asociada_al_disparador %ROWTYPE, es decir
TIPO_REGISTRO. No podemos manejar todo el registro o fila, slo podemos hacer uso individual de las
columnas que componen la fila o registro.
En la siguiente tabla detallamos qu valores pueden tomarse de las pseudo-columna segn la orden DML
que se est ejecutando:

:old

INSERT

UPDATE

DELETE

NULL

Valor antes de actualizar

Valor ante de borrar

Nuevo valor actualizado

NULL

:new Valor que se ha insertado

- 177 -

Oracle nos permite programar un trigger o disparador hacia una tabla sobre la cual se vaya a realizar ms
de una operacin DML (insert, update y delete). Para distinguir qu accin se ha realizado, podemos
hacer uso de INSERTING, UPDATING y DELETING en el cuerpo_del_disparador, es decir:
IF INSERTING THEN
Sentencia;
ELSIF UPDATING THEN
Sentencia;
ELSIF DELETING THEN
Sentencia;
END IF;
Para eliminar un trigger: DROP TRIGGER nombre_trigger.
En diferencia con los procedimientos y funciones, los trigger pueden ser desactivados sin necesidad de
ser borrados.
ALTER TRIGGER nombre_trigger [ DISABLE | ENABLE ]
Tambin podemos desactivar TODOS los trigger de una TABLA mediante:
ALTER TABLE nombre_tabla

[ ENABLE ALL TRIGGERS | DISABLE ALL TRIGGERS ];

La vista del diccionario de datos que nos proporciona informacin sobre los trigger se llama
user_triggers.

9.7. DISPARADORES O TRIGGER MUTANTES


Oracle impone una serie de restricciones a la hora de que el cdigo del cuerpo de un trigger, pueda
actuar o no sobre una tabla. Podemos distinguir:
TABLAS MUTANTES
TABLAS de RESTRICCION.
TABLAS MUTANTES.- Son aquellas sobre las que acta una orden DML y la accin del TRIGGER
acta sobre ellas. Por lo que las sentencias o instrucciones del cuerpo del disparador NO PODRAN leer o
modificar de dicha tabla.

- 178 -

Si el INSERT hacia una tabla slo afecta a una fila, los trigger tanto del tipo BEFORE como AFTER no
darn el error de tabla mutante. Todo insert del tipo INSERT INTO Select ... producir trigger mutantes,
incluso si el resultado del Select es de una sola columna o registro.
TABLAS de RESTRICCIONES.- Son aquellas de las que Oracle necesita leer para verificar las
restricciones de integridad referencial. Por ello, ningn TRIGGER podr leer o modificar los campos o
columnas que sean clave primaria, nica o foreing para la tabla que se ha creado el disparador. Las
columnas o campos, pueden ser modificados sin ningn tipo de problema.
NOTA.- Estas restricciones se aplican a aquellos disparadores o trigger programados para actuar a
NIVEL DE FILAS. A los disparadores a nivel de orden, slo son aplicables cuando el disparador se activa
al ejecutarse una orden DELETE _CASCADE.
Estos errores se producen cuando el disparador se activa, NO CUANDO se crea.
Ejemplo TRIGGER MUTANTE:
Usando la tabla EMP y DEPT del usuario scott/tiger realizar un trigger que compruebe cada vez que se
realiza un INSERT o UPDATE sobre la tabla EMP que no existan ms de 6 empleados por departamento.
Estructura Tabla EMP:
EMPNO

NOT NULL NUMBER(4)

ENAME

VARCHAR2(10)

JOB

VARCHAR2(9)

MGR

NUMBER(4)

HIREDATE

DATE

SAL

NUMBER(7,2)

COMM

NUMBER(7,2)

DEPTNO

NUMBER(2)

Estructura Tabla DEPT:


DEPTNO

NOT NULL NUMBER(2)

DNAME

VARCHAR2(14)

LOC

VARCHAR2(13)

Si ejecutamos la sentencia:
select count(*),deptno from emp group by deptno;
Tendremos:

- 179 -

Partiendo de esos datos realizaremos y comprobaremos el trigger.

- 180 -

Si intentamos actualizar el nmero del departamento para el empleado nmero 7369 al departamento 10,
Oracle nos informa de que la tabla est mutando.

- 181 -

RECUERDE

Debemos utilizar los procedimientos y funciones para hacer que un programa PL/SQL no sea
annimo.

Las agrupaciones de procedimientos y funciones se llevarn a cabo con los paquetes.

Las caractersticas de los procedimientos, funciones y paquetes las podemos visualizar mediante
las vistas del diccionario de datos o mediante la herramienta grfica.

Los TRIGGER van asociados a una accin INSERT,UPDATE o DELETE de una tabla.

- 182 -

Tema 10

CURSORES

10.1. TIPOS DE CURSORES _______________________________________ 185


10.2. ATRIBUTOS DE CURSORES __________________________________ 186
10.3. RECORRIDO DE CURSORES__________________________________ 188
10.4. BLOQUEOS CON EXCLUSIVIDAD ______________________________ 189
10.5. VARIABLES DE CURSOR_____________________________________ 190

- 183 -

10.1. TIPOS DE CURSORES


Un cursor es una referencia a una fila o conjunto de filas devueltas por una consulta a tablas de la B.D.
Diferenciamos dos tipos de cursores:

Cursores Explcitos

Cursores Implcitos

Cursores Explcitos
Se usan para manejar un conjunto de datos (filas) devueltos por una consulta a la B.D:
Los pasos para operar con ellos son:
1. Declaracin del cursor.- Se lleva a cabo en el apartado DECLARE de un programa PL/SQL,
adems de asignarle la orden SELECT que devuelve las filas a procesar.
Su sintaxis:
CURSOR nombre_cursor IS SELECT ........;
Slo hay que tener en cuenta que la orden Select no puede ser del tipo SELECT....INTO....;
Si la consulta llevase variables, stas deben ser declaradas antes que el cursor, es decir:
DECLARE
vi_fecha_nac DATE;
CURSOR c_clientes IS SELECT nombre,apellidos WHERE edad >= vi_fecha_nac;
BEGIN
END;
OTRA FORMA es:
DECLARE
CURSOR c_clientes(vi_fecha_nac DATE) IS SELECT nombre,apellidos
WHERE edad >= vi_fecha_nac;
BEGIN
END;
A esta modalidad se le denomina cursores parametrizados.

- 185 -

2. Abrir el Cursor.- La orden para abrirlo es: OPEN nombre_cursor;


En el momento de abrirlo, es cuando se tienen en cuenta los valores de las variables.
Si abrimos un cursor que ya estaba abierto, Oracle ejecuta de forma implcita una orden CLOSE
del cursor. Tambin podemos tener ms de un cursor abierto, con distinto nombre.
3. Leer los Datos.- Para poder leer una fila de los datos devueltos por el cursor usamos la orden:
FECTH nombre_cursor INTO variables;
o tambin:
FECTH nombre_cursor INTO registro;
Variables.- Conjunto de variables previamente declaradas y separadas por coma en la orden FETCH.
Registro.- Es una variable tipo_registro.
Hay que tener muy en cuenta que el nmero de variables existentes tiene que coincidir con el mismo
nmero de columnas usadas en la consulta Select, al igual que con el tipo de dato.
4. Cierre del Cursor.- Debemos cerrar el cursor o cursores para liberar el espacio de memoria
ocupado por ste. La sentencia es: CLOSE nombre_cursor;
Cursores Implcitos
Se usan para el manejo de rdenes INSERT, UPDATE, DELETE y SELECT ..... INTO de una sola fila.
No precisan de apertura (OPEN), ni lectura (FETCH), ni cierre (CLOSE) ya que es Oracle quien lleva a
cabo estas acciones de forma automtica.
A este cursor se le conoce como cursor SQL.
10.2. ATRIBUTOS DE CURSORES
Van asociados al nombre del cursor y devuelven un valor que puede ser procesado en instrucciones de
bifurcacin o bucles.
Estos son:
%FOUND
Devuelve TRUE si la instruccin FETCH ha ledo una fila o FALSE si no la ha ledo.

- 186 -

%NOTFOUND
Acta de forma inversa a %FOUND, es decir, devuelve TRUE si la instruccin FETCH NO ha ledo una
fila y FALSE si la ha ledo.
%ISOPEN
Nos informa si el cursor est abierto, devolviendo TRUE. Si no lo est, devuelve FALSE.
%ROWCOUNT
Nos informa del nmero de filas referenciadas por el cursor.
Estos atributos podemos aplicarlos tanto a los cursores explcitos como implcitos.
Ejemplo aplicado a CURSORES implcitos.
Se desea actualizar una fila de una tabla CLIENTES, si ste no existe, se insertar un nuevo registro.

Otra forma de programar este mdulo PL/SQL es haciendo uso de una EXCEPTION de errores.

- 187 -

10.3. RECORRIDO DE CURSORES


Para recorrer toda la informacin referenciada por un cursor, podemos usar diferentes modalidades de
bucles. Distinguimos:
Bucles LOOP ..... END LOOP
La sintaxis para recorrer todos los registros de una tabla llamada CLIENTES:
DECLARE
vi_registro CLIENTES%ROWTYPE;
CURSOR c_cliente IS SELECT * FROM clientes;
BEGIN
OPEN c_cliente;
DBMS_OUTPUT.PUT_LINE( 'Datos de los Cliente');
LOOP
FETCH c_cliente INTO vi_registro;
EXIT WHEN c_cliente%NOTFOUND;
DBMS_OUTPUT.PUT_LINE( vi_registro. descrip_cliente );
END LOOP;
CLOSE c_cliente;
COMMIT;
END;

Bucles WHILE
El ejemplo anterior pero usando WHILE ..... END LOOP.
DECLARE
vi_registro CLIENTES%ROWTYPE;
CURSOR c_cliente IS SELECT * FROM clientes;
BEGIN
OPEN c_cliente;
DBMS_OUTPUT.PUT_LINE( 'Datos de los Cliente');
FETCH c_cliente INTO vi_registro;
WHILE c_cliente %FOUND LOOP
DBMS_OUTPUT.PUT_LINE( vi_registro. descrip_cliente );
FETCH c_cliente INTO vi_registro;
END LOOP;
CLOSE c_cliente;
COMMIT;
END;

- 188 -

Bucles FOR
Este tipo de bucle ejecuta una orden OPEN, FETCH y CLOSE de forma implcita. El ejemplo anterior
quedara:

10.4. BLOQUEOS CON EXCLUSIVIDAD


Cuando abrimos un cursor (OPEN) Oracle, toma una instancia de las tablas o conjuntos de tablas
especificadas en el select del cursor. Si otra sesin cambia o modifica los valores de esas tablas
incluyendo la confirmacin de los cambios (commit), el cursor anteriormente abierto, no tiene consistencia
sobre los datos ledos, para ello se necesitara volver a abrir el cursor.

- 189 -

Oracle nos permite bloqueos exclusivos sobre las filas involucradas en la consulta asociada al cursor:
Para ello, escribiremos al final de la sentencia select:
CURSOR nombre_cursor IS SELECT.....FROM.......FOR UPDATE [OF referencia_columna] [NOWAIT ];
referencia_columna.- Columna o columnas de la tabla o tablas a las cuales se les hace referencia.
Si otra sesin tuviese las filas bloqueadas en exclusividad, entonces la sentencia SELECT....FOR
UPDATE....esperara hasta que se libere la exclusividad. Si se desea NO tener ese proceso en espera,
podemos usar la clusula NOWAIT, por lo que la sentencia OPEN del cursor no se llevara a cabo,
devolviendo Oracle un mensaje de error.
Adems de usar FOR UPDATE, en la sentencia UPDATE o DELETE debemos usar la clusula, WHERE
CURRENT OF nombre_cursor.

10.5. VARIABLES DE CURSOR


Las variables de cursor, nos permiten DEVOLVER cursores creados en tiempo de ejecucin en
subprogramas PL/SQL para su procesamiento en aplicaciones externas.
Para declarar una variable cursor, primero tenemos que definir un tipo:
TYPE tipo_variable_cursor IS REF CURSOR [RETURN tipo_retorno_registro];
tipo_retorno_registro.- Es un tipo nombre_table%ROWTYPE, o bien una variable registro definida antes
del tipo.
Una vez declarado el tipo, tendremos que declarar una variable de ese tipo definido.
Ejemplos:
DECLARE
TYPE tipo_registro IS RECORD
( id_cliente CLIENTES.id_cliente%TYPE,
datos_cliente CLIENTES .descrip_cliente%TYPE);

- 190 -

TYPE tipo_ref_cursor IS REF CURSOR RETURN tipo_registro;


variable_cursor tipo_ref_cursor;
La declaracin anterior, nos sirve para especificar una variable cursor con un nmero de columnas
especfica. Si se deseasen todas las columnas de la fila sera:
TYPE tipo_ref_cursor IS REF CURSOR;
variable_cursor tipo_ref_cursor;
Una vez declarada, necesitamos abrirla para su manipulacin. Para ello usaremos:
OPEN variable_cursor FOR sentencia_SELECT;
Para leer los valores de la variable cursor, usaremos orden:
FETCH nombre_variable_cursor INTO variable_interna1, variable_interna2,....
Al igual que un cursor, la variables cursor tambin deben ser cerradas, con la sentencia
CLOSE nombre_variable_cursor;
Ejemplo.
Crearemos un procedimiento llamado mostrar_datos que usando una variable cursor, me muestre los
datos de la tabla CLIENTES.
CREATE OR REPLACE PROCEDURE mostrar_datos
AS
TYPE tipo_cursor IS REF CURSOR;
variable_cursor tipo_cursor;
vi_id_cliente NUMBER;
vi_descripcion VARCHAR2(30);
BEGIN

- 191 -

OPEN variable_cursor FOR SELECT * FROM CLIENTES;


LOOP
FETCH variable_cursor INTO vi_id_cliente,vi_descripcion;
EXIT WHEN variable_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE( vi_id_cliente || ' ' || vi_descripcion);
END LOOP;
END;
El resultado:

- 192 -

RECUERDE

Los cursores son referencias a filas de datos, requiriendo ser declarados, abiertos, ledos y
cerrado si son del tipo explcito.

Los atributos de cursores nos permiten obtener informacin de los cursores para su
procesamiento.

Las variables de cursor nos permiten un empleo ms generalizado de los cursores.

- 193 -

Tema 11

NDICES

11.1. DEFINICIN _______________________________________________ 197


11.2. CARACTERTICAS DE LOS NDICES ___________________________ 198
11.3. REGLAS A LA HORA DE CREAR UN NDICE _____________________ 199
11.4. TIPOS DE NDICES __________________________________________ 201
11.4.1. ndices de Tablas, Arbol-B, B-Tree o Normal _________________ 201
11.4.2. ndices de Mapas de Bits ________________________________ 201
11.4.3. ndices basados en una funcin___________________________ 203
11.4.4. ndices de Clave Inversa ________________________________ 203
11.4.5. Cluster o Agrupamiento _________________________________ 204
11.5. CREACIN DE NDICES ______________________________________ 205

- 195 -

11.1. DEFINICIN
Los ndices se aplican a columnas de una tabla, pudiendo estar constituidos por una o ms columnas de
la tabla. Su funcionalidad es localizar la informacin a buscar lo ms rpidamente posible y con el menor
nmero posible de E/S a disco, para conseguir de esta forma un mayor rendimiento. No siempre es
aconsejable crear ndices ya que stos deben ser gestionados por Oracle, por lo que implica tiempo de
gestin, lo cual hace que baje el rendimiento en lugar de aumentarlo. Los ndices slo pertenecen a una
tabla.
A continuacin, vamos a ver a groso modo la funcionalidad de los ndices.
Supongamos que tenemos una tabla compuesta de 26 columnas o campos cada uno de ellos del tipo
varchar2(30), es decir:
TABLA
Campo1

Campo2

Campo3

.......................

Campo26

Si se desea consultar el dato del Campo3, Oracle necesita extraer el resto de columnas desde la 1 hasta
la 26 y recorrer, por supuesto, toda la tabla. Suponiendo que se extraen 5 filas, tendramos un buffer de
lectura de:
Tamao de columna: 30
N de columnas recuperadas: 26
Filas extradas: 5
TOTAL BUFFER = 30 x 26 x 5 = 3900 caracteres.
Si en lugar de ser 5 filas fuesen 50.000 filas, tendramos 39.000.000 de caracteres, es decir, 39 Mbyte de
memoria cach.
Por tanto, debemos crear un ndice que haga referencia al Campo3, en el cual Oracle almacena
nicamente el contenido de dicho campo y la referencia a esos valores dentro de la tabla. Cada vez que
se produzca una variacin en ese campo, tambin se lleva a cabo en el objeto ndice creado.
Si ahora deseamos consultar la informacin del Campo3, Oracle recorre el ndice. Por lo tanto, para un
total de 5 filas, tendremos 30 x 1 x 5 = 150 caracteres. Visto de otra forma, para un Buffer de 3.900
caracteres, obtendramos una lectura de 130 filas extradas.
(Total Buffer / Tamao Columna * N de columnas recuperadas = Filas Extraidas )

- 197 -

11.2. CARACTERTICAS DE LOS NDICES


Cuando se insertan datos en una tabla, no se sigue ningn tipo de orden, por lo que a la hora de
consultar dichos datos, Oracle necesita recorrer toda la tabla. Al crear un ndice, Oracle ordena la
informacin de dicho ndice bien sea ste de tipo carcter, numrico o fecha.
Al crear un ndice, Oracle se encarga de mantenerlo si los datos del campo asociado al ndice son
borrados, actualizados o se inserta un dato nuevo en la tabla.
Por otra parte, debemos sealar que los ndices pueden ser unvocos o no unvocos. Si un ndice
asociado a un campo o columna de una tabla es nico, Oracle comprobar cada vez que se inserte un
dato en dicha columna que el valor es nico para cumplir la caracterstica del ndice creado.
En cambio, si el ndice que se desea crear es de tipo nico sobre un campo que contiene datos, que no
son nicos, Oracle jams podr crear el ndice.
Si se elimina el ndice asociado a una o ms de una columna de una tabla, los valores de esas columnas
en la tabla no se eliminan.
Anteriormente, hemos mencionado que los ndices pueden ser creados sobre ms de una columna. stos
deben ser creados cuando observamos en la tabla que siempre que se consulta un campo x lo hacemos
de otro campo y, por lo que deberamos indexar ambos campos. A estos ndices se les denomina
ndices concatenados o ndices compuestos.
Oracle crea de forma automtica ndices para las columnas clave o Primary Key. Tambin para las
columnas sobre las cuales se aplique una restriccin UNIQUE.

- 198 -

11.3. REGLAS A LA HORA DE CREAR UN NDICE


A.- Debemos indexar las columnas que formen parte del predicado de una instruccin SQL, es decir las
incluidas en un WHERE y AND. Si hacemos una select de los campos nombre, apellidos y stos no
forman parte del predicado, entonces no debemos indexar dichas columnas.
B.- Indexar las columnas con valores distintos.
Podemos basarnos en: Si el valor de una columna dada est en un 5% o menos del resultado de las filas
obtenidas, debemos indexar por esa columna.
Por ejemplo: Una tabla con 50.000 registros. Un campo tiene valores idnticos cada 10.000 registros,
podemos aconsejar que no se indexe por ese campo. Ahora bien, si esa misma tabla tiene un campo
cuyos valores son iguales cada 2.500 registros, aconsejaremos que se indexe por ese campo.
C.- Si de forma muy constante se hace uso de mltiples columnas en el predicado de una instruccin
SQL, debemos crear un ndice concatenado o compuesto por esas columnas.
D.- A la hora de crear un ndice, se aconseja y recomienda que ste se cree en un tablespaces distinto al
Tablespace de Datos o Default, al igual que se recomienda que estos tablespaces estn fsicamente en
distintos discos duros.

- 199 -

Ya hemos comentado que Oracle crea automticamente ndice para los campos claves y nicos. Estos
ndices son asignados al tablespaces Default por lo que debemos especificarle el tablespaces Index,
bien en la instruccin SQL o mediante la herramienta grfica.
Es decir:
CREATE TABLE "USR_PRUEBA"."TABLA"
("C1" VARCHAR2(10) NOT NULL,
"C2" NUMBER(5) NOT NULL,
"C3" VARCHAR2(10) NOT NULL,
PRIMARY KEY("C1") USING INDEX TABLESPACE "tablespace_INDEX",
UNIQUE("C2") USING INDEX TABLESPACE "tablespace_INDEX");
Mediante la herramienta grfica, entramos en la pestaa Almacenamiento de Restricciones:

Las consultas de datos a travs de los campos o campo que formen la PRIMERY KEY son mucho ms
rpidas ya que son ndices nicos, por lo que el recorrido del objeto index no es total.
E.- No es aconsejable hacer ndices de columnas que puedan tomar valores nulos.
F.- Toda tabla que supere las 1.000 filas debe tener un ndice.
- 200 -

11.4. TIPOS DE NDICES


Para poder localizar los datos, todas las filas de una tabla poseen un identificador o etiqueta denominado
RowID (Identificador de Fila). Este identificador indica a Oracle la ubicacin fsica exacta de la fila
(Datafile, Bloque de archivo y Fila de archivo).
Existen diferentes tipos de ndices:

11.4.1. ndices de Tablas, Arbol-B, B-Tree o Normal


En ellos se almacena el contenido de la columna o columnas y el RowID de las filas. Su organizacin se
basa en la filosofa del Arbol-B, la cual consiste en una estructura compuesta de nodos y ramas,
mantenindose ordenada para reducir la bsqueda.
Este tipo de ndice, es el creado por Oracle para las columnas establecidas como Primery Key y Unique.
Si se desea crear un ndice NICO, Oracle recomienda crear la restriccin en la columna a nivel de tabla
para mantener de esta forma la integridad con el resto de restricciones que se hubiesen establecido sobre
la tabla.
Por defecto, siempre que se crea un ndice Oracle en el proceso de creacin ordena la columna asociada
al ndice. Podemos indicarle al crear el ndice que no ordene dicha columna dentro del ndice ya que esta
est ordenada en la tabla.

11.4.2. ndices de Mapas de Bits


Es un tipo especial de ndices de tabla que ayudan a optimizar las consultas a grandes volmenes de
datos con columnas cuyos valores varan muy poco.
En lugar de almacenar los valores claves, se almacenan mapas de bits.
Cada mapa de bits es un conjunto de bit (unos y ceros), que sern distintos para los valores de columnas
diferentes.
Por ejemplo:
Supongamos que tenemos una tabla indexada

(Arbol-B) por la columna C3. Al consultar la tabla

tendramos:

- 201 -

Select rownum, c3 from tabla;


ROWNUM
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

C3
Informtico
Abogado
Arquitecto
Abogado
Pedagogo
Informtico
Abogado
Arquitecto
Informtico
Arquitecto
Pedagogo
Abogado
Informtico
Pedagogo
Arquitecto

Si hacemos una consulta ordenada por C3 y Rownum tendramos:


ROWNUM
2
4
7
12
3
8
10
15
1
6
9
13
5
11
14

C3
Abogado
Abogado
Abogado
Abogado
Arquitecto
Arquitecto
Arquitecto
Arquitecto
Informtico
Informtico
Informtico
Informtico
Pedagogo
Pedagogo
Pedagogo

As pues, el objeto ndice almacenara en lugar del rownum el RowId y los valores de C3.
Si observamos el ejemplo, el campo C3 slo posee 4 valores distintos. Si se crea un ndice de mapa de
bit (Bitmap), en el cual cada mapa de bit almacena informacin de 12 filas de la tabla, obtendramos lo
siguiente:

- 202 -

ROWNUM

C3

rownumINICIAL rownumFINAL Bitmap

2,4,7,12

Abogado

12

0101.0010.0001

3,8,10

Arquitecto

12

0010.0001.0100

15

Arquitecto

13

24

0010.0000.0000

1,6,9

Informtico

12

1000.0100.1000

16

Informtico

13

24

0001.0000.0000

5,11

Pedagogo

12

0000.1000.0010

14

Pedagogo

13

24

0100.0000.0000

Por tanto, es aconsejable utilizar columnas cuyos valores sean poco variables, ya que cuantos ms
valores diferentes existan, mayor ser el tamao del objeto ndice y mayor tiempo para poder ser
gestionado.

11.4.3. ndices basados en una funcin


Son ndices basados en expresiones creadas por el usuario aplicadas a las columnas de la tabla.
El ndice almacena el resultado de la expresin y el RowID de la fila.
As pues, su creacin se recomienda para aquellas operaciones de consulta y borrado que usan
frecuentemente la misma expresin en la clusula WHERE.
La expresin puede tener las siguientes caractersticas:

Estar formada por operadores aritmticos.

Funciones predefinidas (Concat, Lower, Upper, Rtrim, Ltrim,etc.) salvo las de agrupamiento
(Sum, Avg, Max, Min......).

Una funcin creada por el usuario como objeto PL/SQL de tipo pblica.

Por ejemplo: Si al consultar un campo o columna denominada apellidos de una tabla, en la clusula
where siempre hacemos uso de UPPER (apellidos), podemos crea un ndice de funcin UPPER sobre
esa columna.

11.4.4. ndices de Clave Inversa


Cuando el campo o columna de la tabla posee valores secuenciales (1,2,3,4.....), al crear el ndice de
rbol-B, ste se coloca en una sola rama del rbol, por lo que podemos tener un ndice inservible.
Para ello, podemos especificar que sea de Clave Inversa.
- 203 -

11.4.5. Cluster o Agrupamiento


Oracle, nos permite almacenar fsicamente en el mismo bloque de datos aquellas tablas a las que se
acceda conjuntamente. Para ello, se crea el cluster que contenga dichas tablas. De esta forma, se reduce
el nmero de E/S a disco. Los cluster de datos es una alternativa a la indexacin.
Las columnas relacionadas de las tablas se denominan clave de cluster.
Oracle nos proporciona dos tipos distintos de cluster:
a)Cluster de datos indexados.
b)Cluster de datos hash.
a) Cluster de datos indexados
En este tipo, Oracle almacena fsicamente una fila en el cluster por cada valor de la clave de cluster.
Dicha clave de cluster se indexa utilizando un ndice de cluster almacenndose slo una vez su valor
para las distintas tablas del cluster.
Ejemplo:
Tabla Pedidos = { ID_Pedido, Fecha_Pedido, ....., ID_Articulo_FK, .....}
Tabla Articulos = { ID_Articulo, Descripcion, Cantidad,.........}
Para consultar los artculos que componen los distintos pedidos, se crea una consulta entre ambas tablas.
Si se crea un cluster para dichas tablas, en cada bloque de datos se almacenar:
Bloque de Datos 1:
ID_Pedido: 100
Todos los artculos incluidos en el pedido 100
Bloque de Datos 2:
ID_Pedido: 200
Todos los artculos incluidos en el pedido 200
..................
Y as sucesivamente.

- 204 -

b) Cluster de datos hash


En ellos, Oracle almacena fsicamente una fila, segn el resultado de aplicar una funcin hash al valor
clave del cluster (columnas relacionadas de las tablas) de la fila.
Adems, almacena en el mismo bloque todas aquellas filas que dan el mismo resultado al aplicarles la
funcin hash, es decir, esas filas forman un grupo hash.
Por tanto, a la hora de consultar datos en tablas con cluster hash, Oracle aplica dicha funcin hash al
criterio de seleccin, sabiendo perfectamente en qu bloque (grupo hash) se encuentran los datos.
Consideraciones:
-

Mal funcionamiento de los cluster hash en tablas con constantes actualizaciones e


inserciones.

Se aconseja el uso de cluster hash frente a cluster de ndice.

Mejoran el rendimiento en consultas que no incluyan rangos de filas, es decir, condiciones o


criterios de seleccin con condiciones de igualdad.

En definitiva:
Los cluster resultan de gran utilidad cuando se consultan datos de varias tablas con gran frecuencia, ya
que dentro del cluster se almacenan dichas filas y todas ellas en el mismo bloque de datos, por lo que
aumenta el rendimiento y acceso al disco fsico. Al igual que ganamos en la seleccin, las inserciones,
borrados y actualizaciones pueden llegar a ser menos eficaces que en las tablas no agrupadas en cluster.

11.5. CREACIN DE NDICES


Los privilegios relacionados con los ndices que se pueden asignar a un usurario son los siguientes:
CREATE ANY INDEX.
ALTER ANY INDEX.
DROP ANY INDEX.
Los ndices al igual que otros objetos de una B.D. Oracle, podemos crearlos mediante una sentencia SQL
o mediante la Consola del Enterprise Manager.

- 205 -

Desde la consola o interfaz grfica, una vez conectados, slo tendremos que ir al apartado Esquema y
seleccionar la carpeta Tabla o la carpeta ndices. Si lo hacemos a travs de la carpeta Tabla,
tendremos que posicionarnos en la carpeta ndice de la tabla correspondiente.

Haciendo clic derecho y seleccionando la opcin Crear, nos aparece la ventana de Creacin de ndice,
cuyo aspecto es el que se muestra a continuacin:

- 206 -

Las opciones que ofrece son las siguientes:


Nombre.- Nombre del Objeto ndice que se desea crear.
Esquema.- Nombre del esquema al que pertenece el objeto que vamos a crear.
Tablespaces.- Nombre del Tablespaces dnde se almacenar el ndice. Se aconseja y recomienda que
sea distinto al de datos y que fsicamente est en disco fsico distinto.
ndice.- En tabla, que es la opcin por defecto o en Agrupamiento (Cluster).
Esquema y Tabla.- Nombre del Esquema dnde se encuentra la Tabla para la que se crea el ndice.
Alias de tabla para utilizar la expresin de columna.- Alias para la columna de expresin, que se
activa al pulsar el botn Agregar Expresin de Columna.
Listado de las columnas de la tabla sobre las cuales se puede aplicar el ndice.
Botones de Agregar / Borrar Expresin de Columna.- Nos permite agregar una columna de expresin
(COLUMN EXPRESSION).

- 207 -

Las opciones nico, Bitmap, No Ordenado, Revertir, excluyentes entre si, nos permiten especificar la
modalidad o tipo de ndice.
Finalmente, algunos ejemplos de sentencia SQL que nos permiten crear ndices son los que se detallan a
continuacin:
TABLA: VEHICULO perteneciente al esquema USR_PRUEBA.
MATRICULA
MODELO
COLOR
CILINDRADA
FECHA_COMPRA
PRECIO_VENTA
Partimos de que existe un Tablespaces denominado "PRUEBA_INDEX" con QUOTA no limitada para el
usuario usr_prueba. (ALTER USER "USR_PRUEBA" QUOTA UNLIMITED ON "PRUEBA_INDEX").

- 208 -

1.- ndice de Tabla (Arbol-B) NICO sobre la columna MATRICULA.


CREATE UNIQUE INDEX "USR_PRUEBA"."INDICE1"
ON " USR_PRUEBA"."VEHICULOS" ("MATRICULA")
TABLESPACE "PRUEBA_INDEX";
Si ya existe un ndice sobre la columna, Oracle nos comunica el error: ORA-01408: sta lista de
columnas ya est indexada.
2.- ndice de mapa de bit sobre la columna COLOR.
CREATE BITMAP INDEX "USR_PRUEBA"."INDICE2"
ON " USR_PRUEBA"."VEHICULOS" ("COLOR")
TABLESPACE "PRUEBA_INDEX";
3.- ndice de basado en funcin.
CREATE INDEX "USR_PRUEBA"."INDICE3"
ON " USR_PRUEBA"."VEHICULOS" columna_funcion( UPPER(COLOR))
TABLESPACE "PRUEBA_INDEX";

- 209 -

RECUERDE
- Los ndices permiten un acceso ms rpido a los datos.
- Oracle genera ndices de forma automtica para las columnas consideradas claves primarias y
nicas.
- Los ndices deben ir a un tablespace distinto al default.

- 210 -

GLOSARIO
A
ADD DATAFILE. Clusula que nos sirve para aadir un fichero de datos a un tablespace.
AUTOEXTEND. Clusula que nos permite especificar el crecimiento automtico de los ficheros de datos
B
BASE DE DATOS. Conjunto de Objetos tratados por un sistema gestor de Base de Datos. Su funcionalidad es
almacenar la informacin.
BLOQUE LOGICO. Unidad lgica mnima de almacenamiento para los datos, directamente ligado al bloque fsico
del sistema operativo.
C
CAMPOS. Unidad Lgica mnima de almacenamiento de un registro de la B.D.
COALESCE. Clusula usada para realizar eliminar la desfragmentacin en los tablespaces.
CONTROLFILE. Ver FICHEROS DE CONTROL.
COLUMNAS. Ver CAMPO.
D
DATAFILE. Ver FICHEROS DE DATOS.
DBA. Administrador de la B.D.
DEALLOCATE UNUSED. Clusula que libera espacio de los segmentos de datos e ndices.
E
ESQUEMA. Ver SCHEMA.
EXTENSION. Conjunto de Bloques contiguos.
F
FICHEROS DE CONTROL. Contienen la informacin necesaria para arrancar la B.D. Como nombre, fecha de
creacin, ficheros asociados, etc.
FICHEROS DE DATOS. Ficheros fsicos que almacenan la informacin de los datos de la B.D.
FICHEROS DE REDO LOG. Nos permiten mantener consistente los datos de la B.D. en caso de fallo o error.

- 211 -

H
HAVING. Clusula de una consulta que se aplica a los campos sobre los cuales existe una funcin de
agrupamiento.
I
INITIAL. Tamao de la extensin inicial asignada en el momento de creacin del segmento.
INVALID. Estado en el que puede quedar cualquier objeto de la B.D.
J
JAR. Extensin de programas comprimidos en JAVA.
JOIN. Uniones entre consultas.
P
PCTFREE. Porcentaje de espacio en un bloque de dato, reservado para las modificaciones de los datos
almacenados en dicho bloque.
PCTINCREASE. Porcentaje de crecimiento de la siguientes extensin con respecto a la anterior asignada.
PCTUSED. Porcentaje que determina cuando un bloque de datos es candidato para recibir inserciones.
PL/SQL. Lenguaje de programacin utilizado para acceder a la informacin existente en una B.D. relacional
mediante sentencias SQL. (Procedural Language/Structured Query Language).
PRIVILEGIOS. Permisos concedidos a los usuarios para poder realizar tareas en la B.D.
Q
QUERY. Consulta a la D.B.
R
REDOLOG. Ver FICHEROS REDO LOG
ROL. Conjunto de privilegios concedidos a un usuario.
RUTA DE ACCESO. Ubicacin en disco duro dnde se instalarn los programas de instalacin de Oracle.
ROWID. Identificador nico por cada fila de una tabla de la B.D.
S
SCHEMA. Objeto de la B.D. dnde se recoge de forma lgica la estructura de un diseo relacional.

- 212 -

SEGMETOS DE DATOS. Conjunto de EXTENSIONES que almacena informacin de las tablas.


SEGMETOS DE INDICE. Conjunto de EXTENSIONES que almacena informacin de los ndices de las tablas.
SEGMENTO TEMPORAL. Conjunto de EXTENSIONES creadas por Oracle para operaciones intermedias en
operaciones SQL.
S.G.D.B. Un Sistema Gestor de Base de Datos es un programa informtico que nos permite manejar Bases de
Datos. Ejemplo: Oracle, SQL Server, Informix, DB2, MySQL, Access.
SID. identificador de la instancia de la B.D
S.Q.L. Conjuntos de sentencias usadas para manejar los datos de una B.D. (Structured Query Language)
SYS. Usuario propietario de las tablas del Diccionario de Datos.
SYSTEM. Usuario Administrador de la B.D..
T
TABLA. Estructura lgica para almacenar los datos.
TABLESPACE. Estructura lgica de almacenamiento, con ficheros de datos fsicos asociados a ella dnde se
almacena informacin.
TRANSACCION. Conjunto de sentencias que se ejecutan o se deshacen como un bloque hacia la B.D.
TRUNCATE. Sentencia S.Q.L. que libera extensiones de datos e ndices asociados a la tabla.
U
UNLIMITED. Clusula que permite a un usuario a hacer uso de todo el espacio asignado a un tablespaces sin
ningn tipo de restriccin.
USUARIOS. Persona autorizada a hacer uso de determinada informacin existente en la B.D.

- 213 -

Das könnte Ihnen auch gefallen