Sei sulla pagina 1di 226

ADMINISTRACIN DE BASES DE

DATOS CON ORACLE 9I

ADMINISTRACIN DE BASES DE DATOS CON ORACLE 9I.


Autor: Formacin Digital, S.L.
Edita: Formacin Digital, S.L.
"Queda rigurosamente prohibida, sin la autorizacin escrita del autor, la reproduccin parcial o total de
esta obra por cualquier medio o procedimiento, comprendidos la reprografa y el tratamiento
informtico, y la distribucin de ejemplares de ella mediante alquiler o prstamos pblicos".
Depsito legal: SE-5484-08
2008, Formacin Digital, S.L.

ndice general_

1. INSTALACIN ORACLE 9i .................................................................1


2. ARQUITECTURA DE ORACLE 9I .......................................................13
3. CREACIN DE TABLESPACES ..........................................................31
4. USUARIOS......................................................................................43
5. TABLAS ..........................................................................................61
6. OPERACIONES SOBRE TABLAS........................................................91
7. CONSULTAS..................................................................................123
8. PL/SQL ........................................................................................143
9. FUNCIONES, PROCEDIMIENTOS, PAQUETES Y DISPARADORES .....165
10.

CURSORES.................................................................................187

11.

NDICES ....................................................................................199

formacin digital

GLOSARIO .........................................................................................217

ndice_

Instalacin de
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 .................. 6
1.5. VENTANA DE ORACLE SERVICES PARA MICROSOFT6
TRANSACTION SERVER .............................................................. 6
1.6. VENTANA DE IDENTIFICACIN DE BASES DE DATOS .............. 7
1.7. VENTANA DE UBICACIN DE ARCHIVOS DE B.D. ....................... 8
1.8. VENTANA DE JUEGO DE CARACTERES DE LA B.D. ...................... 9
1.9. VENTANA RESUMEN.................................................................10

Instalacin de
Oracle 9i

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.

Instalacin de
Oracle 9i

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)

Instalacin de
Oracle 9i

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.

Instalacin de
Oracle 9i

1.4. VENTANA DE CONFIGURACIN DE BASE DE DATOS


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

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.

Instalacin de
Oracle 9i

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.
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.

Instalacin de
Oracle 9i

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.

Instalacin de
Oracle 9i

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.

Instalacin de
Oracle 9i

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:

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.

10

Instalacin de
Oracle 9i

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

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

11

recuerde_

Instalacin de
Oracle 9i

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.

12

ndice_

Arquitectura
de Oracle 9i

2.1. ESTRUCTURA DE ALMACENAMIENTO LOGICA Y FISICA ................15


2.2. RELACIN TABLESPACES Y DATAFILES ........................................15
2.3. SEGMENTOS, EXTENSIONES Y BLOQUES DE DATOS......................17
2.4. ESPACIO DE TABLAS SYSTEM (Tablespace SYSTEM) ....................19
2.5. DIFERENTES OPCIONES DE UN TABLESPACE................................21
2.5.1. Tablespaces Permanentes (PERMANENT), Temporales
(TEMPORARY) y Deshacer (UNDO) ...................................21
2.5.2. Tablespaces en lnea (ONLINE) o fuera de lnea
(OFFLINE) ........................................................................22
2.5.3. Espacios de Tablas (Tablespaces) administrado
Localmente (Local) y por Diccionario (Dictionary) ............23
2.5.4. Tablespaces en modalidad de slo lectura y
lectura/escritura ..............................................................24
2.6. FICHEROS DE DATOS (DATAFILES) ..............................................24
2.7. OTROS TABLESPACES ..................................................................26
2.8. FICHEROS DE REDO LOG..............................................................27
2.9. FICHEROS DE CONTROL ...............................................................28

13

Arquitectura
de Oracle 9i

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)

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

15

16

Arquitectura
de Oracle 9i

Arquitectura
de Oracle 9i

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.

17

Arquitectura
de Oracle 9i

Tablespaces

Seg. 2

Seg. 1

E1

B1

E2

B2

B3

E3

B4

B5

E4

B6

B7

Uno o ms bloque de S.O.

Reflejando lo explicado mediante un diagrama entidad-relacin tendramos:

B.D.

TABLESPACE

DataFiles

SEGMENTO

