Beruflich Dokumente
Kultur Dokumente
Tema 1
INSTALACIN
ORACLE 9i
-1-
Una vez pasada esta ventana, podemos observar las carpetas creadas en el disco duro:
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.
Personalizado
-5-
Las B.D. del tipo Procesamiento de Transacciones, son aquellas que reciben un gran nmero de
transacciones al segundo por parte de un volumen elevado de usuarios. Ejm.- Entidades Bancarias.
Las B.D. del tipo Almacenes de Datos, son las B.D. conocidas con Data WareHouse, destinadas a la
toma de decisiones sobre grandes volmenes de datos e informacin a procesar e interpretar, sin ningn
nivel de transacciones.
-6-
Por defecto le pondremos el nombre GLOBAL a la B.D. y a su vez el propio programa de instalacin
asignar como SID el nombre de GLOBAL.
-7-
Por cuestiones de rendimiento, Oracle aconseja que la ruta especificada en la ventana anterior, est en
un disco duro distinto al que se ha usado para ubicar el software de instalacin, es decir, distinto a la ruta
indicada en la ventana de Ubicacin de los Archivos (C:\oracle\ora9).
-8-
SYS / change_on_install
SYSTEM / manager
Dicha ventana, adems de solicitarnos dichos cambios, nos muestra informacin de la B.D. creada, qu
fichero posee los parmetros de iniciacin de dicha B.D. y dnde est ubicado fsicamente.
-9-
- 10 -
RECUERDE
A la hora de instalar Oracle hay que tener muy claro dnde se instalar, es decir, el
ORACLE_HOME.
Tambin conviene determinar previamente el tipo de instalacin y tipo de B.D. que se desea
crear en el proceso de instalacin.
Dos de los datos ms importantes a considerar son el nombre de la Base de Datos y el SID.
Una vez finalizada la creacin de la B.D., Oracle nos solicitar las password para los usuarios
SYS y SYSTEM por motivos de seguridad.
- 11 -
Tema 2
ARQUITECTURA DE
ORACLE 9i
- 13 -
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:
- 15 -
Tabla A
Tabla B
Tabla C
.............
Espacio de Tabla
Fichero de Dato 1
Fichero de Dato 2
- 16 -
- 17 -
- 18 -
Tablespaces
Seg. 1
Seg. 2
E1
B1
E2
B2
B3
E3
B4
B5
E4
B6
B7
B8
B.D.
TABLESPACES
DataFiles
SEGMENTO.
EXTENSIONES
Bloques de S.O.
BLOQUES
PARTE Lgica
PARTE Fsica
- 19 -
- 20 -
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
la
aplicacin
Configuration
Assistant).
- 21 -
Las vistas, sinnimos, secuencias y las especificaciones de un objeto, son definiciones que no
almacenan datos, pero dichas definiciones se almacenan en el diccionario de datos que se engloba
en el Tablespaces SYSTEM.
- 22 -
- 23 -
- 24 -
Los tablespaces que gestionan sus propias extensiones, conservan un bitmap en los 64 Kbyte primero de
cada archivo de datos para mantener un seguimiento del estado libre o utilizado de los bloques de ese
archivo de datos.
Cada bit del bitmap se corresponde con un bloque o grupo de bloques. Cada vez que una extensin se
asigna o se libera para volver a utilizarla, Oracle cambia los valores del bitmap para que muestren el
nuevo estado de los bloques. Esta modalidad, requiere menos reorganizacin.
La otra modalidad es mediante administracin DICTIONARY (Managed in the Dictionary), usada en
versiones anteriores. La informacin del espacio de tabla que se est usando, se almacena en una serie
de tablas existentes en el diccionario de datos.
- 26 -
- 27 -
- 28 -
- 29 -
- 30 -
RECUERDE
En la versin Oracle 9i los tablespaces son gestionados localmente, no por diccionario de datos.
En los ficheros de CONTROL Oracle almacena la informacin de todos los ficheros implicados
en el funcionamiento de la B.D.
- 31 -
Tema 3
CREACIN DE
TABLESPACES
- 33 -
- 35 -
Paso 4.- En la ventana que nos aparece, escribimos el nombre PRUEBA. En dicha ventana, podemos
observar cmo Oracle de forma automtica asigna el mismo nombre del tablespace al fichero de datos y
lo ubicar por defecto en C:\ORACLE\ORADATA\GLOBAL\ siendo GLOBAL el nombre de la B.D. y
asigna como tamao del DataFile, 5 Mbyte.
- 36 -
Las opciones por defecto asignadas a los parmetros de almacenamiento son las siguientes:
- 37 -
Paso 5.- Una vez pulsado el botn de CREAR, nos debe aparecer el mensaje de Tablespace creado.
Una vez hecho esto, podremos comprobar como aparece dentro de los tablespaces existentes en la
carpeta Tablespaces.
La sintaxis de la sentencia SQL que creara el TABLESPACE prueba sera:
CREATE TABLESPACE "PRUEBA"
LOGGING
DATAFILE 'C:\ORACLE\ORADATA\GLOBAL\PRUEBA.ora' SIZE 5M
EXTENT MANAGEMENT LOCAL SEGMENT SPACE
MANAGEMENT AUTO
Lo primero que nos encontramos es el nombre del TABLESPACE, en este caso: PRUEBA.
A continuacin, la clusula LOGGING, que puede ser LOGGING o NOLOGGING, nos permite establecer
a nivel global sobre el Tablespaces la opcin de generar informacin de REDO (Deshacer) sobre los
objetos tablas e ndices. Por defecto es LOGGING, aunque es modificable a nivel de objeto
individualmente, es decir, al crear una tabla o especificar un ndice.
- 38 -
- 39 -
Una vez activada esa opcin, debemos especificar el valor Kbytes o Mbytes que queremos que crezca el
Datafiles y si deseamos que su crecimiento sea ilimitado (UNLIMITED) o limitado (MAXSIZE valor).
Grficamente sera:
Para eliminar un tablespaces, es tan simple como hacer clic derecho sobre el nombre del Tablespace,
dentro de la aplicacin Enterprise Manager Console y seleccionar la opcin Eliminar. En versiones
anteriores, tras borrar un Tablespaces, el DataFile o Datafiles asociados no eran eliminados fsicamente
del Sistema Operativo. Esta opcin de Oracle nos lo permite.
Tanto el nmero de Tablespaces que puede poseer una B.D. es limitado al igual que el nmero de
DataFiles por Tablespaces.
- 41 -
RECUERDE
-
El primer paso a la hora de trabajar con una B.D. Oracle, es crear un TABLESPACE.
- 42 -
Tema 4
USUARIOS
- 43 -
4.1. DEFINICIN
Los usuarios son los propietarios de los objetos de la B.D. (Tablas, ndices, Funciones, Procedimientos,
Paquetes, Secuencias, etc.).
En todo S.G.B.D. Oracle, diferenciamos dos usuarios muy importantes:
a) El usuario SYS.- Es el propietario de las tablas del DICCIONARIO DE DATOS, que es
dnde se almacena informacin correspondiente a la estructura de la B.D. Adems de tener
acceso a la ejecucin de los paquetes predefinidos ( DBMS_ ).
b) El usuario SYSTEM.- Esta cuenta de usuario es la cuenta por defecto del Administrador de
la B.D. Se aconseja y recomienda crear otra cuenta para el administrador y no usar la
cuenta System. Este usuario, est autorizado a tener acceso a las vistas que permiten
obtener informacin de las tablas del Diccionario de Datos.
Un aspecto que debemos tener presente es que a partir de la versin 9i desaparece la cuenta de usuario
INTERNAL/Oracle.
Por tanto, podemos decir que las cuentas SYS y SYSTEM son las de mayor control y poder sobre la B.D.,
por lo que ES OBLIGATORIO cambiar su clave. Este cambio es solicitado en el proceso de instalacin.
Los usuarios se asignan a Tablespaces creados previamente para el almacenamiento de los objetos. Se
recomienda siempre dos tablespaces el Default o de Datos y el Temporal.
La cuenta de un usuario puede bloquearse (lock) para evitar acceder a la B.D.
Cada vez que se crea un objeto de la B.D. se crea bajo una cuenta de usuario.
- 45 -
Diferenciamos:
Privilegios de Sistema.- Permite al usuario realizar algn tipo de accin que afecte a todo el
Sistema. Son unos 155 aproximadamente. Por ejemplo:
CREATE SESSION.- Permiso para conectarse al servidor de B.D. Si no tuviera dicho permiso,
mostrara el siguiente error:
ERROR:
ORA-01045: user USR_PRUEBA lacks CREATE SESSION privilege; logon denied
- 46 -
- 47 -
Paso 2.- En este paso slo escribiremos el nombre del usuario: USR_PRUEBA, y como clave:
usr_prueba, asignndoles el tablespaces por defecto PRUEBA_DEFAULT y como temporal el
PRUEBA_TEMPORAL. Si no se especificase ninguno, el tablespaces por defecto es el USERS y el
temporal TEMP ya que es un Tablespaces de tipo TEMPORAL y es definido como temporal por defecto.
El tipo de AUTENTIFICACIN puede ser del tipo:
- 48 -
Contrasea.- Oracle solicita cada vez que un usuario decide tener acceso a una herramienta
suya, un nombre de usuario y una contrasea. Su comprobacin se realiza en la
propia gestin de usuarios de Oracle.
Externo.-
Global.-
- 49 -
Si observamos la pestaa ROL, podemos comprobar como se le asigna de forma predeterminada el Rol
CONNECT.
La sentencia SQL correspondiente a la creacin del usuario "USR_PRUEBA" sera:
CREATE USER "USR_PRUEBA"
PROFILE "DEFAULT"
IDENTIFIED BY "usr_prueba"
DEFAULT TABLESPACE "PRUEBA_DEFAULT"
TEMPORARY TABLESPACE "PRUEBA_TEMPORAL"
ACCOUNT UNLOCK;
GRANT "CONNECT" TO "USR_PRUEBA";
El Rol Connect engloba a los siguientes privilegios por defecto:
Grficamente sera:
- 51 -
- 52 -
Ejemplo:
GRANT "AUTHENTICATEDUSER","DBA" TO "USR_PRUEBA";
Para quitar o revocar:
Privilegios de Sistema a Usuarios:
Podemos crear ROLES propios formado por otros roles y privilegios de sistema y de objetos. Esto se
recomienda cuando tenemos que crear muchos usuarios de la B.D. y asignarles roles y privilegios.
Para ello, podemos usar la herramienta grfica EMC (Enterprise Manager Console) o mediante la
sentencia SQL.
CREATE ROLE nombre_rol
[NOT IDENTIFIED || IDENTIFIED contrasea];
GRANT "rol_existente" TO "nombre_rol";
- 53 -
- 54 -
Toda la informacin correspondiente a los Roles y Privilegios es almacenada en las vistas del Diccionario
de Datos, estas son:
DBA_ROLES.- Nombre de los ROLES y estado de contrasea.
DBA_ROLE_PRIVS.- Usuarios que poseen ROLES.
DBA_SYS_PRIVS.- Usuarios con Privilegios de Sistema.
DBA_TAB_PRIVS.- Usuarios con Privilegios sobre las Tablas.
DBA_COL_PRIVS.- Usuarios con Privilegios sobre columnas.
ROLE_ROLE_PRIVS.-Roles concedidos a otros roles.
ROLE_SYS_PRIVS.- Privilegios de Sistemas otorgados a Roles.
ROLE_TAB_PRIVS- Privilegios de Tablas otorgados a Roles.
- 55 -
Por ltimo, el usuario que se crea se puede asignar a un Perfil (PROFILE), cuya funcin es asignar un
conjunto de restricciones referentes al consumo de recursos del Sistema, por parte del usuario (Tiempo
de CPU, Entradas/Salidas a disco, sesiones, etc.) y proteger el control de acceso (caducidad de
contrasea, histricos de contrasea, etc.).
Por defecto, si no se ha creado ningn Perfil se asigna el Default, en el cul todo es ilimitado y sin
restricciones.
Slo diferenciar entre Default e Unlimited.
Default.- Si se especifica en un nuevo Perfil, Oracle asigna el valor existente para ese parmetro en el
perfil Default.
Unlimited: Sin lmite en ese parmetro.
Un usuario slo puede tener un Perfil.
- 56 -
- 57 -
RECUERDE
Los usuarios SYS y SYSTEM son los de mayor PODER sobre la B.D.
El nivel de AUTORIZACIN de los usuarios, se les concede por medio de los PRIVILEGIOS y
ROLES.
Puede crear a los usuarios mediante sentencias SQL o a travs de Enterprise Manager
Console.
Un usuario puede tener o no un perfil, pero en caso de tenerlo, slo puede poseer uno.
- 58 -
Tema 5
TABLAS
- 59 -
5.1. DEFINICIN
Las TABLAS son la estructura bsica en los diseos de B.D. Se componen de una serie de columnas
(campos) cuyo conjunto se denomina filas (registros). Ellas contienen o almacenan los datos por
columnas agrupadas en filas.
Es aconsejable que toda tabla tenga una columna denominada clave, es decir, es aquella columna que
identifica de forma nica a cada fila. Puede estar compuesta por ms de una columna. A esa columna o
columnas se le denomina PRIMERY KEY.
Ejemplo:
Tabla: VEHICULOS
Campos o Columnas: Matricula, Modelo, Color, Cilindrada, Fecha_Compra, Precio_Venta
Filas o Registros:
3234-BCV, OPEL, Blanco, 1600, 10/10/1998, 6100.56
SE-2356-FG, SEAT, Azul, 1400, 12/11/2000, 6500.75
VEHICULOS
Matricula
Modelo
Color
Cilindrada
Fecha_Compra
Precio_Venta
3234-BCV
OPEL
Blanco
1600
10/10/1998
6100,55
SE-2356-FG
SEAT
Azul
1400
12/11/2000
6500,75
La columna Primery Key es la columna Matricula que es nica por cada fila.
ms de un byte para su almacenamiento, de ah que usemos los tipos de datos: NCHAR, NVARCHAR2 y
CLOB.
NCHAR.- Columna de longitud FIJA para juego de caracteres MULTIBYTE. Su tamao mximo es 2000
caracteres o 2000 Bytes por fila, dependiendo del juego de caracteres, siendo la configuracin
predeterminada de 1 Byte.
NVARCHAR2.- Columna de longitud VARIABLE para juego de caracteres MULTIBYTE. Su tamao
mximo es 4000 caracteres o 4000 Bytes por fila, dependiendo del juego de caracteres,
siendo la configuracin predeterminada de 1 byte.
NUMBER.-Columna numrica de longitud VARIABLE. Abarca los tipos de datos ANSI/ISO1 NUMERIC,
DECIMAL, DEC, INTEGER, INT, SMALLINT. Si queremos representar un nmero decimal
sera NUMBRE(9,2), que quiere decir: 9 dgitos de los que 2 son decimales.
El nmero de BYTE que ocupa el nmero a almacenar, se calcula dividiendo la longitud total
por 2, se redondea a un nmero entero y se suma 1. Por tanto NUMBER(9) ocupara 6 Bytes.
DATE.- Columna de longitud FIJA de 7 Bytes, que nos permite almacenar la fecha y la hora. Su formato
predeterminado es: DD-MON-YY HH:MI:SS. Con HH en formato AM y PM.
LONG.- Columna que puede contener una cadena de longitud variable, con longitud mxima de 2GBytes.
RAW.- Columna de longitud VARIABLE para datos binarios, de longitud mxima 2000 Bytes. Podemos
decir que RAW es similar a VARCHAR2, pero con la diferencia de que no se realizan conversiones entre
conjuntos de caracteres distintos, de diferentes B.D.
LONG RAW.- Columna de longitud variable para datos binarios, de longitud mxima 2GBytes.
ROWID.- Datos binarios que representan un identificador de fila (RowID).
Los identificadores de fila se almacenan internamente como un nmero binario de longitud fija,
siendo esta longitud variable entre distintos S.O. Para poder manipular los identificadores de
fila, estos pueden ser convertidos a una cadena de caracteres mediante la funcin
ROWIDTOCHAR. Esta funcin genera una salida de 18 caracteres con el formato:
BBBBBBBB.FFFF.AAAA
Donde:
BBBBBBBB.- Identifica el bloque de dato dentro del Datafile.
FFFF.- Identifica la Fila dentro del bloque.
AAAA.- El nmero de archivo.
Cada parte es un nmero hexadecimal, por ejemplo:
0000001E.00FF.0001 representa el bloque 30. fila 255 u fichero 1.
Los tipos de la Familia LOB disponibles a partir de Oracle 8 o superior se crearon para solucionar y
ampliar las prestaciones de los tipos LONG y LONG RAW.
Los LOB internos son BLOB, CLOB y NCLOB y el LOG externo es BFILE. Los LOB internos, se
manipulan usando rdenes DML SQL o el paquete predefinido DBMS_LOB.
BLOB.- Objeto binario de GRAN TAMAO, hasta 4 GBytes.
CLOB.- Objeto de caracteres de GRAN TAMAO, hasta 4 Gbytes.
NCLOB.- Tipo de dato CLOB, para juego de caracteres multibyte, hasta 4Gbytes.
BFILE.- Archivo binario externo, siendo el S.O. quien determina el Tamao. Su acceso es de slo lectura.
Su informacin no es gestionada por Oracle, sino por el S.O. por lo que no estn sujetos a
transacciones.
UROWID.- Datos binarios utilizados para el direccionamiento de datos, de longitud mxima 4000 bytes.
Usado para el manejo de tablas e ndices particionados.
FLOAT.- Abarca los tipos de datos ANSI/ISO estndar FLOAT, REAL, DOUBLE PRECISION, todos ellos
podemos englobarlo dentro del NUMBER.
- 63 -
Esta forma de organizacin lgica, nos permite tener objetos con el mismo nombre, por ejemplo dos
tablas, en esquemas distintos sin crear ningn conflicto a la gestin interna de Oracle.
Hay que tener MUY CLARO que toda nuestra estructura lgica de la B.D. se organiza en el Esquema,
adems de que un esquema est directamente relacionado con un USUARIO, tal que el ESQUEMA
tiene el mismo nombre que el USUARIO. Por ello, se crean al crear un objeto perteneciente al usuario.
- 64 -
Paso 2.- Seleccionamos el objeto Tabla y pulsamos el botn &Crear, comprobando que tengamos
activa la opcin &Usar Asistente. En este punto, nos aparecer la primera ventana del asistente Paso 1
de 13.
- 65 -
- 66 -
Paso 3.- La siguiente ventana Paso 2 de 13, nos permite especificar las columnas que componen
nuestra tabla.
Campos o Columnas: Matricula, Modelo, Color, Cilindrada, Fecha_Compra, Precio_Venta
Paso 4.- La siguiente ventana del asistente Paso 3 de 13, nos permitir especificar qu columna de las
que componen la Tabla es la clave primaria. Adems de qu nombre deseamos poner a la restriccin que
comprueba y verificar que sea nico por cada fila el valor introducido en dicha columna o campo. Oracle
crea una asignacin automtica.
Para ello, slo tendremos que seleccionar la opcin S, deseo crear una clave primaria, y especificar en
la columna Orden el orden de creacin. Por nombre de restriccin, no usaremos en este ejemplo el
Asignado por el Sistema, por lo que usaremos el nombre PK_VEHICULO.
- 67 -
Paso 5.- La siguiente ventana del asistente, nos permite especificar las restricciones de valor nulo y de
valor nico en las distintas columnas de nuestra B.D. Aquellas columnas que deseemos sean nicas,
podemos especificar el nombre de la restriccin, o bien, que Oracle los asigne automticamente.
En nuestro ejemplo slo especificaremos que la columna COLOR pueda tomar el valor NULO (NULL).
- 68 -
Paso 6.- Es este paso del asistente Paso 5 de 13, se detalla qu columna de nuestra tabla es una clave
ajena de otra tabla, tambin conocida como FOREING KEY. Para este ejemplo no tenemos ninguna.
Si la hubiese, tendramos que detallar el esquema en el que est la tabla Maestra (Esquema de
Referencia), nombre de la misma (Tabla de Referencia) y columna de la tabla que se hereda (Columna
de Referencia).
Paso 7.- El Paso 6 de 13, nos permite realizar un control sobre posibles valores a tomar por la columna
o conversiones automticas.
En nuestro ejemplo obligaremos a que los posibles valores de la columna MODELO sean: OPEL, SEAT,
RENAULT, MERCEDES, AUDI. Tambin que la MATRICULA sus valores sean convertidos a mayscula
UPPER(MATRICULA).
- 69 -
- 70 -
Paso 8.- En el Paso 7 de 13, se permite la modificacin de los parmetros de almacenamiento por
defecto para la Tabla.
Si NO SE SELECCIONA la opcin Sustituir parmetros de almacenamiento por defecto, Oracle
gestionar el tamao automticamente, basndose en el Tamao Inicial y en la Tasa de Crecimiento
aproximado de cada fila de la tabla.
Nmero Inicial de Filas: Nmero de filas de la tabla. Oracle, utiliza el nmero de filas para determinar el
tamao de la primera extensin de segmento.
Ratio de Crecimiento: Ratio de crecimiento de la tabla esperado en filas / unidad de tiempo (da,
semana, mes, ao). Este valor es usado por Oracle para determinar el tamao (en bytes) de la siguiente
extensin de segmento.
Las opciones Actividad de Actualizacin y Actividad de Insercin permiten a Oracle definir los
parmetros del bloque de datos ptimos que minimizan el encadenamiento y la migracin de filas.
- 71 -
- 72 -
El poder particionar, tambin nos permite asignar las particiones a ms de un Tablespaces distinto, por lo
que podemos:
- Reducir la posibilidad de corrupcin de datos, por tratarse de tamaos muy grandes.
- Podemos hacer copias de seguridad de las particiones de forma individual.
- Reducir o dividir la carga de E/S si asignamos esas particiones en unidades fsicas de disco
distintas.
El particionamiento, podemos hacerlo por bloques de filas, segn los rangos de valores de columna
especificados.
IMPORTANTE: Si una Tabla posee un tipo de dato LONG o LONG RAW, NO podremos particionarla. En
su lugar, a la hora de disear la tabla, definimos el campo del tipo LOB.
Aunque el Asistente slo nos permite particionar por un solo campo, la Tabla puede ser particionada
por ms de un campo.
- 73 -
- 74 -
Si hubisemos seleccionado la particin, los pasos siguientes antes de llegar al Paso 13 de 13 nos
solicitan informacin para definir el particionaminto.
Una vez pulsado el botn Terminar en la ventana Paso 13 de 13, nos debe aparecer la ventana de
confirmacin indicando que la Tabla ha sido creada.
Si observamos en el apartado de Esquema de la consola del Oracle Enterprise Manager, podemos ver
como dentro de la carpeta Tablas, aparece la tabla creada, VEHICULOS.
- 75 -
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,
- 76 -
Oracle nos muestra una ventana con el cdigo SQL, PERO mucho ms detallado, que el mostrado por el
asistente de creacin de tablas.
VARCHAR2(15 byte)
NOT NULL,
"MODELO"
VARCHAR2(15 byte)
NOT NULL,
"COLOR"
VARCHAR2(10 byte),
"CILINDRADA"
NUMBER(4)
NOT NULL,
"FECHA_COMPRA"
DATE
NOT NULL,
"PRECIO_VENTA"
NUMBER(7, 2)
NOT NULL,
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:
extensiones:
STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0)
MUY IMPORTANTE: En los TABLESPACES gestionados localmente, el tablespaces se encarga de
gestionar su propio espacio manteniendo un mapa de bits en cada DATAFILES de
los bloques libres y ocupados del DataFiles, por lo que cada vez que una extensin
se libera o asigna para un nuevo uso, Oracle actualizar dicho mapa de bits. En
este sentido conviene aclara que dichas extensiones no necesitan ser agrupadas
manualmente ya que Oracle las determinar automticamente.
1. INITIAL - Valor de la primera Extensin del objeto (Tabla). En este caso es tamao de
8 bloques de 8Kbyte cada uno.
- 78 -
- 79 -
Directorio de Tablas.- Guarda informacin de las Tablas que tienen datos en el bloque.
Directorio de Filas.- Guarda informacin sobre las filas de las tablas que se encuentran en ese
momento en el bloque. Esta informacin est compuesta por la direccin de la fila en la zona Datos
de Filas, en la cul Oracle debe localizar los Datos.
Al espacio ocupado por la Cabecera de Bloque, Directorio de Tablas y Directorio de Filas
se le denomina overhead.
Espacio Libre.- Zona reservada para la insercin de nuevas filas en el Bloque o para las
actualizaciones que requieran ms tamao del que disponan originalmente a cuando fueron
insertados. Este es el caso, por ejemplo, de las columnas de tipo Varchar2.
Datos de Filas o Espacio de Datos.- Almacena las filas de datos de las Tablas, ndices y
Segmentos de Rollback, es decir, los datos propiamente dicho.
Los parmetros que afectan al bloque son:
PCTFREE 10 PCTUSED 0 INITRANS 1 MAXTRANS 255
1. PCTFREE.- Su valor indica el PORCENTAJE de espacio mnimo libre reservado en
cada bloque de datos para ampliaciones resultantes de actualizaciones e inserciones
de filas en el bloque de datos. Se establece al crear la tabla o el ndice.
Por defecto 10 %, pudiendo asignar un valor entre 0 y 99.
Por ejemplo: Si ponemos su valor a 20 al crear la tabla, cuando insertemos en la tabla
y el espacio libre en el bloque baje de este 20%, no se podr insertar ms en ese
bloque, dejando el espacio sobrante para ampliaciones de actualizaciones.
El valor de este parmetro solo afecta a las futuras inserciones.
2. PCTUSED.- En este parmetro, se especifica la cantidad de espacio libre que debe
haber en el bloque para poder insertar en l. Su valor afecta a todos los bloques. Su
valor por defecto es 40 %.
- 80 -
Por ejemplo:
ALTER TABLE "USR_PRUEBA"."VEHICULOS" PCTUSED 40;
Esto quiere decir que en un bloque NO se pueden insertar nuevas filas de datos, hasta
que el espacio ocupado por las filas de ese bloque no baje del 40 %.
Nota.- En datos del tipo ndice, no tiene utilidad este parmetro (PCTUSED), por la
propia estructura interna de estos datos. (rbol binario)
Las vistas del Diccionario de Datos, asociadas al usuario SYS que nos permiten saber
el valor de dicho parmetro son dba_tables y dba_indexes.
Por ejemplo:
select TABLE_NAME,PCT_FREE,PCT_USED
from dba_tables
where OWNER='USR_PRUEBA';
- 81 -
- 82 -
- 83 -
- 84 -
Esta ventana presenta la opcin de CLCULO AUTOMTICO. En la cul se nos solicita la siguiente
informacin:
Ratio de Crecimiento.- Es el Ratio de crecimiento de la tabla esperado en filas/unidad de
tiempo (da, semana, mes o ao). Siendo el crecimiento mayor en da.
Oracle, utiliza el ratio de crecimiento para determinar el tamao (en bytes) de la siguiente
extensin (NEXT). Por tanto, el valor mnimo es un bloque (8192 Byte = 8Kbyte) .
Cuanto mayor sea la relacin filas/da, mayor ser el valor de NEXT.
Actividad de Actualizacin. (PCTFREE)
Determina el porcentaje de espacio que queda libre para las actualizaciones en cada uno de
los bloques de datos del ndice.
Superior.- Define el porcentaje de cada bloque de datos para actualizaciones de las
filas existentes.
Por ejemplo: Para un Ratio de 100 filas / da, tendramos un NEXT de 40960
Byte ( 5 bloques de 8KByte), un PCTFREE del 0 % y un PCTUSED del 60 %.
Tamao de Fila de Aumento por Actualizacin.- Disponible si la Actividad de
Actualizacin es alta, reserva el 20 por ciento de cada bloque de datos para
actualizaciones de las filas existentes, incluidas las supresiones.
Para el ejemplo anterior, obtendramos un PCTFREE del 20 %.
Inferior o Ninguno.- Reserva el 5 por ciento de cada bloque de datos para
actualizaciones de las filas existentes, es decir, un PCTFREE del 5 %.
Actividad de Insercin. (PCTUSED)
Determina el porcentaje de espacio que queda libre para las inserciones en cada uno de los
bloques de datos.
Superior.- Define el porcentaje de espacio reservado para las inserciones en un 40 por
ciento. Si incluimos las supresiones, dicho valor aumenta un 20 %, por tanto, PCTUSED
vale 60%.
- 85 -
- 86 -
RECUERDE
Los tipos de DATOS usados con mayor frecuencia son: Number, Varchar2 y Date.
- 87 -
Tema 6
OPERACIONES SOBRE
TABLAS
- 89 -
- 91 -
Desde SQLPlus Worksheet, una vez conectado, slo tendramos que ejecutar la sentencia o sentencias.
Para ejecutar una sentencia, slo tendremos que pulsar la tecla F5 o hacer clic en el botn de Ejecutar.
- 92 -
Otra posibilidad es tener las instrucciones SQL escritas en un fichero de texto con extensin SQL y cargar
dicho fichero en el Worksheet.
Ahora bien desde la versin 8i, Oracle a travs de la herramienta grfica Oracle Enterprise Console,
nos proporciona la introduccin de datos. Slo tendremos que posicionarnos en la tabla y seleccionar,
una vez pulsado el clic derecho, la opcin Ver/Editar Contenido....
- 93 -
- 94 -
- 95 -
ORDER BY
Esta clusula es utilizada para mostrar el resultado de la consulta de forma ordenada por la columna o
columnas especificadas.
Ejemplo:
SELECT * FROM vehiculos ORDER BY modelo;
GROUP BY
Permite realizar consultas agrupando las columnas.
Ejemplo:
SELECT cilindrada FROM vehiculos group BY cilindrada;
- 96 -
Para borrar los datos de una tabla usaremos la sentencia SQL DELETE, cuya sintaxis es:
DELETE [FROM] [esquema.] tabla
[WHERE condiciones];
Si no se especificase la clusula WHERE, borraramos todas las filas de la tabla.
Ejemplo 1:
DELETE FROM vehiculos WHERE matricula= 2235-AAB;
- 97 -
Ejemplo 2:
DELETE FROM vehiculos;
Igual a:
DELETE vehiculos;
- 98 -
- 99 -
IS NULL
Para consultar filas dnde existan columnas con valor NULL, usamos IS NULL ya que la condicin =
NULL, no dara un resultado correcto.
- 100 -
Otra forma de hacer una copia de una tabla es crear la tabla y seleccionar los datos en el proceso de
creacin.
CREATE TABLE nueva_tabla AS SELECT * FROM [esquema.] tabla;
- 101 -
La tabla creada contiene la misma estructura de datos que la tabla origen, PERO NO las restricciones.
Desde la herramienta Enterprise Manager Console, podemos hacer una copia de la tabla usando el
botn Crear como.... Esta opcin nos permite crear una copia de la tabla tanto de datos como de
restricciones.
- 102 -
- 103 -
VALUE
NLS_LANGUAGE
SPANISH
NLS_TERRITORY
SPAIN
NLS_CURRENCY
NLS_ISO_CURRENCY
SPAIN
NLS_NUMERIC_CHARACTERS
,.
NLS_CALENDAR
GREGORIAN
NLS_DATE_FORMAT
DD/MM/RR
NLS_DATE_LANGUAGE
SPANISH
NLS_CHARACTERSET
WE8ISO8859P1
NLS_SORT
SPANISH
NLS_NCHAR_CHARACTERSET
WE8ISO8859P1
11 filas seleccionadas.
Valores devueltos por la vista en una B.D. Oracle 9i:
PARAMETER
VALUE
NLS_LANGUAGE
SPANISH
NLS_TERRITORY
SPAIN
NLS_CURRENCY
- 104 -
NLS_ISO_CURRENCY
SPAIN
NLS_NUMERIC_CHARACTERS
,.
NLS_CALENDAR
GREGORIAN
NLS_DATE_FORMAT
DD/MM/RR
NLS_DATE_LANGUAGE
SPANISH
NLS_CHARACTERSET
WE8MSWIN1252
NLS_SORT
SPANISH
NLS_TIME_FORMAT
HH24:MI:SSXFF
NLS_TIMESTAMP_FORMAT
DD/MM/RR HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT
HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT
NLS_DUAL_CURRENCY
NLS_NCHAR_CHARACTERSET
AL16UTF16
NLS_COMP
BINARY
NLS_LENGTH_SEMANTICS
BYTE
NLS_NCHAR_CONV_EXCP
FALSE
19 filas seleccionadas.
Ver la lista de lenguajes y territorios soportados por Oracle 9i en el Anexo A.
- 105 -
al
operador ||.
INITCAP(cadena).- Convierte a mayscula la primera letra de la cadena y a minscula el resto. Si en la
cadena existen palabras separadas por blancos, tambin el primer carcter es convertido a mayscula.
LOWER(cadena) y UPPER(cadena).- Devuelven la cadena en minscula (Lower) y mayscula (Upper)
respectivamente.
LTRIN(cadena1, [cadena2]) y RTRIN(cadena1, [cadena2]).- Devuelve la cadena1, quitando los
caracteres por la izquierda y derecha respectivamente especificados en cadena2. Si no se especifica
cadena2, el valor tomado es el espacio en blanco.
REPLACE(cadena, cadena_a_buscar, [nuevo_valor]).- Esta funcin reemplaza en cadena la
cadena_a_buscar por el valor dado en nuevo_valor. Si nuevo_valor se omite, en cadena se reemplazan
todos los valores existentes que coincidan con nuevo_valor, por blancos.
RPAD(cadena1,x, [cadena2]).- Devuelve la cadena1, rellena por la derecha con los valores de la
cadena2, hasta completar el nmero de caracteres especificados en x. Si el nmero de caracteres de
cadena1 y cadena2 es menor a x, se repetir la cadena2.
SUBSTR(cadena,a[,b]).- Devuelve una subcadena de la cadena dada, de b caracteres de longitud desde
la posicin a.
- 106 -
Ejemplo:
- 107 -
INSTR(cadena1, cadena2 [,a [,b] ] ).- Devuelve la posicin dentro de la cadena1 dnde est contenida
la cadena2. Por defecto se explora desde la izquierda empezando en la posicin a, si dicho valor es
negativo, se comienza desde la derecha. En b se especifica el nmero de la repeticin dentro de
cadena1. Si devuelve un cero es que cadena2 no existe en cadena1.
Ejemplo:
LENGTH(cadena).- Devuelve la longitud de una cadena, incluido los espacios en blanco existentes en
cualquier parte de la cadena.
- 108 -
Ejemplo:
Select CONVERT('', 'WE8MSWIN1252') Resultado from dual;
Resultado:
TO_CHAR(fechas [,formato [,NLS_DATE_LANGUAGE] ]).- Convierte la fecha a una cadena de
caracteres del tipo varchar2.
El parmetro formato se usa para controlar el resultado de salida.
NLS_DATE_LANGUAGE se usa para el idioma de salida de los componentes de la cadena devuelta (da
y mes) y las abreviaturas de fecha (AM, PM, aC, dC). Los idiomas soportados se especifican en el
parmetro de configuracin de Oracle denominado NLS_LANGUAGE que en nuestro caso es
AMERICAN. El valor se asigna de la siguiente forma: NLS_DATE_LANGUAGE=idioma.
- 109 -
- 110 -
Da de la semana (1-7).
DD
DDD
Da del ao (1-366).
DY
DAY
Nombre del da, rellenado con espacios en blanco hasta nueve caracteres.
IW
IYYY,IYY,IY,I
Y,YYYY
YEAR
Ao en letras.
HH,HH12,HH24
MI
Minutos. (0-59)
MM
MON
MONTH
Nombre del mes, rellenado con espacios en blanco hasta nueve caracteres.
PM, P.M.
RM
SS
Segundos (0-59)
WW
Ejemplos:
Select TO_CHAR (to_date('22/12/03'),' "Semana" IW "del Ao 2003" ') Resultado from dual;
RESULTADO
Semana 52 del Ao 2003
- 111 -
FM
RM o rm
EEEE
.,
PR
Ejemplos:
- 112 -
Resultado: 01457
Resultado: XV
Resultado: 1E+06
Resultado: 1.000.000,00
Resultado: 1,000,000.78
Resultado: 10.000,78
Resultado: EUR10.000,78
Resultado: -10.000,78
- 113 -
- 114 -
Resultado: 435,5679
TRUNC(x, [,y]).- Devuelve el valor de x redondeado a y posiciones a partir del nmero decimal.
Ejermplo:
Select TRUNC(-123.556), TRUNC(-123.356,2) from dual;
Resultado:
TRUNC(-123.556) es -123
TRUNC(-123.356,2) es -123,35
SIGN(x).- Devuelve 1 si x es positivo, 0 si x es cero y 1 si x es negativo.
SQRT(x).- Devuelve la raz cuadrada de x.
- 115 -
Ejemplos:
Select LAST_DAY('08-01-03') from dual;
Resultado: 31/01/03
Select LAST_DAY('08-01-03') - TO_DATE('08-01-03') from dual;
Resultado: 23
Select LAST_DAY('08-01-03') - TO_DATE(sysdate) from dual;
Resultado: 23
MONTHS_BETWEEN(fecha1,fecha2).- Devuelve el nmero de meses existentes entre ambas fechas. Si
los das son los mismos entre ambas fechas, el resultado es un nmero entero, si son das distintos se
mostrar una parte decimal.
Ejemplos:
Select MONTHS_BETWEEN('01/01/03','01/01/02') from dual;
Resultado: 12
Select MONTHS_BETWEEN('02/01/03','01/01/02') from dual;
Resultado: 12,0322581
Select MONTHS_BETWEEN('31/01/03','01/01/02') from dual;
Resultado: 12,9677419
NEW_TIME(fecha,franja_horaria_1,
franja_horaria_2).-
Devuelve
la
fecha
hora
de
la
- 116 -
Franjas Horarias:
AST (Atlantic Standard Time) ( 4 horas menos a la GMT) (Horario Estndar del Atlntico)
ADT (Atlantic Daylight Time) ( 3 horas menos a la GMT) (Horario de Verano del Atlntico)
BST (Bering Standart Time)
BDT (Bering Daylight Time)
CST (Central Standart Time) (Horario Estndar de la zona Central)
CDT (Central Daylight Time)
EST (Eastern Standart Time) (Horario Estndar de la costa Este)
EDT (Eastern Daylight Time)
GMT (Greenwich Mean Time) (Horario del meridiano de Greenwich)
HST (Alaska-Hawaii Standart Time)
HDT (Alaska-Hawaii Daylight Time)
MST (Mountain Standart Time) (Horario Estndar de las Rocosas)
MDT (Mountain Daylight Time) (Horario de Verano de las Rocosas)
NST (Newfoundland Standart Time) (Horario Estndar de Terranova)
PST (Pacific Standart Time)
PDT (Pacific Daylight Time)
YST (Yukon Standart Time)
YDT (Yukon Daylight Time)
Ejemplos:
Select to_char(NEW_TIME(TO_DATE('8/01/02 22:00:00','DD/MM/YY HH24:MI:SS'),'GMT','AST')
,'DD/MM/YY HH24:MI:SS') from dual;
Resultado:
08/01/02 18:00:00
Podemos consultar la Pgina Web:
http://www.barceloviajes.com/franjah/horamundial.asp
NEXT_DAY(fecha,da_de_la_semana).- Devuelve la fecha del da especificado en da_de_la_semana
posterior a la fecha indicada en fecha.
- 117 -
Ejemplo:
Select NEXT_DAY('8/01/03','Martes') from dual;
Resultado: 14/01/03
6.7.5. Funciones de grupo
Estas funciones devuelven un slo resultado aplicndose sobre un conjunto de filas de datos. Son usadas
conjuntamente con la clusula GROUP BY.
Las clusulas DISTINCT y ALL pueden usarse con algunas de estas funciones de grupo.
Al usar DISTINTC la funcin slo toma aquellos valores de la consulta que sean distintos entre s.
Al usar ALL la funcin toma todos los valores devueltos por la consulta, esta es la clusula por defecto.
Partiendo de la tabla EMP del usuario SCOTT, es decir:
tendramos:
Ejemplo:
Resultado:
DEPTNO
10
20
30
Resultado:
DEPTNO
10
20
30
AVG( [ DISTINCT || ALL] columna ).- Devuelve la media de los valores de las columnas agrupadas.
Ejemplo:
Resultado: 2073,21429
Resultado:
Media
DEPTNO
2916,66667
10
2175
20
1566,66667
30
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
Resultado: 14
Resultado: 5
Resultado: 1
MAX(columna ).- Devuelve el valor mximo de la columna consultada.
Resultado: 5000
Resultado:
MAX(SAL) DEPTNO
5000
10
3000
20
2850
30
Resultado: 800
Resultado:
MIN(SAL) DEPTNO
1300
10
800
20
950
30
Resultado: 29025
Resultado:
SUM(SAL)
DEPTNO
8750
10
10875
20
9400
30
- 120 -
RECUERDE
Oracle nos proporciona una serie de funciones predefinidas para el manejos de los datos.
- 121 -
Tema 7
CONSULTAS
- 123 -
- 125 -
- 126 -
Con esta select obtendramos los nombres de los empleados, sus puestos de trabajo y el nombre del
departamento al que pertenece.
Uniones Externas.- Combina filas de tablas relacionadas entre s por una o ms columnas comunes. La
diferencia con las uniones internas, es que este tipo de uniones puede devolver filas de una tabla que no
existan en otra.
- 127 -
Para ello, usamos la simbologa(+), en la parte de la condicin de la clusula where de la tabla de la cual
esperamos no obtener filas.
Por ejemplo si tuvisemos dos tablas CLIENTES y PEDIDOS y quisiramos obtener todos los datos de
TODOS los clientes hayan o no realizado pedidos, el operador (+) debe ir asociado a la tabla PEDIDOS.
Haciendo uso del usuario Scott/tiger, vamos a insertar un Departamento nuevo en la tabla DEPT:
insert into dept values(99,'INFORMATICA','SEVILLA');
Si ejecutamos la consulta de la unin interna pero especificando la simbologa (+) en la columna asociada
a la tabla EMP obtendremos todos los departamentos existente tengan o no empleados.
Es decir:
select e.DEPTNO,e.ename,e.job,d.dname,d. DEPTNO
from emp e, dept d
where e. DEPTNO (+)=d. DEPTNO;
- 128 -
- 129 -
Estas UNIONES EXTERNAS son conocidas tambin como JOIN que pueden ser JOIN por la derecha
(RIGHT JOIN) o JOIN por la izquierda (LEFT JOIN), dependiendo de lo que se desee obtener.
El equivalente a:
select e.DEPTNO,e.ename,e.job,d.dname,d. DEPTNO
from emp e, dept d
where e. DEPTNO (+)=d. DEPTNO;
Sera:
select emp.DEPTNO,emp.ename,emp.job,dept.dname,dept.deptno
from dept LEFT JOIN emp ON
emp.deptno=dept.deptno;
Es decir, JOIN LEFT por la izquierda y a la izquierda tenemos la tabla DEPT (departamento), nos
seleccionar todos los departamentos tengan o no empleados.
- 130 -
Este mismo resultado lo podemos obtener con RIGHT JOIN, pero cambiando las tablas, es decir,
empleado (emp) a la izquierda y departamento (dept) a la derecha.
select
emp.DEPTNO,emp.ename,emp.job,
dept.dname,dept.deptno
from emp RIGHT JOIN dept ON
emp.deptno=dept.deptno;
- 131 -
7.4. SUBCONSULTAS
Una subconsulta es una sentencia SELECT dentro de otra sentencia SELECT (consulta principal).
La sentencia Select se puede encontrar como:
Adems, siempre deben ir entre parntesis y nunca deben contener la clusula ORDER BY, ni pueden
ser UNION de varias sentencias select.
150
La papelera s.a.
160
200
210
VENTAS
1
2.500
100
5.000
150
9.500
160
2.350
200
3.750
210
- 132 -
Si queremos obtener los clientes cuyas ventas superan la media de ventas de la empresa, sera:
Select Descrip_Cliente,total_ventas from clientes,ventas
where ID_CLIENTE=CLI_ID_CLIENTE
and TOTAL_VENTAS > ( select avg(TOTAL_VENTAS) from VENTAS);
Resultado:
La papelera s.a.
5000
9500
3750
Otro ejemplo aplicado a la tabla EMP del usuario Scott/tiger podra ser: Obtener los nombres y salarios
de los empleados cuyo sueldo sea superior a la media de sueldos de la empresa?
- 133 -
- 134 -
150
La papelera s.a.
160
200
210
VENTAS
1
2.500
2/1/03
100
5.000
10/1/03
150
9.500
5/01/03
160
2.350
12/01/03 200
3.750
15/01/03 210
1.250
18/01/03 150
3.500
4/01/03
160
7.500
4/01/03
210
2.900
10/12/02 100
10
7.000
11/01/03 210
Si deseamos obtener la ltima fecha de venta de cada uno de nuestros clientes sera:
Select
Id_cliente,Descrip_Cliente,
(select
MAX(FECHA_VENTA)
cli_id_cliente=id_cliente)
From clientes.
- 135 -
from
VENTAS
where
Este mismo resultado se podra obtener mediante el uso de GROUP BY y ORDER BY.
Select Id_cliente,Descrip_Cliente, MAX(FECHA_VENTA)
From clientes,VENTAS
WHERE id_cliente =cli_id_cliente
GROUP BY Id_cliente,Descrip_Cliente
ORDER BY 1;
- 136 -
Basndonos en los datos de las tablas CLIENTES y VENTAS, para obtener el cliente que ms compras
ha realizado, sera la siguiente sentencia SQL:
select sum(TOTAL_VENTAS),ID_CLIENTE,DESCRIP_CLIENTE
from clientes c, ventas v
where c.id_cliente=v.cli_id_cliente
group by ID_CLIENTE,DESCRIP_CLIENTE
having sum(TOTAL_VENTAS) = (SELECT max(SUM(TOTAL_VENTAS)) FROM VENTAS GROUP BY
CLI_ID_CLIENTE);
- 137 -
MENU
ID_MENU
DESCRIPCION
ID_PADRE
ARCHIVO
Salir
NAVEGADOR
Refrescar
Buscar
Si deseamos saber cuantos submens o hijos poseen los nodos o men principales, debemos hacer una
consulta como:
select m1.id_menu,m1.descripcion,count(*)
from menu m1, menu m2
where m1.id_menu=m2.id_padre
group by m1.id_menu,m1.descripcion;
El resultado sera:
- 138 -
- 139 -
RECUERDE
La clusula HAVING es como una clusula WHERE, pero se aplica a las columnas de
agrupacin.
- 140 -
Tema 8
PL/SQL
- 141 -
Declaraciones de variables.
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;
- 143 -
8.2.1. Bloques
Todo programa PL/SQL se divide en bloques o secciones. La estructura de un bloque es:
DECLARE
/* Bloque declarativo.- Es dnde declaramos las variables internas, cursores,
procedimientos y funciones locales del bloque. */
BEGIN
/* Bloque principal o ejecutable.- Dnde desarrollamos la ejecucin del programa. */
EXCEPTION
/* Bloque exception o errores.- En l tratamos las excepciones de ERROR*/
END; - - El punto y coma es obligatorio.
La nica parte que es obligatoria dentro de un bloque es la seccin o bloque ejecutable. Por lo que
podemos desarrollar bloques sin secciones declarativas y sin secciones de error, bien porque no se
requieran o no las necesitemos.
Ejemplo 1:
BEGN
-- Bloque ejecutable
END;
- 144 -
Ejemplo 2:
DECLARE
-- Bloque declarativo
BEGN
-- Bloque ejecutable
END;
Los bloques pueden estar situados de forma secuencial o anidados.
- 145 -
BINARY_INTEGER
NUMBER
PLS_INTEGER
CHAR
VARCHAR2
DATE
BOOLEAN
TRUE, FALSE
ROWID
UROWID
CLOB
BLOB
BFILE
- 146 -
- 147 -
- 148 -
Descripcion VARCHAR2(30)
);
vi_registro reg_cliente;
BEGIN
select id_cliente,descrip_cliente INTO vi_registro from clientes where id_cliente=200;
dbms_output.put_line(vi_registro.id_cliente);
dbms_output.put_line(vi_registro.descripcion);
END;
- 149 -
TABLE
Podemos decir que este tipo de dato es un Array, Vector, Tabla o Matriz especial ya que como
diferencia su ndice no tiene porque empezar en 0 1, pudiendo tomar valores desde los nmeros
2.147.483.647 a 2.147.483.647, es decir, BINARY_INTEGER.
Al igual que los RECORD, para poder hacer uso de Matrices, debemos definir primero un tipo de dato
propio y despus una variable de ese tipo.
Para declarar el TIPO sera:
TYPE nombre_tabla IS TABLE OF tipo_dato INDEX BY BINARY_INTEGER;
Despus necesitaremos una Variable de ese tipo:
vi_matriz nombre_tabla;
El tipo_dato es un tipo de dato bsico. Podemos especificar tambin como tipo de dato el tipo de un
campo de una tabla.
Ejemplos:
DECLARE
-- Tipos
TYPE matriz_fecha IS TABLE OF date INDEX BY BINARY_INTEGER;
TYPE matriz_cliente IS TABLE OF clientes.id_cliente%TYPE INDEX BY BINARY_INTEGER;
-- Variables
vi_matriz_fecha matriz_fecha;
vi_matriz_cliente matriz_cliente;
Para tomar un valor de la matriz o asignrselo a la matriz es:
nombre_variable_tipo_matriz (indice);
Para el ejemplo sera:
vi_matriz_fecha(1):=sysdate;
- 150 -
Oracle nos permite hacer uso de una serie de ATRIBUTOS de una matriz mediante el nombre de la
variable matriz y el nombre del atributo, es decir: vi_matriz_cliente.COUNT
Estos atributos son los siguientes:
COUNT
DELETE
EXISTS
FIRST
LAST
NEXT
PRIOR
- 151 -
VARRAY
Este tipo de dato es equivalente a las matrices, vectores o arrays de otros lenguajes de programacin,
dnde el ndice comienza en 1 y se especifica en su declaracin el ndice lmite.
Su sintaxis es:
TYPE nombre_del_array IS VARRAY(tamao_maximo)} OF tipo_dato [NOT NULL]
NOTA: tipo_dato no puede ser: BOOLEAN, NCHAR, NCLOB, NVARCHAR2, REF CURSOR, TABLE ni
por supuesto otro tipo VARRAY.
Ejemplos:
DECLARE
TYPE array_fecha IS VARRAY(20) OF date;
TYPE array_registro IS VARRAY(10) OF cliente%ROWTYPE;
Una vez especificado el tipo, necesitamos la variable:
vi_array array_registro;
Al tipo de datos VARRAY, podemos aplicarle los mismos atributos que existen para el tipo e dato TABLE.
- 152 -
Ejemplo de VARRAY:
REF CURSOR
Este tipo de dato nos permite definir variables de tipo cursor. Sern tratadas en el tema correspondiente a
los cursores.
El AMBITO de una variable est sujeto al mdulo DECLARE existente por encima de un bloque de
cdigo BEGIN-END. Por ejemplo:
DECLARE
Variable1 NUMBER(10);
BEGIN
DECLARE
Variable2 VARCHAR2(50);
BEGIN
/* AMBITO de Variable2 */
END;
END;
- 153 -
[ELSE
sentencias;]
END IF;
Ejemplo:
Partiendo de los datos de la tabla
VENTAS existentes en la imagen
grfica, deseamos saber si la suma
de las ventas del cliente cuyo
id_cliente es 100, superan los 5.000
Euros. Como resultado debemos
mostrar el mensaje Total de
compras superior a 5.000 Euros o
Total de compras inferior a 5.000
Euros
- 154 -
El resultado sera:
Bucles
Un bucle permite ejecutar una sentencia o conjunto de sentencias, un nmero determinado de veces.
Bucles LOOP
Su sintaxis es:
LOOP
Sentencias;
EXIT WHEN condicin;
END LOOP;
Este bucle finalizar cuando la condicin sea verdadera. La instruccin EXIT WHEN condicin; es
equivalente a usar
IF condicion THEN
EXIT;
END IF;
- 155 -
Bucles WHILE
Su sintaxis es:
WHILE condicion LOOP
Sentencias;
END LOOP;
Este bucle finalizar cuando la condicin sea falsa.
Bucles FOR
Su sintaxis:
FOR variable_contador IN [REVERSE] valor_inferior..valor_superior LOOP
Sentencias;
END LOOP;
variable_contador es el valor de INICIAL para recorrer el rango de valores comprendido entre
valor_inferior y valor_superior.
Ejemplo:
Supongamos que tenemos una tabla llamada PARES que queremos rellenar con todos los nmeros
pares desde el 2 al 10000.
DECLARE
vi_valor NUMBER(5) := 0;
BEGIN
FOR vi_contador IN 1..5 LOOP
vi_valor := vi_valor + 2;
insert into PARES values(vi_valor);
END LOOP;
END;
- 156 -
DUP_VAL_ON_INDEX
ORA-1001
INVALID_CURSOR
ORA-1012
NOT_LOGGED_ON
ORA-1017
LOGIN_DENIED
ORA-1403
NO_DATA_FOUND
ORA-1422
TOO_MANY_ROOMS
ORA-1476
ZERO_DIVIDE
ORA-1722
INVALID_NUMBER
ORA-6500
STORAGE_ERROR
ORA-6501
PROGRAM_ERROR
ORA-6502
VALUE_ERROR
ORA-6511
CURSOR_ALREADY_OPEN
.......;
........;
IF condicion THEN
RAISE Nombre_exception_propia;
END IF;
- 158 -
EXCEPTION
WHEN Nombre_exception_propia THEN
Sentencias;
WHEN Nombre_exception_predefinida THEN
Sentencias;
WHEN Nombre_exception_predefinidaA OR Nombre_exception_predefinidaB WHEN
Sentencias;
WHEN others THEN
Sentencias;
END;
IMPORTANTE.- La EXCEPCION ocurre cuando falla la sentencia a realizar.
Ejemplo: En este ejemplo se incumple la PRIMERY KEY de la tabla VENTAS, ya que existe el id_ventas
10. La exception se ejecuta al intentar realizar el INSERT, nunca llega a la lnea RAISE vi_error
Oracle nos proporciona dos funciones PREDEFINIDAS llamadas SQLCODE y SQLERRM las cuales nos
proporcionan el nmero del error (number) producido y el mensaje de error (longitud mxima 512
caracteres). Estas funciones predefinidas son muy tiles para la EXCEPTION others.
Si lo aplicamos al ejemplo anterior tendramos:
- 159 -
- 160 -
Si se usa un solo mdulo de EXCEPTION, podemos encontrarnos con problemas de localizacin del
error. Por ejemplo:
DECLARE
vi_id NUMBER := null;
BEGIN
select id_cliente INTO vi_id from clientes where id_cliente=100;
select id_cliente INTO vi_id from clientes where id_cliente=555;
select id_cliente INTO vi_id from clientes where id_cliente=200;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('N Error: ' || SQLCODE || ' Mensaje: ' || SQLERRM);
END;
No sabemos qu SELECT ha producido el error. Por este motivo, para localizarlo, podemos dividir los
select en sub-bloques.
- 161 -
RECUERDE
Usamos PL/SQL para realizar programas que nos permitan obtener y manipular la informacin
almacenada en una B.D.
Los tratamientos de errores pueden ser personalizados por el usuario o usar los predefinidos
por Oracle.
- 162 -
Tema 9
FUNCIONES,
PROCEDIMIENTOS,
PAQUETES Y
DISPARADORES
- 163 -
9.1. INTRODUCIN
Los programas PL/SQL vistos anteriormente son bloques annimos, es decir, no quedan almacenados
como un objeto dentro de la B.D. para poder ser usados posteriormente. Para conseguir que un programa
PL/SQL quede almacenado en Oracle, debemos englobarlo en funciones o procedimientos.
Estos objetos son localizables dentro de la B.D. como cualquier otro objeto: Tablas, Indices, Usuarios,
Tablespaces, etc.
Estos objetos son localizables en el esquema y dentro de ste en la carpeta Tipos de Origen.
La principal ventaja de englobar los programas PL/SQL dentro de procedimientos o funciones, es que a
parte de almacenarse en la B.D, stos quedan compilados a la espera de ser llamados para su ejecucin
sin necesidad de que Oracle pierda tiempo en volver a compilar.
- 165 -
9.2. PROCEDIMIENTOS
Para crear un procedimiento podemos hacerlo desde la herramienta grfica Consola de Oracle
Enterprise Manager:
- 166 -
BEGIN
<< Cuerpo del Procedimiento >>
EXCEPTION
<< Tratamiento de la excepciones >>
END [nombre_procedimiento];
Consideraciones:
1.- Si no se usa la clusula OR REPLACE y existe un procedimiento con ese nombre, Oracle no nos
dejar crearlo.
2.- El procedimiento puede tener o no argumentos, es decir, valores que posteriormente sern
usados dentro del propio cdigo PL/SQL.
3.- Si no especificamos la modalidad IN || OUT || IN OUT en el argumento, este se considerar de
tipo IN (entrada).
4.- Diremos que:
IN = Slo LECTURA
4.- Un procedimiento es una orden DDL, por lo que lleva de forma implcita un COMMIT.
5.- Un procedimiento puede ser llamado desde un mdulo PL/SQL annimo o desde otro
procedimiento, usando tan solo el nombre del procedimiento.
6.- En la declaracin del procedimiento es INCORRECTO restringir el argumento con el tipo.
Es decir:
CREATE PROCEDURE calcular ( valor1 NUMBER(3,2), nombre VARCHAR2(30) ) AS
nos dara un ERROR.
Debemos hacerlo:
CREATE PROCEDURE calcular ( valor1 NUMBER, nombre VARCHAR2 ) AS
Por lo que las restricciones de los parmetros o argumentos existentes en la cabecera de un
procedimiento, vendrn determinadas por los parmetros de la aplicacin que llama al procedimiento,
conocidos con el nombre de parmetros reales.
- 167 -
Ejemplo:
Declare
Variable_1 NUMBER (5,2);
Variable_2 VARCHAR2(10);
/* Variable_1 y Variable_1 son parmetros reales */
Calcular(Variable_1, Variable_2);
7.- Una forma de restringir en la cabecera del procedimiento es haciendo uso de la orden %TYPE.
CREATE PROCEDURE calcular ( valor1 tabla.salario%TYPE, nombre VARCHAR2 ) AS
8.- Un parmetro puede ser inicializado en la cabecera del procedimiento siguiendo la siguiente
sintaxis:
nombre_parmetro [ IN || IN OUT ] tipo { := | DEFAULT } valor_de_inicilaizacion
Ejemplo:
Partiendo de la tabla CLIENTES cuya estructura es:
ID_CLIENTE
DESCRIP_CLIENTE
- 168 -
Para ver ejecutar el procedimiento anteriormente creado slo tendremos que hacer:
- 169 -
9.3. FUNCIONES
Son muy parecidas a los procedimientos, reciben argumentos, tienen apartados de declaracin, de
ejecucin y control de excepciones.
LA DIFERENCIA es que la funcin siempre devuelve un valor TEORICAMENTE y ste es devuelto en el
nombre de la propia funcin. Una funcin puede devolver ms de un valor si usamos los parmetros o
argumentos OUT, aunque se recomienda por tica que si devuelve ms de un valor se use el
procedimiento.
Su sintaxis es:
CREATE [OR REPLACE] FUNCTION nombre_funcion
- 170 -
BEGIN
Select count(*) into vi_num_clientes from clientes;
RETURN vi_num_clientes;
END numero_clientes;
- 171 -
Para hacer uso de la funcin creada, slo con llamarla en un cdigo PL/SQL nos valdra.
user_objects
user_source
user_errors
user_objects.- Nos
muestra informacin de los objetos que tiene un usuario. Las columnas que
VARCHAR2(128)
SUBOBJECT_NAME
VARCHAR2(30)
OBJECT_ID
NUMBER
- 172 -
DATA_OBJECT_ID
NUMBER
OBJECT_TYPE
VARCHAR2(18)
CREATED
DATE
LAST_DDL_TIME
DATE
TIMESTAMP
VARCHAR2(19)
STATUSVAR
CHAR2(7)
TEMPORARY
VARCHAR2(1)
GENERATED
VARCHAR2(1)
SECONDARY
VARCHAR2(1)
Podemos obtener informacin cmo: Nombre del Objeto, Fecha de Creacin, Fecha de ltima
modificacin, estado actual, etc.
user_source.- Contiene el cdigo fuente del procedimiento o de la funcin. Es decir, dicha vista est
constituida por las columnas:
NAME
VARCHAR2(30)
TYPE
VARCHAR2(12)
LINE
NUMBER
TEXT
VARCHAR2(4000)
Ejemplo:
- 173 -
TYPE
VARCHAR2(12)
SEQUENCE
LINE
POSITION
TEXT
9.5. PAQUETES
Un paquete es una estructura PL/SQL que nos permite almacenar sentencias SQL y programas PL/SQL.
En un paquete se diferencian dos partes:
Cabecera del Paquete.
Cuerpo del paquete.
- 174 -
[ Cabecera de PROCEDIMIENTO..]
[ Cabecera de FUNCION..]
[ Declaraciones de variable..]
[ Definicin de tipo..]
[ Declaracin de Excepcin..]
[ Declaracin_de_cursor;..]
END [nombre_paquete];
Cuerpo del paquete
Contiene el cdigo de los elementos que forman el paquete, es decir, el cdigo de la funcin,
procedimiento, etc.
Los elementos del cuerpo de un paquete NUNCA podrn ser compilados si no existe la declaracin de los
mismos en la cabecera del paquete.
Su sintaxis es:
CREATE [OR REPLACE] PACKAGE BODY nombre_paquete
{ IS || AS}
[BEGIN] => NO SE PONE en el BODY.
<<Cdigo PL/SQL de los elementos del paquete>>
END [nombre_paquete];
- 175 -
Tanto la cabecera como el cuerpo son almacenados por Oracle en el Diccionario de Datos como objetos
diferentes.
IMPORTANTE
Todo elemento del paquete (Procedimiento, funcin,...) puede ser referenciado como se muestra a
continuacin:
Nombre_paquete.elemto_del_paquete
9.6. DISPARADORES
Los disparadores mas comnmente conocidos como TRIGGER son similares a los procedimientos y a las
funciones, salvo que no pueden ser llamados desde otro bloque PL/SQL ni admiten argumentos.
Cuando sobre una tabla se lleva a cabo una operacin DML del tipo INSERT, UPDATE o DELETE es
cuando podemos hacer que se ejecute el disparador.
Su sintaxis es:
CREATE [OR REPLACE] TRIGGER nombre_trigger
{ BEFORE || AFTER } suceso_disparo ON referencia_tabla
- 176 -
U , B, O
D , B, O
I , B, F
U , B, F
D , B, F
I , A, O
U , A, O
D , A, O
I , A, F
U , A, F
D , A, F
El disparador o trigger se ejecuta al ejecutarse una orden DLL, siendo el proceso a seguir el siguiente:
1.- Si existe, ejecutar el disparador de tipo BEFORE (antes) con NIVEL DE ORDEN.
2.- Para cada fila implicada en la orden:
2.1.- Si existe, ejecutar por cada fila el disparador BEFORE.
2.2.- Si existe, ejecutar por cada fila el disparador AFTER.
3.- Si existe, ejecutar el disparador de tipo AFTER (despus) con NIVEL DE ORDEN.
Los pseudo-registros: OLD y: NEW
Sabemos que los disparadores por fila se ejecutan una vez por cada fila afectada de la orden DML que
hace saltar al disparador. Los pseudo-registros :old y :new nos permiten tener acceso a los datos de la
fila afectada.
Estos pseudo-registros son del tipo tabla_asociada_al_disparador %ROWTYPE, es decir
TIPO_REGISTRO. No podemos manejar todo el registro o fila, slo podemos hacer uso individual de las
columnas que componen la fila o registro.
En la siguiente tabla detallamos qu valores pueden tomarse de las pseudo-columna segn la orden DML
que se est ejecutando:
:old
INSERT
UPDATE
DELETE
NULL
NULL
- 177 -
Oracle nos permite programar un trigger o disparador hacia una tabla sobre la cual se vaya a realizar ms
de una operacin DML (insert, update y delete). Para distinguir qu accin se ha realizado, podemos
hacer uso de INSERTING, UPDATING y DELETING en el cuerpo_del_disparador, es decir:
IF INSERTING THEN
Sentencia;
ELSIF UPDATING THEN
Sentencia;
ELSIF DELETING THEN
Sentencia;
END IF;
Para eliminar un trigger: DROP TRIGGER nombre_trigger.
En diferencia con los procedimientos y funciones, los trigger pueden ser desactivados sin necesidad de
ser borrados.
ALTER TRIGGER nombre_trigger [ DISABLE | ENABLE ]
Tambin podemos desactivar TODOS los trigger de una TABLA mediante:
ALTER TABLE nombre_tabla
La vista del diccionario de datos que nos proporciona informacin sobre los trigger se llama
user_triggers.
- 178 -
Si el INSERT hacia una tabla slo afecta a una fila, los trigger tanto del tipo BEFORE como AFTER no
darn el error de tabla mutante. Todo insert del tipo INSERT INTO Select ... producir trigger mutantes,
incluso si el resultado del Select es de una sola columna o registro.
TABLAS de RESTRICCIONES.- Son aquellas de las que Oracle necesita leer para verificar las
restricciones de integridad referencial. Por ello, ningn TRIGGER podr leer o modificar los campos o
columnas que sean clave primaria, nica o foreing para la tabla que se ha creado el disparador. Las
columnas o campos, pueden ser modificados sin ningn tipo de problema.
NOTA.- Estas restricciones se aplican a aquellos disparadores o trigger programados para actuar a
NIVEL DE FILAS. A los disparadores a nivel de orden, slo son aplicables cuando el disparador se activa
al ejecutarse una orden DELETE _CASCADE.
Estos errores se producen cuando el disparador se activa, NO CUANDO se crea.
Ejemplo TRIGGER MUTANTE:
Usando la tabla EMP y DEPT del usuario scott/tiger realizar un trigger que compruebe cada vez que se
realiza un INSERT o UPDATE sobre la tabla EMP que no existan ms de 6 empleados por departamento.
Estructura Tabla EMP:
EMPNO
ENAME
VARCHAR2(10)
JOB
VARCHAR2(9)
MGR
NUMBER(4)
HIREDATE
DATE
SAL
NUMBER(7,2)
COMM
NUMBER(7,2)
DEPTNO
NUMBER(2)
DNAME
VARCHAR2(14)
LOC
VARCHAR2(13)
Si ejecutamos la sentencia:
select count(*),deptno from emp group by deptno;
Tendremos:
- 179 -
- 180 -
Si intentamos actualizar el nmero del departamento para el empleado nmero 7369 al departamento 10,
Oracle nos informa de que la tabla est mutando.
- 181 -
RECUERDE
Debemos utilizar los procedimientos y funciones para hacer que un programa PL/SQL no sea
annimo.
Las caractersticas de los procedimientos, funciones y paquetes las podemos visualizar mediante
las vistas del diccionario de datos o mediante la herramienta grfica.
Los TRIGGER van asociados a una accin INSERT,UPDATE o DELETE de una tabla.
- 182 -
Tema 10
CURSORES
- 183 -
Cursores Explcitos
Cursores Implcitos
Cursores Explcitos
Se usan para manejar un conjunto de datos (filas) devueltos por una consulta a la B.D:
Los pasos para operar con ellos son:
1. Declaracin del cursor.- Se lleva a cabo en el apartado DECLARE de un programa PL/SQL,
adems de asignarle la orden SELECT que devuelve las filas a procesar.
Su sintaxis:
CURSOR nombre_cursor IS SELECT ........;
Slo hay que tener en cuenta que la orden Select no puede ser del tipo SELECT....INTO....;
Si la consulta llevase variables, stas deben ser declaradas antes que el cursor, es decir:
DECLARE
vi_fecha_nac DATE;
CURSOR c_clientes IS SELECT nombre,apellidos WHERE edad >= vi_fecha_nac;
BEGIN
END;
OTRA FORMA es:
DECLARE
CURSOR c_clientes(vi_fecha_nac DATE) IS SELECT nombre,apellidos
WHERE edad >= vi_fecha_nac;
BEGIN
END;
A esta modalidad se le denomina cursores parametrizados.
- 185 -
- 186 -
%NOTFOUND
Acta de forma inversa a %FOUND, es decir, devuelve TRUE si la instruccin FETCH NO ha ledo una
fila y FALSE si la ha ledo.
%ISOPEN
Nos informa si el cursor est abierto, devolviendo TRUE. Si no lo est, devuelve FALSE.
%ROWCOUNT
Nos informa del nmero de filas referenciadas por el cursor.
Estos atributos podemos aplicarlos tanto a los cursores explcitos como implcitos.
Ejemplo aplicado a CURSORES implcitos.
Se desea actualizar una fila de una tabla CLIENTES, si ste no existe, se insertar un nuevo registro.
Otra forma de programar este mdulo PL/SQL es haciendo uso de una EXCEPTION de errores.
- 187 -
Bucles WHILE
El ejemplo anterior pero usando WHILE ..... END LOOP.
DECLARE
vi_registro CLIENTES%ROWTYPE;
CURSOR c_cliente IS SELECT * FROM clientes;
BEGIN
OPEN c_cliente;
DBMS_OUTPUT.PUT_LINE( 'Datos de los Cliente');
FETCH c_cliente INTO vi_registro;
WHILE c_cliente %FOUND LOOP
DBMS_OUTPUT.PUT_LINE( vi_registro. descrip_cliente );
FETCH c_cliente INTO vi_registro;
END LOOP;
CLOSE c_cliente;
COMMIT;
END;
- 188 -
Bucles FOR
Este tipo de bucle ejecuta una orden OPEN, FETCH y CLOSE de forma implcita. El ejemplo anterior
quedara:
- 189 -
Oracle nos permite bloqueos exclusivos sobre las filas involucradas en la consulta asociada al cursor:
Para ello, escribiremos al final de la sentencia select:
CURSOR nombre_cursor IS SELECT.....FROM.......FOR UPDATE [OF referencia_columna] [NOWAIT ];
referencia_columna.- Columna o columnas de la tabla o tablas a las cuales se les hace referencia.
Si otra sesin tuviese las filas bloqueadas en exclusividad, entonces la sentencia SELECT....FOR
UPDATE....esperara hasta que se libere la exclusividad. Si se desea NO tener ese proceso en espera,
podemos usar la clusula NOWAIT, por lo que la sentencia OPEN del cursor no se llevara a cabo,
devolviendo Oracle un mensaje de error.
Adems de usar FOR UPDATE, en la sentencia UPDATE o DELETE debemos usar la clusula, WHERE
CURRENT OF nombre_cursor.
- 190 -
- 191 -
- 192 -
RECUERDE
Los cursores son referencias a filas de datos, requiriendo ser declarados, abiertos, ledos y
cerrado si son del tipo explcito.
Los atributos de cursores nos permiten obtener informacin de los cursores para su
procesamiento.
- 193 -
Tema 11
NDICES
- 195 -
11.1. DEFINICIN
Los ndices se aplican a columnas de una tabla, pudiendo estar constituidos por una o ms columnas de
la tabla. Su funcionalidad es localizar la informacin a buscar lo ms rpidamente posible y con el menor
nmero posible de E/S a disco, para conseguir de esta forma un mayor rendimiento. No siempre es
aconsejable crear ndices ya que stos deben ser gestionados por Oracle, por lo que implica tiempo de
gestin, lo cual hace que baje el rendimiento en lugar de aumentarlo. Los ndices slo pertenecen a una
tabla.
A continuacin, vamos a ver a groso modo la funcionalidad de los ndices.
Supongamos que tenemos una tabla compuesta de 26 columnas o campos cada uno de ellos del tipo
varchar2(30), es decir:
TABLA
Campo1
Campo2
Campo3
.......................
Campo26
Si se desea consultar el dato del Campo3, Oracle necesita extraer el resto de columnas desde la 1 hasta
la 26 y recorrer, por supuesto, toda la tabla. Suponiendo que se extraen 5 filas, tendramos un buffer de
lectura de:
Tamao de columna: 30
N de columnas recuperadas: 26
Filas extradas: 5
TOTAL BUFFER = 30 x 26 x 5 = 3900 caracteres.
Si en lugar de ser 5 filas fuesen 50.000 filas, tendramos 39.000.000 de caracteres, es decir, 39 Mbyte de
memoria cach.
Por tanto, debemos crear un ndice que haga referencia al Campo3, en el cual Oracle almacena
nicamente el contenido de dicho campo y la referencia a esos valores dentro de la tabla. Cada vez que
se produzca una variacin en ese campo, tambin se lleva a cabo en el objeto ndice creado.
Si ahora deseamos consultar la informacin del Campo3, Oracle recorre el ndice. Por lo tanto, para un
total de 5 filas, tendremos 30 x 1 x 5 = 150 caracteres. Visto de otra forma, para un Buffer de 3.900
caracteres, obtendramos una lectura de 130 filas extradas.
(Total Buffer / Tamao Columna * N de columnas recuperadas = Filas Extraidas )
- 197 -
- 198 -
- 199 -
Ya hemos comentado que Oracle crea automticamente ndice para los campos claves y nicos. Estos
ndices son asignados al tablespaces Default por lo que debemos especificarle el tablespaces Index,
bien en la instruccin SQL o mediante la herramienta grfica.
Es decir:
CREATE TABLE "USR_PRUEBA"."TABLA"
("C1" VARCHAR2(10) NOT NULL,
"C2" NUMBER(5) NOT NULL,
"C3" VARCHAR2(10) NOT NULL,
PRIMARY KEY("C1") USING INDEX TABLESPACE "tablespace_INDEX",
UNIQUE("C2") USING INDEX TABLESPACE "tablespace_INDEX");
Mediante la herramienta grfica, entramos en la pestaa Almacenamiento de Restricciones:
Las consultas de datos a travs de los campos o campo que formen la PRIMERY KEY son mucho ms
rpidas ya que son ndices nicos, por lo que el recorrido del objeto index no es total.
E.- No es aconsejable hacer ndices de columnas que puedan tomar valores nulos.
F.- Toda tabla que supere las 1.000 filas debe tener un ndice.
- 200 -
tendramos:
- 201 -
C3
Informtico
Abogado
Arquitecto
Abogado
Pedagogo
Informtico
Abogado
Arquitecto
Informtico
Arquitecto
Pedagogo
Abogado
Informtico
Pedagogo
Arquitecto
C3
Abogado
Abogado
Abogado
Abogado
Arquitecto
Arquitecto
Arquitecto
Arquitecto
Informtico
Informtico
Informtico
Informtico
Pedagogo
Pedagogo
Pedagogo
As pues, el objeto ndice almacenara en lugar del rownum el RowId y los valores de C3.
Si observamos el ejemplo, el campo C3 slo posee 4 valores distintos. Si se crea un ndice de mapa de
bit (Bitmap), en el cual cada mapa de bit almacena informacin de 12 filas de la tabla, obtendramos lo
siguiente:
- 202 -
ROWNUM
C3
2,4,7,12
Abogado
12
0101.0010.0001
3,8,10
Arquitecto
12
0010.0001.0100
15
Arquitecto
13
24
0010.0000.0000
1,6,9
Informtico
12
1000.0100.1000
16
Informtico
13
24
0001.0000.0000
5,11
Pedagogo
12
0000.1000.0010
14
Pedagogo
13
24
0100.0000.0000
Por tanto, es aconsejable utilizar columnas cuyos valores sean poco variables, ya que cuantos ms
valores diferentes existan, mayor ser el tamao del objeto ndice y mayor tiempo para poder ser
gestionado.
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.
- 204 -
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.
- 205 -
Desde la consola o interfaz grfica, una vez conectados, slo tendremos que ir al apartado Esquema y
seleccionar la carpeta Tabla o la carpeta ndices. Si lo hacemos a travs de la carpeta Tabla,
tendremos que posicionarnos en la carpeta ndice de la tabla correspondiente.
Haciendo clic derecho y seleccionando la opcin Crear, nos aparece la ventana de Creacin de ndice,
cuyo aspecto es el que se muestra a continuacin:
- 206 -
- 207 -
Las opciones nico, Bitmap, No Ordenado, Revertir, excluyentes entre si, nos permiten especificar la
modalidad o tipo de ndice.
Finalmente, algunos ejemplos de sentencia SQL que nos permiten crear ndices son los que se detallan a
continuacin:
TABLA: VEHICULO perteneciente al esquema USR_PRUEBA.
MATRICULA
MODELO
COLOR
CILINDRADA
FECHA_COMPRA
PRECIO_VENTA
Partimos de que existe un Tablespaces denominado "PRUEBA_INDEX" con QUOTA no limitada para el
usuario usr_prueba. (ALTER USER "USR_PRUEBA" QUOTA UNLIMITED ON "PRUEBA_INDEX").
- 208 -
- 209 -
RECUERDE
- Los ndices permiten un acceso ms rpido a los datos.
- Oracle genera ndices de forma automtica para las columnas consideradas claves primarias y
nicas.
- Los ndices deben ir a un tablespace distinto al default.
- 210 -
GLOSARIO
A
ADD DATAFILE. Clusula que nos sirve para aadir un fichero de datos a un tablespace.
AUTOEXTEND. Clusula que nos permite especificar el crecimiento automtico de los ficheros de datos
B
BASE DE DATOS. Conjunto de Objetos tratados por un sistema gestor de Base de Datos. Su funcionalidad es
almacenar la informacin.
BLOQUE LOGICO. Unidad lgica mnima de almacenamiento para los datos, directamente ligado al bloque fsico
del sistema operativo.
C
CAMPOS. Unidad Lgica mnima de almacenamiento de un registro de la B.D.
COALESCE. Clusula usada para realizar eliminar la desfragmentacin en los tablespaces.
CONTROLFILE. Ver FICHEROS DE CONTROL.
COLUMNAS. Ver CAMPO.
D
DATAFILE. Ver FICHEROS DE DATOS.
DBA. Administrador de la B.D.
DEALLOCATE UNUSED. Clusula que libera espacio de los segmentos de datos e ndices.
E
ESQUEMA. Ver SCHEMA.
EXTENSION. Conjunto de Bloques contiguos.
F
FICHEROS DE CONTROL. Contienen la informacin necesaria para arrancar la B.D. Como nombre, fecha de
creacin, ficheros asociados, etc.
FICHEROS DE DATOS. Ficheros fsicos que almacenan la informacin de los datos de la B.D.
FICHEROS DE REDO LOG. Nos permiten mantener consistente los datos de la B.D. en caso de fallo o error.
- 211 -
H
HAVING. Clusula de una consulta que se aplica a los campos sobre los cuales existe una funcin de
agrupamiento.
I
INITIAL. Tamao de la extensin inicial asignada en el momento de creacin del segmento.
INVALID. Estado en el que puede quedar cualquier objeto de la B.D.
J
JAR. Extensin de programas comprimidos en JAVA.
JOIN. Uniones entre consultas.
P
PCTFREE. Porcentaje de espacio en un bloque de dato, reservado para las modificaciones de los datos
almacenados en dicho bloque.
PCTINCREASE. Porcentaje de crecimiento de la siguientes extensin con respecto a la anterior asignada.
PCTUSED. Porcentaje que determina cuando un bloque de datos es candidato para recibir inserciones.
PL/SQL. Lenguaje de programacin utilizado para acceder a la informacin existente en una B.D. relacional
mediante sentencias SQL. (Procedural Language/Structured Query Language).
PRIVILEGIOS. Permisos concedidos a los usuarios para poder realizar tareas en la B.D.
Q
QUERY. Consulta a la D.B.
R
REDOLOG. Ver FICHEROS REDO LOG
ROL. Conjunto de privilegios concedidos a un usuario.
RUTA DE ACCESO. Ubicacin en disco duro dnde se instalarn los programas de instalacin de Oracle.
ROWID. Identificador nico por cada fila de una tabla de la B.D.
S
SCHEMA. Objeto de la B.D. dnde se recoge de forma lgica la estructura de un diseo relacional.
- 212 -
- 213 -