EXTENSIONES

BLOQUES DE S.O.

BLOQUES

PARTE Fsica

PARTE Lgica

18

B8

2
Un Mapa de Tablespaces proporcionado por Oracle sera:

2.4. ESPACIO DE TABLAS SYSTEM (Tablespace SYSTEM)


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

19

Arquitectura
de Oracle 9i

Arquitectura
de Oracle 9i

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 la aplicacin Database Configuration
Assistant).

20

Arquitectura
de Oracle 9i

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.

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.

21

Arquitectura
de Oracle 9i

ALTER USER "nombre_usuario" TEMPORARY


TABLESPACE "nombre_tablespace_temporary"

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.

22

Arquitectura
de Oracle 9i

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.


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.

23

Arquitectura
de Oracle 9i

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.

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.

24

Arquitectura
de Oracle 9i

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.

25

Arquitectura
de Oracle 9i

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).

26

Arquitectura
de Oracle 9i

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.

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.

27

Arquitectura
de Oracle 9i

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

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.

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.

28

recuerde_

Arquitectura
de Oracle 9i

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.

29

ndice_

Creacin de
Tablespaces

3.1. DEFINICIN DE SQL. (STRUCTURED QUERY LANGUAGE) ............33


3.2. CREACIN DE TABLESPACES.......................................................33

31

Creacin de
Tablespaces

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.

33

Creacin de
Tablespaces

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.

34

Creacin de
Tablespaces

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

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.

35

Creacin de
Tablespaces

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

36

Creacin de
Tablespaces

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.

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).

37

3
Los

DataFiles

poseen

un

tamao

inicial:

Creacin de
Tablespaces
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.

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).

38

Creacin de
Tablespaces

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.

39

Creacin de
Tablespaces

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.

40

recuerde_

Creacin de
Tablespaces

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.

41

Usuarios

ndice_

4.1. DEFINICIN ...............................................................................45


4.2. ASIGNACIN DE PRIVILEGIOS ...................................................45
4.3. ASIGNACIN DE ROLES ..............................................................47
4.4. CREACIN DE USUARIOS............................................................48

43

Usuarios

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

Usuarios

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.

Usuarios

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.

47

Usuarios

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.

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.

48

Usuarios

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:

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

Usuarios

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";

50

Usuarios

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.

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.

51

Usuarios

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:

Mediante sentencia SQL:

ALTER USER

"USR_PRUEBA"

QUOTA UNLIMITED ON

"PRUEBA_DEFAULT"

QUOTA UNLIMITED ON

"PRUEBA_TEMPORAL"

52

Usuarios

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];

Ejemplo:

GRANT

"AUTHENTICATEDUSER","DBA" TO "USR_PRUEBA";

53

Usuarios

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";
GRANT privilegio_de_sistema TO " nombre_rol ";
GRANT privilegio_de_objeto ON "esquema"."objeto" TO

54

" nombre_rol ";

4
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

Grficamente sera:

55

"ROL_PRUEBA"

Usuarios

Usuarios

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

Por ejemplo: Qu ROLES tiene asignado el usuario USR_PRUEBA?

Select * from DBA_ROLE_PRIVS where GRANTEE='USR_PRUEBA';

56

Roles.

Usuarios

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.

57

58

Usuarios

recuerde_

Usuarios

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.

59

Tablas

ndice_

5.1. DEFINICIN ................................................................................63


5.2. TIPOS DE DATOS .........................................................................63
5.3. DEFINICIN DE ESQUEMA ...........................................................66
5.4. PASOS PARA CREAR UNA TABLA ..................................................67

61

Tablas

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

63

Tablas

estos idiomas necesitan 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/ISO3 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

American National Standards/International Organization for Standardization

64

Tablas

los identificadores de 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.

65

Tablas

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.

66

Tablas

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.

67

Tablas

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.

68

Tablas

Paso 3.- La siguiente ventana Paso 2 de 13, nos permite especificar las columnas
que componen nuestra tabla.
Campos

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.

69

Tablas

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).

70

Tablas

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 FOREIGN 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 los valores de la
MATRICULA se encuentren en mayscula: MATRICULA = UPPER(MATRICULA).

71

72

Tablas

Paso 8.- En el Paso 7 de 13, se permite la modificacin de los

Tablas

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.

73

Tablas

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.

74

Tablas

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.

75

Tablas

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.

76

Tablas

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.

77

Tablas

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....

78

Tablas

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,

DATE

NOT NULL,

NUMBER(7, 2)

NOT NULL,

"FECHA_COMPRA"
"PRECIO_VENTA"

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


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

79

Tablas

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.

80

5
1.

INITIAL - Valor de la primera Extensin del objeto (Tabla). En este caso es


tamao de

2.

Tablas

8 bloques de 8Kbyte cada uno.

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.

81

Tablas

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).

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 dichos.

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.

82

5
2.

Tablas

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 %.
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.

83

Tablas

Cmo DETECTAR estos fenmenos?


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.

84

Tablas

ANALIZE TABLE [esquema.] tabla


VALIDATE STRUCTURE [CASCADE];

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

ESTIMATE.

Si

es

ESTIMATE,

entonces

filas_estimadas o porcentaje_estimado debe ser distinto 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

85

Tablas

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 simultneas 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.
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.

86

Tablas

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.

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 %.

87

Tablas

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%.

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);

88

recuerde_

Tablas

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.

89

ndice_

Operaciones
sobre tablas

6.1. INSERCIONES DE DATOS ............................................................93


6.2. CONSULTAS DE DATOS ...............................................................96
6.3. ACTUALIZACIN Y BORRADO DE DATOS ....................................98
6.4. LA CLAUSULA WHERE ..............................................................99
6.5. RELACIONES ENTRE INSERT Y SELECT ......................................101
6.6. LA VISTA V$NLS_PARAMETERS ................................................103
6.7. FUNCIONES PREDEFINIDAS......................................................105
6.7.1. Funciones de Carcter ...................................................105
6.7.2. Funciones de Conversin ...............................................107
6.7.3. Funciones Numricas ....................................................113
6.7.4. Funciones de Fechas .....................................................114
6.7.5. Funciones de grupo .......................................................116

91

Operaciones
sobre tablas

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

93

Operaciones
sobre tablas

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.

94

Operaciones
sobre tablas

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....

95

Operaciones
sobre tablas

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;

96

Operaciones
sobre tablas

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.

97

Operaciones
sobre tablas

Ejemplo:

SELECT * FROM vehiculos ORDER BY modelo;

GROUP BY. Permite realizar consultas agrupando las columnas.


Ejemplo:

SELECT cilindrada FROM vehiculos group BY cilindrada;

6.3. ACTUALIZACIN Y BORRADO DE DATOS


Las 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;

98

Operaciones
sobre tablas

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;

Ejemplo 2:

DELETE FROM vehiculos;


Igual a:
DELETE vehiculos;

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.

99

Operaciones
sobre tablas

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;

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

100

usamos IS

Operaciones
sobre tablas

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

Operaciones
sobre tablas

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

Operaciones
sobre tablas

de

NLS_LANGUAGE,

6.6. LA VISTA V$NLS_PARAMETERS


La

vista

v$nls_parameters,

me

informa

de

los

valores

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

103

Operaciones
sobre tablas

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

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

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.

104

Operaciones
sobre tablas

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])

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.

105

Operaciones
sobre tablas

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


&.

106

Operaciones
sobre tablas

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.

107

Operaciones
sobre tablas

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.

108

Operaciones
sobre tablas

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)

109

6
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.

Operaciones
sobre tablas

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

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' ' '

110

Operaciones
sobre tablas

El parmetro formato puede tomar los siguientes valores:

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

coma

en

la

posicin

especificada

independientemente de G o D
L

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;

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;

111

Operaciones
sobre tablas

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

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

112

Operaciones
sobre tablas

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;


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.

113

Operaciones
sobre tablas

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.
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.

114

Operaciones
sobre tablas

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 y


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:
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)

115

Operaciones
sobre tablas

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.
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.

116

6
Partiendo de la tabla EMP del usuario SCOTT, es decir:

Tendramos:
Ejemplo:

Select DISTINCT deptno from emp;


Resultado:
DEPTNO
10
20
30

Select deptno from emp GROUP BY deptno;


Resultado:
DEPTNO
10
20
30

117

Operaciones
sobre tablas

Operaciones
sobre tablas

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;


Resultado: 14

118

Operaciones
sobre tablas

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

119

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

Operaciones
sobre tablas

recuerde_

Operaciones
sobre tablas

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

Consultas

ndice_

7.1. CLUSULA HAVING...................................................................125


7.2. OPERACIONES DE CONJUNTOS EN CONSULTAS SQL ..................126
7.3. UNIONES INTERNAS Y EXTERNAS .............................................127
7.4. SUBCONSULTAS........................................................................133
7.4.1. Select como parte de una clusula Where o Having .......133
7.4.2. Select como una tabla ...................................................135
7.4.3. Select como una columna a mostrar ..............................135
7.4.4. Select como parte de una clusula Having .....................137
7.5. CONSULTAS RECURSIVAS .........................................................138
7.6. CONSULTAS CON LA FUNCIN DECODE.....................................140

123

Consultas

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

Consultas

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.

126

Consultas

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.

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 Foreign 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:

127

Consultas

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.
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

Consultas

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 FOREIGN KEY hacia el campo DEPTNO.

129

El resultado sera igual al de una consulta interna.

130

Consultas

Consultas

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.

131

Consultas

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;

132

Consultas

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

133

Consultas

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?

134

Consultas

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}

135

Consultas

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) from


cli_id_cliente=id_cliente)
From clientes.

136

VENTAS where

Consultas

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.

137

Consultas

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 foreign key
puede tomar el valor nulo o el valor de la columna primery key de una fila o registro de la
misma tabla.

138

Consultas

Por ejemplo: supongamos una tabla que almacena la informacin de los mens de una
aplicacin informtica:
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:

139

Consultas

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;

140

recuerde_

Consultas

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.

141

PL/SQL

ndice_

8.1. DEFINICIN DE PL/SQL.............................................................145


8.2. PARTES DE UN PROGRAMA PL/SQL ............................................146
8.2.1. Bloques ..........................................................................146
8.2.2. Variables y Constantes ...................................................147
8.2.3. Instrucciones o Estructuras de Control...........................155
8.2.4. Tratamientos de Errores (Exception)..............................157

143

PL/SQL

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.

145

PL/SQL

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;

146

PL/SQL

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:

Valores enteros entre:


BINARY_INTEGER

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


Valores enteros entre:

PLS_INTEGER

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

CHAR
VARCHAR2

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.
Puede contener cadena de caracteres de longitud variable hasta
32.767 bytes. Un VARCHAR2 de un campo o columna de la B.D. slo

147

PL/SQL

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.


Archivo binario externo, siendo el S.O. quien determina el Tamao. Su
acceso es de slo lectura. Su informacin no es gestionada por Oracle,

BFILE

sino por el S.O. por lo que no estn sujetos a transacciones.

Tipos de Datos Especiales:

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)
);

148

PL/SQL

-- Declaramos una variable del tipo anterior.


vi_datos reg_fecha_hora;

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), Descripcion VARCHAR2(30)
);

149

PL/SQL

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:

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.

150

PL/SQL

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;

Tambin se pueden crear Matrices de Registros:

TYPE

matriz_cliente

IS

TABLE

BINARY_INTEGER;
vi_matriz_cliente matriz_cliente;

151

OF

clientes.%ROWTYPE

INDEX

BY

PL/SQL

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

el

nombre

del

atributo,

vi_matriz_cliente.COUNT
Estos atributos son los siguientes:

COUNT

Devuelve el nmero de filas de la tabla.

DELETE

Borra filas de la tabla.

EXISTS

Devuelve TRUE si existe en la tabla el ndice especificado.

FIRST

Devuelve el ndice de la 1 fila.

LAST

Devuelve el ndice de la ltima fila.

NEXT

Devuelve el ndice de la siguiente fila a la especificada.

PRIOR

Devuelve el ndice de la anterior fila a la especificada.

152

es

decir:

PL/SQL

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;

153

PL/SQL

Al tipo de datos VARRAY, podemos aplicarle los mismos atributos que existen para el
tipo e dato TABLE.
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;

154

PL/SQL

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.

155

PL/SQL

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;

Bucles WHILE: Su sintaxis es:

WHILE condicion LOOP


Sentencias;
END LOOP;

156

PL/SQL

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 la variable para recorrer el rango de valores comprendido


entre valor_inferior y valor_superior. (en el caso de REVERSE sera al revs, es
decir desde valor_superior a valor_inferior).
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..5000 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.
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

157

PL/SQL

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:


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.
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.

158

PL/SQL

Algunas de ellas son:

Se incumple una restriccin UNIQUE o PRIMERY

ORA-0001

DUP_VAL_ON_INDEX

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.

KEY.

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;

EXCEPTION
WHEN Nombre_exception_propia THEN
Sentencias;
WHEN Nombre_exception_predefinida THEN
Sentencias;

159

8
WHEN

PL/SQL

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).

predefinidas son muy tiles para la EXCEPTION others.

160

Estas

funciones

PL/SQL

Si lo aplicamos al ejemplo anterior tendramos:

Podemos usar la funcin predefinida RAISE_APPLICATION_ERROR para crear


nuestros propios mensajes de error.
Ejemplo:

161

PL/SQL

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.

162

recuerde_

PL/SQL

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.

163

ndice_

Funciones, procedimientos,
paquetes y disparadores

9.1. INTRODUCIN..........................................................................167
9.2. PROCEDIMIENTOS ....................................................................168
9.3. FUNCIONES ..............................................................................172
9.4. VISTAS RELACIONADAS CON LOS PROCEDIMIENTOS
Y FUNCIONES ...........................................................................175
9.5. PAQUETES ................................................................................177
9.6. DISPARADORES........................................................................179
9.7. DISPARADORES O TRIGGER MUTANTES ....................................181

165

Funciones, procedimientos,
paquetes y disparadores

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.

167

Funciones, procedimientos,
paquetes y disparadores

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 >>
BEGIN
<< Cuerpo del Procedimiento >>

168

Funciones, procedimientos,
paquetes y disparadores

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

5.

Un procedimiento es una orden DDL, por lo que lleva de forma implcita un COMMIT.

6.

Un procedimiento puede ser llamado desde un mdulo PL/SQL annimo o desde otro
procedimiento, usando tan solo el nombre del procedimiento.

7.

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

169

Funciones, procedimientos,
paquetes y disparadores

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.
Ejemplo:

Declare
Variable_1 NUMBER (5,2);
Variable_2 VARCHAR2(10);
/* Variable_1 y Variable_1 son parmetros reales */
Calcular(Variable_1, Variable_2);

8.

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

9.

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
DESCRIP_CLIENTE

NOT NULL NUMBER(3)


NOT NULL VARCHAR2(30)

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

170

Funciones, procedimientos,
paquetes y disparadores

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

171

Funciones, procedimientos,
paquetes y disparadores

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;

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.

172

Funciones, procedimientos,
paquetes y disparadores

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;
BEGIN
Select count(*) into vi_num_clientes from clientes;
RETURN vi_num_clientes;
END numero_clientes;

173

Funciones, procedimientos,
paquetes y disparadores

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

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

174

Funciones, procedimientos,
paquetes y disparadores

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

175

Funciones, procedimientos,
paquetes y disparadores

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:

176

Funciones, procedimientos,
paquetes y disparadores

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:

177

Funciones, procedimientos,
paquetes y disparadores

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];

Tanto la cabecera como el cuerpo son almacenados por Oracle en el Diccionario de Datos
como objetos diferentes.

178

Funciones, procedimientos,
paquetes y disparadores

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.

179

Funciones, procedimientos,
paquetes y disparadores

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:

3.

2.1.

Si existe, ejecutar por cada fila el disparador BEFORE.

2.2.

Si existe, ejecutar por cada fila el disparador AFTER.

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:

INSERT

UPDATE

DELETE

:old

NULL

Valor antes de actualizar

Valor ante de borrar

:new

Valor que se ha insertado

Nuevo valor actualizado

NULL

180

Funciones, procedimientos,
paquetes y disparadores

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

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.- 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.
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

181

Funciones, procedimientos,
paquetes y disparadores

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 foreign 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

aquellos

disparadores

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;

182

Funciones, procedimientos,
paquetes y disparadores

Tendremos:

Partiendo de esos datos realizaremos y comprobaremos el trigger.

Si intentamos actualizar el nmero del departamento para el empleado nmero 7369 al


departamento 10, Oracle nos informa de que la tabla est mutando.

183

184

Funciones, procedimientos,
paquetes y disparadores

recuerde_

Funciones, procedimientos,
paquetes y disparadores

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.

185

Cursores

ndice_

10

10.1.

TIPOS DE CURSORES .............................................................189

10.2.

ATRIBUTOS DE CURSORES .....................................................191

10.3.

RECORRIDO DE CURSORES ....................................................192

10.4.

BLOQUEOS CON EXCLUSIVIDAD.............................................194

10.5.

VARIABLES DE CURSOR .........................................................194

187

10
10.1.

Cursores

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. 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;

189

10

Cursores

A esta modalidad se le denomina cursores parametrizados.


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.

190

10
10.2.

Cursores

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.

%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.

191

10

Cursores

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

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 );

192

10

Cursores

FETCH c_cliente INTO vi_registro;


END LOOP;
CLOSE c_cliente;
COMMIT;
END;

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

193

10
10.4.

Cursores

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.
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.

194

10

Cursores

Ejemplos:

DECLARE
TYPE tipo_registro IS RECORD
( id_cliente CLIENTES.id_cliente%TYPE,
datos_cliente CLIENTES .descrip_cliente%TYPE);
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 variable 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;

195

10
vi_descripcion VARCHAR2(30);
BEGIN
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:

196

Cursores

recuerde_

10

Los cursores son

Cursores

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.

197

ndices

ndice_

11

11.1.

DEFINICIN ..........................................................................201

11.2.

CARACTERTICAS DE LOS NDICES .......................................202

11.3.

REGLAS A LA HORA DE CREAR UN NDICE ..............................203

11.4.

TIPOS DE NDICES ................................................................205

11.5.

11.4.1.

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

11.4.2.

ndices de Mapas de Bits .........................................205

11.4.3.

ndices basados en una funcin ...............................207

11.4.4.

ndices de Clave Inversa .........................................208

11.4.5.

Cluster o Agrupamiento ...........................................208

CREACIN DE NDICES ..........................................................210

199

11
11.1.

ndices

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.

201

11

ndices

(Total Buffer / Tamao Columna * N de columnas recuperadas = Filas Extraidas )

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.

202

11

11.3.
a.

ndices

REGLAS A LA HORA DE CREAR UN NDICE


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.

203

11
d.

ndices

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.
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:

204

11

ndices

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.

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.

205

11

ndices

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:
Select rownum, c3 from tabla;

ROWNUM

C3

Informtico

Abogado

Arquitecto

Abogado

Pedagogo

Informtico

Abogado

Arquitecto

Informtico

10

Arquitecto

11

Pedagogo

12

Abogado

13

Informtico

14

Pedagogo

15

Arquitecto

Si hacemos una consulta ordenada por C3 y Rownum tendramos:

ROWNUM

C3

Abogado

Abogado

Abogado

12

Abogado

Arquitecto

Arquitecto

10

Arquitecto

15

Arquitecto

206

11
1

Informtico

Informtico

Informtico

13

Informtico

Pedagogo

11

Pedagogo

14

Pedagogo

ndices

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:

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 1

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.

207

11

ndices

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.
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. 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.

208

11

ndices

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.
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.

209

11

ndices

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.
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.

210

11

ndices

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:

211

11

ndices

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).

212

11

ndices

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").
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";

213

11
3.

ndices

ndice de basado en funcin.

CREATE INDEX "USR_PRUEBA"."INDICE3"


ON " USR_PRUEBA"."VEHICULOS" columna_funcion( UPPER(COLOR))
TABLESPACE "PRUEBA_INDEX";

214

recuerde_

11

ndices

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.

215

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.
COLUMNAS. Ver CAMPO.
CONTROLFILE. Ver FICHEROS DE CONTROL.
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.

217

glosario_

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.
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.

218

glosario_

R
REDOLOG. Ver FICHEROS REDO LOG.
ROL. Conjunto de privilegios concedidos a un usuario.
ROWID. Identificador nico por cada fila de una tabla de la B.D.
RUTA DE ACCESO. Ubicacin en disco duro dnde se instalarn los programas
de instalacin de Oracle.
S
SCHEMA. Objeto de la B.D. dnde se recoge de forma lgica la estructura de un
diseo relacional.
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.

219

glosario_

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.

220

Potrebbero piacerti anche