manual_oracle 9i de eticom
TRANSCRIPT
TEMA 1. INSTALACIÓN ORACLE 9i ________________________________ 1 TEMA 2. ARQUITECTURA DE ORACLE 9I __________________________ 13 TEMA 3. CREACIÓN DE TABLESPACES ___________________________ 33 TEMA 4. USUARIOS ___________________________________________ 43 TEMA 5. TABLAS _____________________________________________ 59 TEMA 6. OPERACIONES SOBRE TABLAS __________________________ 89 TEMA 7. CONSULTAS_________________________________________ 123 TEMA 8. PL/SQL _____________________________________________ 141 TEMA 9. FUNCIONES, PROCEDIMIENTOS, PAQUETES Y DISPARADORES ___ 163 TEMA 10. CURSORES ________________________________________ 183 TEMA 11. ÍNDICES ___________________________________________ 195 GLOSARIO____________________________________________________ 211
- 1 -
1.1. VENTANA DE “UBICACIÓN DE LOS ARCHIVOS” ___________________________ 3
1.2. VENTANA DE “PRODUCTOS DISPONIBLES” ______________________________ 4
1.3. VENTANA DE “TIPOS DE INSTALACIÓN” _________________________________ 5
1.4. VENTANA DE “CONFIGURACIÓN DE BASE DE DATOS” _____________________ 5
1.5. VENTANA DE “ORACLE SERVICES PARA MICROSOFT TRANSACTION SERVER”_ 6
1.6. VENTAN DE “IDENTIFICACIÓN DE BASES DE DATOS” _____________________ 6
1.7. VENTANA DE “UBICACIÓN DE ARCHIVOS DE B.D.”_________________________ 7
1.8. VENTANA DE “JUEGO DE CARACTERES DE LA B.D.” ______________________ 8
1.9. VENTANA “RESUMEN”________________________________________________ 8
Tema 1 INSTALACIÓN ORACLE 9i
- 3 -
1.1. VENTANA DE “UBICACIÓN DE LOS ARCHIVOS”
En dicha ventana se detalla la ruta de origen del software de instalación, que en este proceso de
instalación es: “C:\Instalacion 9i\stage\products.jar1”
Además se especifican dos datos muy importantes como los que se detallan seguidamente:
Nombre.- Directorio de instalación de los programas necesarios para el funcionamiento de la
propia aplicación Oracle (se aconseja no cambiar este directorio). Para la versión Oracle 9i es
“OraHome92”, para Oracle 8i es “OraHome8i”, etc.
Ruta de Acceso.- En esta opción se detalla la ruta de instalación. Se recomienda tener muy
claro dónde se ubicarán los programas y aplicaciones que necesitará Oracle para poder funcionar. En
nuestro caso: “C:\oracle\ora92”. Este directorio es conocido como ORACLE_HOME.
1 Ficheros con extensión JAR son paquetes de JAVA.
- 4 -
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 administración además de crearnos una Base
de Datos. Se recomienda para la primera vez que se instale Oracle 9i en un Servidor de B.D.2
2 B.D. (Base de Datos)
- 5 -
La segunda opción instala las herramientas necesarias para administrar, pero sin crear una B.D.
Finalmente, la tercera opción sólo instala los programas necesarios para poder acceder a una B.D. Oracle
desde un ordenador o puesto cliente.
1.3. VENTANA DE “TIPOS DE INSTALACIÓN”
En ella, al igual que otros productos o programas informáticos, se selecciona qué clase de instalación se
desea realizar, además de especificarnos el tamaño que se requiere de disco duro para las distintas
opciones. Diferenciamos entre:
• Enterprise Edición (2.86 GB)
• Edición Estándar (2.80 GB)
• Personal Edición (2.80 GB)
• Personalizado
Al igual que en otros paquetes informáticos, la instalación más completa es la Enterprise Edición.
1.4. VENTANA DE “CONFIGURACIÓN DE BASE DE DATOS”
Esta ventana nos permite especificar el tipo de base de datos que se desea crear.
- 6 -
Las B.D. del tipo “Procesamiento de Transacciones”, son aquellas que reciben un gran número 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 volúmenes de datos e información a procesar e interpretar, sin ningún
nivel de transacciones.
1.5. VENTANA DE “ORACLE SERVICES PARA MICROSOFT TRANSACTION SERVER”
En ella se especifica el número del puerto por el cuál Oracle escuchará las peticiones de transacciones
realizadas desde la aplicación Microsoft Transaction Server (MTS). En este caso el 2030, el cuál se
aconseja no cambiar salvo que este número de puerto se esté usando por otro programa o aplicación.
1.6. VENTANA DE “IDENTIFICACIÓN DE BASES DE DATOS”
Es una de las más importantes por no decir la más importante. En ella se especifica el nombre de la B.D.
que creará Oracle de forma genérica, además 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.
- 7 -
Por defecto le pondremos el nombre “GLOBAL” a la B.D. y a su vez el propio programa de instalación
asignará como SID el nombre de “GLOBAL”.
1.7. VENTANA DE “UBICACIÓN DE ARCHIVOS DE B.D.”
En ella se especifica la ruta física dónde Oracle creará los ficheros necesarios para el funcionamiento,
control y gestión de los “DATOS” de la B.D. que se va a crear durante el proceso de instalación.
- 8 -
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 instalación, es decir, distinto a la ruta
indicada en la ventana de “Ubicación 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 instalación basándose en el sistema operativo que posea el ordenador dónde se va a
instalar Oracle.
1.9. VENTANA “RESUMEN”
Muestra información de las opciones seleccionadas durante las distintas ventanas del proceso de
instalación.
Durante el proceso de instalación, se crea la B.D. mediante el “Asistente”. Una vez finalizada dicha
creación, Oracle nos solicita las password para los usuarios SYS y SYSTEM por motivos de seguridad.
En otras versiones 8i y posteriores, esta opción no existía, siendo las password:
- 9 -
SYS / change_on_install SYSTEM / manager
Dicha ventana, además de solicitarnos dichos cambios, nos muestra información de la B.D. creada, qué
fichero posee los parámetros de iniciación de dicha B.D. y dónde está ubicado físicamente.
El proceso de instalación se dará por finalizado cuando se presente la ventana siguiente:
- 10 -
Si observamos la estructura de carpetas que tendremos en el disco duro será la siguiente:
- 11 -
RECUERDE
- A la hora de instalar Oracle hay que tener muy claro dónde se instalará, es decir, el
ORACLE_HOME.
- También conviene determinar previamente el tipo de instalación y tipo de B.D. que se desea
crear en el proceso de instalación.
- Dos de los datos más importantes a considerar son el nombre de la Base de Datos y el SID.
- Una vez finalizada la creación de la B.D., Oracle nos solicitará las password para los usuarios
SYS y SYSTEM por motivos de seguridad.
- 13 -
2.1. ESTRUCTURA DE ALMACENAMIENTO LOGICA Y FÍSICA ________________ 15
2.2. RELACIÓN TABLESPACES Y DATAFILES_____________________________ 16
2.3. SEGMENTOS, EXTENSIONES Y BLOQUES DE DATOS___________________ 18
2.4. ESPACIO DE TABLAS SYSTEM (Tablespace SYSTEM)___________________ 21
2.5. DIFERENTES OPCIONES DE UN TABLESPACE ________________________ 23
2.5.1. Tablespaces Permanentes (PERMANENT), Temporales (TEMPORARY) Deshacer (UNDO)____________________________________________ 23
2.5.2. Tablespaces en línea (ONLINE) o fuera de línea (OFFLINE) ____________ 24
2.5.3. Espacios de Tablas (Tablespaces) administrador Localmente (Local) y por Diccionario (Dictionary). ____________________________________ 24
2.5.4. Tablespaces en modalidad de sólo lectura y lectura/escritura ____________ 25
2.6. FICHEROS DE DATOS (DATAFILES) _________________________________ 26
2.7. OTROS TABLESPACES ___________________________________________ 28
2.8. Ficheros de REDO LOG ___________________________________________ 29
2.9. FICHEROS DE CONTROL _________________________________________ 30
Tema 2 ARQUITECTURA DE ORACLE 9i
- 15 -
2.1. ESTRUCTURA DE ALMACENAMIENTO LOGICA Y FISICA
Oracle almacena su información en “estructuras de almacenamiento físicas” y “estructuras de
almacenamiento lógicas”.
La estructura de almacenamiento lógica, es una organización “conceptual” de los datos que está
compuesta por:
• Tablespaces
• Segmentos
• Extensiones
• Bloques de Datos
La estructura de almacenamiento física 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)
- 16 -
2.2. RELACIÓN TABLESPACES Y DATAFILES
Definimos el Tablespaces como el lugar lógico dónde Oracle agrupa a los ficheros de datos (DataFiles),
por tanto:
Espacio de Tabla
Tabla A Tabla B Tabla C .............
Fichero de Dato 1 Fichero de Dato 2
Un “Espacio de Tabla”, es una estructura lógica de los datos dentro de la B.D. de Oracle, asociada a uno o más “Ficheros de Datos” físicos de disco duro.
- 17 -
- 18 -
2.3. SEGMENTOS, EXTENSIONES Y BLOQUES DE DATOS
Un Tablespaces está compuesto por más de un segmento, definiendo un segmento como un espacio que
se asigna para un tipo específico de estructura de almacenamiento lógica, 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 más de una extensión.
El bloque de datos de Oracle, es la unidad mínima de almacenamiento que se corresponde con uno o
más bloques físicos del Sistema Operativo dónde se ha creado la B.D.
- 19 -
Reflejando lo explicado mediante un diagrama entidad-relación tendríamos:
Tablespaces
Seg. 1 Seg. 2
E1 E2 E3 E4
B1 B3 B7 B2 B4 B5 B6 B8
Uno o más bloque de S.O.
B.D.
TABLESPACES
SEGMENTO.
EXTENSIONES
BLOQUES
DataFiles
Bloques de S.O.
PARTE Lógica PARTE Física
- 20 -
Un “Mapa de Tablespaces” proporcionado por Oracle sería:
- 21 -
2.4. ESPACIO DE TABLAS SYSTEM (Tablespace SYSTEM)
Toda B.D. de Oracle tiene al menos un espacio de tabla llamado SYSTEM.
La ruta de los “Archivos de Datos (DataFiles)” (físicos) 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 genérica en
el proceso de instalación o
mediante la aplicación
“Database Configuration
Assistant”).
- 22 -
El tablespace SYSTEM almacena:
• El “Diccionario de Datos” de la B.D.
Diccionario de Datos.- Es un conjunto de Tablas y Vistas que almacenan información interna de
la B.D (NO almacena los datos).
Ejemplo.- La tabla DBA_TABLESPACES, que nos proporciona información de todos los
TABLESPACES existentes en nuestra B.D.
• Almacena el código fuente y compilado de los programas PL/SQL (procedimientos, funciones,
disparadores o trigger, paquetes).
• Las vistas, sinónimos, 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.
- 23 -
2.5. DIFERENTES OPCIONES DE UN TABLESPACE
2.5.1. Tablespaces Permanentes (PERMANENT), Temporales (TEMPORARY) y Deshacer (UNDO)
Permanent.- La mayoría de los tablespaces son permanentes, es decir, se crean para almacenar tablas,
índices, información de restauración de datos (RollBack).
Temporary.- Son espacios de tablas que se crean para operaciones SQL que conlleven ordenaciones,
uniones y generación 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 después queremos que sea TEMPORARY,
podemos modificarlo mediante la siguiente sentencia SQL:
ALTER TABLESPACE "nombre_tablespace_temporal" TEMPORARY;
IMPORTANTE.- El Tablespace no tiene funcionalidad hasta que no se le asocia a un usuario.
ALTER USER "nombre_usuario" TEMPORARY
TABLESPACE "nombre_tablespace_temporary"
- 24 -
2.5.2. Tablespaces en línea (ONLINE) o fuera de línea (OFFLINE)
OnLINE.- Permiten a los usuarios y aplicaciones hacer uso de los datos.
OffLINE.- No permite que sus datos estén disponibles para los usuarios y/o las aplicaciones, aunque la
BD esté arrancada o levantada.
Un tablespace se coloca OffLINE cuando existe algún problema con dicho tablespace y tenemos que
deshabilitar su uso. También emplearemos la opción OffLine ante la situación en la cuál tenemos un
tablespaces que contiene datos históricos que no se usan pero que no podemos eliminar.
2.5.3. Espacios de Tablas (Tablespaces) administrado Localmente (Local) y por Diccionario
(Dictionary)
Oracle utiliza dos modalidades para administrar la petición y asignación de espacio en un Tablespace.
Tablespaces gestionados localmente “Extensiones Gestionadas Localmente” (EXTENT MANAGEMENT
LOCAL) , esta es la opción POR DEFECTO, a partir de la versión 8i.
- 25 -
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 extensión 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 reorganización.
La otra modalidad es mediante administración DICTIONARY (Managed in the Dictionary), usada en
versiones anteriores. La información del espacio de tabla que se está usando, se almacena en una serie
de tablas existentes en el diccionario de datos.
2.5.4. Tablespaces en modalidad de sólo lectura y lectura/escritura
Por defecto, todo Tablespace cuando se crea, es de lectura/escritura. Dicha modalidad es cambiada a
sólo lectura cuándo sabemos que los datos existentes en los objetos que almacena ese tablespaces
serán manipulados a nivel de consultas.
- 26 -
2.6. FICHEROS DE DATOS (DATAFILES)
Un DATAFILE es un fichero físico de almacenamiento de un tablespace. Cómo mínimo un tablespace
está asociado a un DataFile, pudiendo ser esta asociación de más de un DataFile.
IMPORTANTE.- Se aconseja que un tablespace vaya asociado a más de un datafile y que éstos se
encuentren en distintos discos duros, para reducir el factor E/S.
NOTA.- Toda B.D. posee un límite de DataFiles que se pueden crear.
Si un TABLESPACE se llena, ORACLE produciría un error al no existir más capacidad de
almacenamiento para los objetos asignados a ese tablespace. Para solucionar esto podemos:
• Asignar un nuevo DATAFILE al TABLESPACE.
• Aumentar el tamaño del DATAFILE ya existente.
• Al crear el TABLESPACE, asignar un DATAFILE de crecimiento automático.
- 27 -
- 28 -
2.7. OTROS TABLESPACES
Tablespaces USERS.- Almacena la información y datos pertenecientes a los usuarios existentes en la
B.D.
Tablespaces TEMP.- En dicho tablespaces, Oracle almacena información temporal de su propio
funcionamiento (para tener una similitud, es como el “papel sucio” que usamos en nuestro trabajo).
Tablespaces UNDOTBS1.- Este tablespaces en versiones anteriores se llamaba ROLLBACK_DATA,
siendo su funcionalidad almacenar la información de deshacer, es decir, rehacer una transacción mal
realizada y la coherencia de lectura antes de ejecutar una instrucción 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 información correspondiente a los índices de las tablas. Es aconsejable y
recomendable crear un tablespaces independiente al de datos para asignar la gestión de los índices.
- 29 -
2.8. FICHEROS DE REDO LOG
Son ficheros físicos dónde Oracle registra todas las modificaciones o transacciones que se producen en
la B.D. Esta información se gestiona en memoria (por rendimiento), siendo los procesos internos de
Oracle los encargados de escribirlo posteriormente a los ficheros.
Se recomienda mínimo dos ficheros de REDO, por B.D. existente.
Funcionan de forma cíclica, 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 información del Redo01.log y se usa ese espacio liberado para almacenar la siguiente
información de transacciones.
IMPORTANTE.- Esto nos lleva a diferenciar entre B.D. en modo ARCHIVELOG y NOARCHIVELOG.
Si una B.D. esta en modo ARCHIVELOG, esto quiere decir que Oracle siempre realizará una copia del
fichero REDO LOG antes de borrar y volver a escribir. Es la forma de mantener segura la información
existente en la B.D. Este NO es el método predeterminado.
El modo NOARCHIVELOG (Por defecto), no realiza copia de los ficheros REDO LOG, recuperándose
sólo las últimas transacciones realizadas.
- 30 -
2.9. FICHEROS DE CONTROL
Almacenan información 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 recuperación.
Si al comprobar en éstos que el estado de la B.D. no es correcto, NUNCA arrancará.
- 31 -
RECUERDE
- Oracle organiza la información en estructuras de datos físicas y lógicas.
- Todo TABLESPACE tiene como mínimo un DATAFILE. Si existiesen más de un DATAFILE, se
recomienda a discos distintos.
- En la versión Oracle 9i los tablespaces son gestionados localmente, no por diccionario de datos.
- Oracle almacena toda la información de DESHACER en los ficheros REDO.
- En los ficheros de CONTROL Oracle almacena la información de todos los ficheros implicados
en el funcionamiento de la B.D.
- 33 -
3.1. DEFINICIÓN DE SQL. (STRUCTURED QUERY LANGUAGE) ____________ 35
3.2. CREACIÓN DE TABLESPACES __________________________________ 35
Tema 3 CREACIÓN DE TABLESPACES
- 35 -
3.1. DEFINICIÓN 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 dónde se almacenarán 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 más básico 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, política 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. CREACIÓN DE TABLESPACES Un tablespaces podemos crearlo mediante la ejecución directa de una sentencia DDL o mediante la
utilización de la herramienta gráfica de Oracle conocida como “Enterprise Manager Console”.
- 36 -
Crearemos un tablespaces llamado “PRUEBA” usando la herramienta gráfica. A partir de ella,
obtendremos la sentencia SQL, la cuál iremos comentando.
Paso 1.- Abrimos la aplicación “Enterprise Manager Console”.
Paso 2.- Una vez en ella, seleccionamos la B.D. sobre la cuál 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 opción
“CREAR”.
Paso 4.- En la ventana que nos aparece, escribimos el nombre “PRUEBA”. En dicha ventana, podemos
observar cómo Oracle de forma automática 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 tamaño del DataFile, 5 Mbyte.
- 37 -
Las opciones por defecto asignadas a los parámetros de almacenamiento son las siguientes:
- 38 -
Paso 5.- Una vez pulsado el botón 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 crearía el TABLESPACE “prueba” sería: 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 continuación, la cláusula LOGGING, que puede ser LOGGING o NOLOGGING, nos permite establecer
a nivel global sobre el Tablespaces la opción de generar información 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.
- 39 -
DATAFILE 'C:\ORACLE\ORADATA\GLOBAL\PRUEBA.ora' SIZE 5M .- Ubicación, nombre y tamaño del
DataFile.
EXTENT MANAGEMENT.- Esta cláusula hace referencia a la gestión 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 cómo se gestionarán las extensiones
del Tablespaces. Por defecto, los tamaños de segmentos son gestionados automáticamente 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 cláusula sólo es importante para espacios de tablas
temporales que estén gestionados localmente. Sirve para especificar si Oracle debe realizar el
seguimiento del espacio libre y del utilizado en los segmentos del espacio de tablas utilizando listas de
extensiones libres (MANUAL) o mapas de bits (AUTO).
Los DataFiles poseen un tamaño inicial: DATAFILE 'C:\ORACLE\ORADATA\GLOBAL\PRUEBA.ora' SIZE 5M. Dicho valor, por defecto no es ampliable automáticamente. Si se llena el DataFiles, debemos crear
otro Datafiles para que el Tablespaces siga operativo.
Para especificar que un DataFiles sea ampliable automáticamente, podemos hacerlo gráficamente
mediante la pestaña “Almacenamiento” correspondiente a las propiedades del Datafiles.
- 40 -
Una vez activada esa opción, 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).
Gráficamente sería:
La sentencia SQL sería: 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 Tamaño Máximo como limitado, la cláusula MAXSIZE tomaría el valor
UNLIMITED.
Importante: el valor mínimo del NEXT debe ser un Tamaño de Bloque, en este caso 8.192 Bytes.
( 8 KByte). Si se especificase un valor inferior, Oracle lo ajusta.
- 41 -
Para eliminar un tablespaces, es tan simple como hacer clic derecho sobre el nombre del Tablespace,
dentro de la aplicación “Enterprise Manager Console” y seleccionar la opción “Eliminar”. En versiones
anteriores, tras borrar un Tablespaces, el DataFile o Datafiles asociados no eran eliminados físicamente
del Sistema Operativo. Esta opción de Oracle nos lo permite.
Tanto el número de Tablespaces que puede poseer una B.D. es limitado al igual que el número de
DataFiles por Tablespaces.
- 42 -
RECUERDE
- SQL es un lenguaje que nos permite interactuar con una B.D.
- El primer paso a la hora de trabajar con una B.D. Oracle, es crear un TABLESPACE.
- Todo TABLESPACE lleva asociado como mínimo un DATAFILE.
- Al crear el TABLESPACE, se aconseja que este sea “gestionado localmente”.
- 43 -
4.1. DEFINICIÓN _________________________________________________ 45
4.2. ASIGNACIÓN DE PRIVILEGIOS __________________________________ 45
4.3. ASIGNACIÓN DE ROLES _______________________________________ 47
4.4. CREACIÓN DE USUARIOS______________________________________ 48
Tema 4 USUARIOS
- 45 -
4.1. DEFINICIÓN
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
dónde se almacena información correspondiente a la estructura de la B.D. Además de tener
acceso a la ejecución 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 información de las tablas del Diccionario de Datos.
Un aspecto que debemos tener presente es que a partir de la versión 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 instalación.
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. ASIGNACIÓN 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”.
- 46 -
Diferenciamos:
Privilegios de Sistema.- Permite al usuario realizar algún tipo de acción 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,
mostraría 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 gestión 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 acción específica sobre un objeto u
objetos de la B.D., como tablas, vistas, procedimientos, funciones, etc. Por ejemplo: En la
imagen gráfica 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.
- 47 -
ALTER.- Modificar el objeto.
DELETE.- Borrar filas del objeto.
INSERT.- Insertar filas (registros) en el objeto.
INDEX.- Crear índices en la tabla.
REFERENCES.- Crear claves externas que hagan referencia a la tabla.
SELECT.- Seleccionar columnas (campos).
UPDATE.- Actualizar filas de la tabla.
EXECUTE.- Ejecutar funciones, procedimientos, paquetes, clases Java.
4.3. ASIGNACIÓN DE ROLES
Los ROLES son conjuntos de privilegios que se crean para hacer más sencillo el proceso de
administración. Por defecto, Oracle nos proporciona ROLES ya creados sobre los cuales podemos añadir
más privilegios. También 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 “Básico” ya que permite al usuario que se le asigna
conectarse con la B.D., crear tablas, vistas, sinónimos, secuencias y otros objetos de la B.D.
RESOURCE.- Al usuario que se le concede, se le permite crear tablas, secuencias, índices, clusters de
datos, procedimientos, funciones, paquetes, etc, es el rol asignado a los desarrolladores o
programadores.
DBA.- Es el asignado a los Administradores de B.D., siendo el más 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 opción de Administración” (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 opción de NO
administración.
- 48 -
4.4. CREACIÓN DE USUARIOS
Igual que con los tablespaces, para crear un usuario podemos hacerlo desde la herramienta gráfica
“Enterprise Manager Console” o mediante sentencia SQL.
Desde la herramienta gráfica:
Paso 1.- Abrimos la herramienta “Enterprise Manager Console”, tras conectar como usuario “System”,
seleccionamos el apartado “Seguridad” y después la carpeta “Usuarios”. Sobre dicha carpeta hacemos
clic derecho y seleccionamos la opción “Crear”.
Paso 2.- En este paso sólo escribiremos el nombre del usuario: USR_PRUEBA, y como clave:
usr_prueba, asignándoles 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 AUTENTIFICACIÓN puede ser del tipo:
- 49 -
Contraseña.- Oracle solicita cada vez que un usuario decide tener acceso a una herramienta
suya, un nombre de usuario y una contraseña. Su comprobación se realiza en la
propia gestión de usuarios de Oracle.
Externo.- También conocida como de autentificación por “Sistema Operativo”, es decir, el
usuario debe estar registrado como usuario del Sistema Operativo.
Global.- Este tipo de autentificación es la usada en aquellas redes empresariales, dónde los
usuarios tienen que tener acceso a más de una B.D.
- 50 -
Si observamos la pestaña ROL, podemos comprobar como se le asigna de forma predeterminada el Rol
“CONNECT”.
La sentencia SQL correspondiente a la creación del usuario "USR_PRUEBA" sería:
CREATE USER "USR_PRUEBA"
PROFILE "DEFAULT"
IDENTIFIED BY "usr_prueba"
DEFAULT TABLESPACE "PRUEBA_DEFAULT"
TEMPORARY TABLESPACE "PRUEBA_TEMPORAL"
ACCOUNT UNLOCK;
GRANT "CONNECT" TO "USR_PRUEBA";
El Rol “Connect” engloba a los siguientes privilegios por defecto:
ALTER SESSION.- Modificar una “Session” de conexión.
CREATE CLUSTER.- Permite la creación de clusters de datos. Los clusters de datos son la alternativa a
la indexación, reduciendo las Entrada/Salida a disco para acceder a las tablas.
CREATE DATABASE LINK.- Crear enlaces a B.D. distribuidas.
- 51 -
CREATE SEQUENCE.- Crear secuencias numéricas.
CREATE SESSION.- Nos permite conectarnos al servidor de B.D. y establecer una sesión.
CREATE SYNONYM.- Crear Sinónimos de objetos de la B.D. de otros esquemas, para poder usarlos sin
referenciar al esquema.
CREATE TABLE.- Crear Tablas.
CREATE VIEW.- Crear Vista sobre las tablas. Una Vista es un subconjunto de columnas de una tabla.
Aunque el Rol “Connect” engloba el privilegio “Create Table”, esto no proporciona CUOTA al usuario
sobre el TABLESPACES. Por ello, para poder usar los Tablespaces asociados a un usuario, debemos
especificar la CUOTA (QUOTA) ilimitada (UNLIMITED) del usuario hacia el TABLESPACES o un valor de
cuota.
Gráficamente sería:
- 52 -
Mediante sentencia SQL:
ALTER USER "USR_PRUEBA"
QUOTA UNLIMITED ON "PRUEBA_DEFAULT"
QUOTA UNLIMITED ON "PRUEBA_TEMPORAL"
Los comandos para asignar y quitar privilegios y roles a los usuarios son GRANT y REVOKE
respectivamente.
Sintaxis:
Para conceder:
Privilegios de Sistema a Usuarios:
GRANT privilegio [ , privilegio] ........
TO usuario [ , usuario] ........
[WITH ADMIN OPTION]
Privilegios de Objetos a Usuarios:
GRANT privilegio [ , privilegio] ........|| ALL [PRIVILEGES]
ON [esquema.] Objeto
TO usuario [ , usuario] ........
[WITH GRANT OPTION]
Ejemplo:
GRANT DELETE ON "USR_PRUEBA"."TABLA1" TO "USR_PRUEBA"
ROLES a Usuarios:
GRANT nombre_del_rol [ ,nombre_del_rol]......
TO usuario [,usuario]......
[WITH GRANT OPTION];
- 53 -
Ejemplo:
GRANT "AUTHENTICATEDUSER","DBA" TO "USR_PRUEBA";
Para quitar o revocar:
Privilegios de Sistema a Usuarios:
REVOKE privilegio [ , privilegio] ........ FROM usuario;
Privilegios de Objetos a Usuarios:
REVOKE privilegio [ , privilegio] ........|| ALL [PRIVILEGES]
ON [esquema.] Objeto
FROM usuario [ , usuario] ........
Ejemplo:
REVOKE INSERT
ON "USR_PRUEBA"."TABLA1"
FROM "USR_PRUEBA"
Revocar un Rol:
REVOKE nombre_del_rol [ ,nombre_del_rol]...... FROM usuario;
Podemos crear ROLES propios formado por otros roles y privilegios de sistema y de objetos. Esto se
recomienda cuando tenemos que crear muchos usuarios de la B.D. y asignarles roles y privilegios.
Para ello, podemos usar la herramienta gráfica EMC (Enterprise Manager Console) o mediante la
sentencia SQL.
CREATE ROLE nombre_rol
[NOT IDENTIFIED || IDENTIFIED “contraseña”];
GRANT "rol_existente" TO "nombre_rol";
- 54 -
GRANT privilegio_de_sistema TO " nombre_rol ";
GRANT privilegio_de_objeto ON "esquema"."objeto" TO " nombre_rol ";
Ejemplo:
CREATE ROLE "ROL_PRUEBA" IDENTIFIED BY "clave_rol";
GRANT "DBA" TO "ROL_PRUEBA";
GRANT ALTER ANY CLUSTER TO "ROL_PRUEBA"
GRANT DELETE ON "USR_PRUEBA"."TABLA1" TO "ROL_PRUEBA"
Gráficamente sería:
- 55 -
Toda la información 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 contraseña.
DBA_ROLE_PRIVS.- Usuarios que poseen ROLES.
DBA_SYS_PRIVS.- Usuarios con Privilegios de Sistema.
DBA_TAB_PRIVS.- Usuarios con Privilegios sobre las Tablas.
DBA_COL_PRIVS.- Usuarios con Privilegios sobre columnas.
ROLE_ROLE_PRIVS.-Roles concedidos a otros roles.
ROLE_SYS_PRIVS.- Privilegios de Sistemas otorgados a Roles.
ROLE_TAB_PRIVS- Privilegios de Tablas otorgados a Roles.
Por ejemplo: ¿Qué ROLES tiene asignado el usuario “USR_PRUEBA”?
Select * from DBA_ROLE_PRIVS where GRANTEE='USR_PRUEBA';
- 56 -
Por último, el usuario que se crea se puede asignar a un “Perfil” (PROFILE), cuya función 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
contraseña, históricos de contraseña, etc.).
Por defecto, si no se ha creado ningún “Perfil” se asigna el “Default”, en el cuál todo es “ilimitado” y “sin
restricciones”.
Sólo diferenciar entre “Default” e “Unlimited”.
Default.- Si se especifica en un nuevo “Perfil”, Oracle asigna el valor existente para ese parámetro en el
perfil “Default”.
Unlimited: Sin límite en ese parámetro.
Un usuario sólo puede tener un “Perfil”.
- 57 -
- 58 -
RECUERDE
- Los usuarios SYS y SYSTEM son los de mayor “PODER” sobre la B.D.
- El nivel de “AUTORIZACIÓN” de los usuarios, se les concede por medio de los PRIVILEGIOS y
ROLES.
- Puede crear a los usuarios mediante sentencias SQL o a través de “Enterprise Manager
Console”.
- Un usuario puede tener o no un perfil, pero en caso de tenerlo, sólo puede poseer uno.
- 59 -
5.1. DEFINICIÓN _________________________________________________ 61
5.2. TIPOS DE DATOS_____________________________________________ 61
5.3. DEFINICIÓN DE ESQUEMA _____________________________________ 64
5.4. PASOS PARA CREAR UNA TABLA_______________________________ 65
Tema 5 TABLAS
- 61 -
5.1. DEFINICIÓN
Las TABLAS son la estructura básica en los diseños 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 más 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 máximo es 2000 caracteres.
VARCHAR2.- Columna de caracteres de longitud VARIABLE, cuyo valor máximo es 4000 caracteres.
Oracle permite almacenar y manejar datos de caracteres de muchos idiomas, característica conocida
como National Language Support (NLS). Esto implica que algunos caracteres de estos idiomas necesitan
- 62 -
más 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 tamaño máximo es 2000
caracteres o 2000 Bytes por fila, dependiendo del juego de caracteres, siendo la configuración
predeterminada de 1 Byte.
NVARCHAR2.- Columna de longitud VARIABLE para juego de caracteres MULTIBYTE. Su tamaño
máximo es 4000 caracteres o 4000 Bytes por fila, dependiendo del juego de caracteres,
siendo la configuración predeterminada de 1 byte.
NUMBER.-Columna numérica de longitud VARIABLE. Abarca los tipos de datos ANSI/ISO1 NUMERIC,
DECIMAL, DEC, INTEGER, INT, SMALLINT. Si queremos representar un número decimal
sería NUMBRE(9,2), que quiere decir: 9 dígitos de los que 2 son decimales.
El número de BYTE que ocupa el número a almacenar, se calcula dividiendo la longitud total
por 2, se redondea a un número entero y se suma 1. Por tanto NUMBER(9) ocuparía 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 máxima de 2GBytes.
RAW.- Columna de longitud VARIABLE para datos binarios, de longitud máxima 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 máxima 2GBytes.
ROWID.- Datos binarios que representan un identificador de fila (RowID).
Los identificadores de fila se almacenan internamente como un número binario de longitud fija,
siendo esta longitud variable entre distintos S.O. Para poder manipular los identificadores de
1 American National Standards/International Organization for Standardization
- 63 -
fila, estos pueden ser convertidos a una cadena de caracteres mediante la función
ROWIDTOCHAR. Esta función 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 número de archivo.
Cada parte es un número 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 TAMAÑO, hasta 4 GBytes.
CLOB.- Objeto de caracteres de GRAN TAMAÑO, 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 Tamaño. Su acceso es de sólo lectura.
Su información no es gestionada por Oracle, sino por el S.O. por lo que no están sujetos a
transacciones.
UROWID.- Datos binarios utilizados para el direccionamiento de datos, de longitud máxima 4000 bytes.
Usado para el manejo de tablas e índices particionados.
FLOAT.- Abarca los tipos de datos ANSI/ISO estándar FLOAT, REAL, DOUBLE PRECISION, todos ellos
podemos englobarlo dentro del NUMBER.
- 64 -
5.3. DEFINICIÓN DE ESQUEMA
Los ESQUEMAS (Schemas) es dónde se organiza de forma LOGICA los distintos objetos relacionados
de la B.D. (Tablas, Índices, Vistas, Sinónimos, Secuencias, Agrupamientos, Tipos de Origen, Tipos de
Usuario).
Esta forma de organización lógica, nos permite tener objetos con el mismo nombre, por ejemplo dos
tablas, en esquemas distintos sin crear ningún conflicto a la gestión interna de Oracle.
Hay que tener MUY CLARO que toda nuestra estructura lógica de la B.D. se organiza en el Esquema,
además 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.
- 65 -
5.4. PASOS PARA CREAR UNA TABLA
Para crear una tabla podemos crearla mediante una sentencia SQL o mediante la herramienta gráfica
OMC (Oracle Manager Console). Si usamos el OMC, Oracle nos proporciona un asistente.
Los pasos serían:
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 botón “&Crear”, comprobando que tengamos
activa la opción “&Usar Asistente”. En este punto, nos aparecerá la primera ventana del asistente “Paso 1
de 13”.
- 66 -
En ella especificamos el nombre de la Tabla, “VEHICULOS”. Al especificar el esquema del cuál va a
formar parte ese objeto, automáticamente se le asigna su Tablespaces de Datos.
- 67 -
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. Además de qué nombre deseamos poner a la restricción que
comprueba y verificará que sea único por cada fila el valor introducido en dicha columna o campo. Oracle
crea una asignación automática.
Para ello, sólo tendremos que seleccionar la opción “Sí, deseo crear una clave primaria”, y especificar en
la columna “Orden” el orden de creación. Por nombre de restricción, no usaremos en este ejemplo el
“Asignado por el Sistema”, por lo que usaremos el nombre PK_VEHICULO.
- 68 -
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 restricción, o bien, que Oracle los asigne automáticamente.
En nuestro ejemplo sólo especificaremos que la columna “COLOR” pueda tomar el valor NULO (NULL).
- 69 -
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, también conocida como FOREING KEY. Para este ejemplo no tenemos ninguna.
Si la hubiese, tendríamos 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 automáticas.
En nuestro ejemplo obligaremos a que los posibles valores de la columna “MODELO” sean: OPEL, SEAT,
RENAULT, MERCEDES, AUDI. También que la “MATRICULA” sus valores sean convertidos a mayúscula
UPPER(MATRICULA).
- 70 -
- 71 -
Paso 8.- En el “Paso 7 de 13”, se permite la modificación de los parámetros de almacenamiento por
defecto para la Tabla.
Si NO SE SELECCIONA la opción “Sustituir parámetros de almacenamiento por defecto”, Oracle
gestionará el tamaño automáticamente, basándose en el “Tamaño Inicial” y en la “Tasa de Crecimiento”
aproximado de cada fila de la tabla.
Número Inicial de Filas: Número de filas de la tabla. Oracle, utiliza el número de filas para determinar el
tamaño de la primera extensión de segmento.
Ratio de Crecimiento: Ratio de crecimiento de la tabla esperado en filas / unidad de tiempo (día,
semana, mes, año). Este valor es usado por Oracle para determinar el tamaño (en bytes) de la siguiente
extensión de segmento.
Las opciones Actividad de Actualización y Actividad de Inserción permiten a Oracle definir los
parámetros del bloque de datos óptimos que minimizan el encadenamiento y la migración de filas.
- 72 -
Actividad de Actualización.- 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 máximo de un 90 por ciento
de cada bloque de datos.
Tamaño de Fila de Aumento por Actualización: Disponible si la Actividad de Actualización 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 máximo de un 95 por
ciento de cada bloque de datos.
Actividad de Inserción.-Determina el porcentaje mínimo de espacio utilizado que Oracle mantiene para
cada bloque de datos de la tabla (PCTUSED).
Superior: Define el porcentaje mínimo de espacio utilizado en un 40 por ciento del bloque de
datos de la tabla.
Tamaño de Fila de Aumento por Actualización: Disponible si la Actividad de Inserción es alta,
define el porcentaje mínimo de espacio utilizado en un 60 por ciento del bloque de datos de la
tabla.
Inferior o Ninguno: Define el porcentaje mínimo 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
tamaño muy grande ( 2 GByte) dividiéndolas en diferentes partes. Esto permite a las sentencias SQL
manejar las distintas particiones y no la Tabla al completo o el índice.
- 73 -
El poder particionar, también nos permite asignar las particiones a más de un Tablespaces distinto, por lo
que podemos:
- Reducir la posibilidad de corrupción de datos, por tratarse de tamaños 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 físicas de disco
distintas.
El particionamiento, podemos hacerlo por bloques de filas, según 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 diseñar la tabla, definimos el campo del tipo LOB.
Aunque el “Asistente” sólo nos permite particionar por un solo campo, la Tabla puede ser particionada
por más de un campo.
- 74 -
Nota.- El particionamiento sólo es permitido en versiones superiores a Oracle 8.
Una forma de ver si nuestro SGBD Oracle lo permite es abriendo la aplicación 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 creación de la Tabla.
- 75 -
Si hubiésemos seleccionado la partición, los pasos siguientes antes de llegar al “Paso 13 de 13” nos
solicitan información para definir el particionaminto.
Una vez pulsado el botón “Terminar” en la ventana “Paso 13 de 13”, nos debe aparecer la ventana de
confirmación 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”.
- 76 -
La sintaxis de creación 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, sólo tendremos que posicionarnos en el objeto desde la consola del OEM y
hacer clic derecho. Del menú que aparece, seleccionamos la opción “Mostrar DDL de Objeto....”
- 77 -
Oracle nos muestra una ventana con el código SQL, PERO mucho más detallado, que el mostrado por el
asistente de creación de tablas.
Organizando la sentencia, ésta quedaría:
CREATE TABLE "USR_PRUEBA"."VEHICULOS"
("MATRICULA" VARCHAR2(15 byte) NOT NULL,
"MODELO" VARCHAR2(15 byte) NOT NULL,
"COLOR" VARCHAR2(10 byte),
"CILINDRADA" NUMBER(4) NOT NULL,
"FECHA_COMPRA" DATE NOT NULL,
"PRECIO_VENTA" NUMBER(7, 2) NOT NULL,
CONSTRAINT "PK_VEHICULO" PRIMARY KEY("MATRICULA") USING INDEX
TABLESPACE "PRUEBA_DEFAULT"
STORAGE (
INITIAL 64K
NEXT 0K
- 78 -
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 extensión
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á automáticamente.
1. INITIAL - Valor de la primera Extensión del objeto (Tabla). En este caso es tamaño de
8 bloques de 8Kbyte cada uno.
- 79 -
2. NEXT.- Su valor es almacenado en el “Diccionario de Datos” y se utiliza para la
creación de las nuevas EXTENSIONES de la Tabla. Cualquier cambio en este valor
sólo afecta a las nuevas extensiones.
3. MINEXTENTS.- Mínimo número de extensiones que debe presentar una tabla, es
decir, número mínimo de extensiones que debe tener un segmento.
4. MAXEXTENTS.- Número máximo de extensiones que puede presentar una Tabla.
Podemos asignarles un valor o indicar que es ilimitado.
Si es ILIMITADO, permite crear un número de extensiones que sólo está limitada por la
cantidad de espacio contiguo existente en el tablespaces.
Si se indica un VALOR, este es el número máximo 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 tamaño 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
periódicas de extensiones libres contiguas.
Su valor es 0, ya que hemos creado un TABLESPACES “Gestionado localmente”, por lo
que no actuará el proceso SMON.
• Además de los parámetros de almacenamiento de extensiones, cada tabla posee unos
parámetros de bloques que controlan su utilización.
Estos valores, pueden ser asignados durante la creación de la tabla o posteriormente, con el objetivo
de mejorar la utilización del espacio y minimizar la migración de filas entre los bloques de la tabla.
Dependiendo de dicho parámetro, las modificaciones pueden afectar a todos los bloques o sólo a los
nuevos bloques.
Un Bloque o Data Block se compone de las siguientes partes:
Cabecera de Bloque.- Contiene datos relativos al bloque, como la dirección del bloque y el tipo de
segmento al que pertenece (Tabla, índice o rollback).
- 80 -
Directorio de Tablas.- Guarda información de las Tablas que tienen datos en el bloque.
Directorio de Filas.- Guarda información sobre las filas de las tablas que se encuentran en ese
momento en el bloque. Esta información está compuesta por la dirección de la fila en la zona “Datos
de Filas”, en la cuál 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 inserción de nuevas filas en el Bloque o para las
actualizaciones que requieran más tamaño del que disponían 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 parámetros que afectan al bloque son:
PCTFREE 10 PCTUSED 0 INITRANS 1 MAXTRANS 255
1. PCTFREE.- Su valor indica el PORCENTAJE de espacio mínimo 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 más en ese
bloque, dejando el espacio sobrante para ampliaciones de actualizaciones.
El valor de este parámetro solo afecta a las futuras inserciones.
2. PCTUSED.- En este parámetro, 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 %.
- 81 -
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 parámetro (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 parámetro 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 MIGRACIÓN DE
FILAS.
Encadenamiento de Filas (Chained row).- Sucede cuando los datos de una Fila no caben
en un sólo bloque y Oracle debe distribuirlos en más de un bloque reservado para la
extensión.
Esto sucede con columnas del tipo de datos Long, Long Raw, CLOB, etc.
Migración de Filas.- Sucede cuando se realizan actualizaciones en columnas de datos de
tipo variable, por ejemplo Varchar2. Si no tenemos espacio suficiente para la actualización,
valor del PCTFREE, Oracle migra toda la fila a otro bloque con capacidad libre.
Estos dos fenómenos, reducen considerablemente el RENDIMIENTO de Oracle a la hora de
manejar y manipular los datos.
¿Cómo DETECTAR estos fenómenos?
- 82 -
Para ello, usamos la sentencia SQL:
ANALYZE TABLE [esquema].tabla
{COMPUTE STATISTICS | ESTIMATE STATISTICS [SAMPLE interger { ROW | PERCENT
} ] };
COMPUTE STATISTICS.- Nos proporciona información estadística, basándonos en un
recorrido completo de la tabla.
ESTIMATE STATISTICS.- Genera información estadística, basada en un número de filas
(SAMPLE interger ROW) de la tabla, por defecto 1064, o en un porcentaje de filas
(SAMPLE interger PERCENT).
La información 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 opción 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.
También, podemos chequear la tabla para comprobar si existen bloques corruptos.
ANALIZE TABLE [esquema.] tabla
VALIDATE STRUCTURE [CASCADE];
- 83 -
También, podemos utilizar el paquete predefinido de Oracle, DBMS_UTILITY con el
procedimiento ANALYZE_SCHEMA
(esquema VARCHAR2
método VARCHAR2,
filas_estimadas NUMBER DEFAULT NULL,
porcentaje_estimado NUMBER DEFAULT NULL);
Dónde:
esquema.- Nombre del esquema que se analiza.
método.- Puede ser NULL o ESTIMATE. Si es ESTIMATE, entonces “filas_estimadas” o
“porcentaje_estimado” debe ser distintos de cero.
filas_estimadas.- Número de filas a estimar.
porcentaje_estimado.- Porcentaje a estimar, si se ha especificado un valor en
“filas_estimadas”, este parámetro 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.- Número inicial de entrada de la transacción 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 transacción que actualiza un bloque, necesita una entrada de transacción en el
bloque. Este valor asegura un mínimo de transacciones concurrentes que pueden
actualizar el bloque y ayuda a evitar la sobrecarga de reserva dinámica de espacio para
una entrada de transacción.
4. MAXTRANS.- Número máximo de transacciones simultaneas o concurrentes que
pueden actualizar un bloque de datos asociados al objeto. Su valor puede ir desde 1 a
255, y es calculado en función del tamaño del bloque. El valor asignado se recomienda
no cambiarlo.
- 84 -
Por tanto, si el número de transacciones concurrentes que actualizan un bloque
superan el valor especificado en el parámetro INITRANS, Oracle reserva espacio
dinámicamente para entradas de transacciones en el bloque hasta que se sobrepase el
valor del parámetro MAXTRANS, o hasta que el bloque no tiene más espacio libre.
Todos los parámetros anteriores, pueden ser modificados usando la pestaña “Almacenamiento” de la
“Tabla” dentro del “Esquema” correspondiente, en el Enterprise Manager Console.
En esta ventana, aparece la opción 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.
- 85 -
Esta ventana presenta la opción de CÁLCULO AUTOMÁTICO. En la cuál se nos solicita la siguiente
información:
Ratio de Crecimiento.- Es el “Ratio de crecimiento” de la tabla esperado en filas/unidad de
tiempo (día, semana, mes o año). Siendo el crecimiento mayor en “día”.
Oracle, utiliza el ratio de crecimiento para determinar el tamaño (en bytes) de la siguiente
extensión (NEXT). Por tanto, el valor mínimo es un bloque (8192 Byte = 8Kbyte) .
Cuanto mayor sea la relación filas/día, mayor será el valor de NEXT.
Actividad de Actualización. (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 / día, tendríamos un NEXT de 40960
Byte ( 5 bloques de 8KByte), un PCTFREE del 0 % y un PCTUSED del 60 %.
Tamaño de Fila de Aumento por Actualización.- Disponible si la Actividad de
Actualización 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, obtendríamos 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 Inserción. (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%.
- 86 -
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 serían:
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);
- 87 -
RECUERDE
- Las TABLAS son la estructura lógica de toda aplicación de B.D.
- Los tipos de DATOS usados con mayor frecuencia son: Number, Varchar2 y Date.
- Los USUARIOS están asociados a los ESQUEMAS.
- Las TABLAS se pueden crear usando sentencias SQL o la herramienta gráfica.
- Al crear el TABLESPACE, se aconseja que éste sea “gestionado localmente”.
- 89 -
6.1. INSERCIONES DE DATOS ______________________________________ 91
6.2. CONSULTAS DE DATOS _______________________________________ 95
6.3. ACTUALIZACIÓN Y BORRADO DE DATOS ________________________ 97
6.4. LA CLAUSULA “WHERE” ______________________________________ 99
6.5. RELACIONES ENTRE INSERT Y SELECT _________________________ 101
6.6. LA VISTA V$NLS_PARAMETERS _______________________________ 104
6.7. FUNCIONES PREDEFINIDAS ___________________________________ 106
6.7.1. Funciones de Carácter ____________________________________ 106
6.7.2. Funciones de Conversión __________________________________ 108
6.7.3. Funciones Numéricas_____________________________________ 114
6.7.4. Funciones de Fechas _____________________________________ 115
6.7.5. Funciones de grupo ______________________________________ 118
Tema 6 OPERACIONES SOBRE TABLAS
- 91 -
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 creación se especificó que pudiese no
tomar valor.
Para ejecutar estas sentencias, Oracle nos proporciona dos herramientas:
SQL Plus
SQLPlus Worksheet
- 92 -
Desde SQLPlus Worksheet, una vez conectado, sólo tendríamos que ejecutar la sentencia o sentencias.
Para ejecutar una sentencia, sólo tendremos que pulsar la tecla F5 o hacer clic en el botón de “Ejecutar”.
- 93 -
Otra posibilidad es tener las instrucciones SQL escritas en un fichero de texto con extensión SQL y cargar
dicho fichero en el Worksheet.
Ahora bien desde la versión 8i, Oracle a través de la herramienta gráfica “Oracle Enterprise Console”,
nos proporciona la introducción de datos. Sólo tendremos que posicionarnos en la tabla y seleccionar,
una vez pulsado el clic derecho, la opción “Ver/Editar Contenido...”.
- 94 -
- 95 -
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 carácter comodín * , 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 -
Las cláusulas WHERE la estudiaremos en un apartado independiente.
Las columnas pueden tener alias, mostrándose este en lugar del nombre de la columna.
ORDER BY
Esta cláusula 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;
- 97 -
6.3. ACTUALIZACIÓN Y BORRADO DE DATOS
La actualizaciones o modificaciones de los datos de las tablas se llevan a cabo usando la sentencia SQL
UPDATE.
UPDATE [esquema.] tabla SET columna1=valor_nuevo1, columna2=valor_nuevo2, ......
[WHERE condiciones];
Ejemplo 1:
UPDATE vehiculos SET modelo=’ OPEL’, fecha_compra=’20/03/01’ WHERE matricula=’ 2235-AAB’;
Para borrar los datos de una tabla usaremos la sentencia SQL DELETE, cuya sintaxis es:
DELETE [FROM] [esquema.] tabla
[WHERE condiciones];
Si no se especificase la cláusula WHERE, borraríamos todas las filas de la tabla.
Ejemplo 1:
DELETE FROM vehiculos WHERE matricula=’ 2235-AAB’;
- 98 -
Ejemplo 2:
DELETE FROM vehiculos;
Igual a:
DELETE vehiculos;
- 99 -
6.4. LA CLAUSULA “WHERE”
Esta cláusula forma parte de las instrucciones o sentencias SELECT, UPDATE y DELETE. Su finalidad
es aplicar la acción de las sentencias anteriores a un conjunto de filas que cumplan la condición o
condiciones especificadas en la cláusula WHERE.
Para especificar más de una condición en la cláusula WHERE, usaremos los operadores booleanos AND,
OR y NOT.
Dentro de la propia condición, podemos usar los operadores:
= , > , < , >= , <= , <>, != , LIKE, IN, BETWEEN, IS NULL.
LIKE
Este operador se usa para comparación con patrones en cadena de caracteres. El carácter % equivale a
un conjunto de caracteres y el carácter _ equivale a un sólo carácter.
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 sólo.
Ejemplo:
SELECT * FROM vehiculos WHERE cilindrada BETWEEN 1000 and 1400;
SELECT * FROM vehiculos WHERE precio_venta BETWEEN 6010.40 and 6500.50;
- 100 -
IS NULL
Para consultar filas dónde existan columnas con valor NULL, usamos IS NULL ya que la condición =
NULL, no daría un resultado correcto.
- 101 -
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 dónde las columnas a copiar sean idénticas 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
creación.
CREATE TABLE nueva_tabla AS SELECT * FROM [esquema.] tabla;
- 102 -
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
botón “Crear como...”. Esta opción nos permite crear una copia de la tabla tanto de datos como de
restricciones.
- 103 -
- 104 -
6.6. LA VISTA V$NLS_PARAMETERS
La vista v$nls_parameters, me informa de los valores de NLS_LANGUAGE, NLS_TERRITORY, etc.,
establecidos en la B.D.
Ejemplo:
Select * from v$nls_parameters;
Valores devueltos por la vista en una B.D. Oracle 8.05:
PARAMETER VALUE
NLS_LANGUAGE SPANISH
NLS_TERRITORY SPAIN
NLS_CURRENCY ¿
NLS_ISO_CURRENCY SPAIN
NLS_NUMERIC_CHARACTERS ,.
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD/MM/RR
NLS_DATE_LANGUAGE SPANISH
NLS_CHARACTERSET WE8ISO8859P1
NLS_SORT SPANISH
NLS_NCHAR_CHARACTERSET WE8ISO8859P1
11 filas seleccionadas.
Valores devueltos por la vista en una B.D. Oracle 9i:
PARAMETER VALUE
NLS_LANGUAGE SPANISH
NLS_TERRITORY SPAIN
NLS_CURRENCY €
- 105 -
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.
- 106 -
6.7. FUNCIONES PREDEFINIDAS
El lenguaje SQL, nos proporciona funciones SQL predefinidas. Dichas funciones las podemos agrupar en
diferentes categorías:
6.7.1. Funciones de Carácter
CHR(x) .- Devuelve el carácter correspondiente al número “x” del conjunto de caracteres.
Select chr(123) from dual;
CONCAT(cadena1, cadena2).- Devuelve la unión de la cadena1 con la cadena2, es idéntica al
operador ||.
INITCAP(cadena).- Convierte a mayúscula la primera letra de la cadena y a minúscula el resto. Si en la
cadena existen palabras separadas por blancos, también el primer carácter es convertido a mayúscula.
LOWER(cadena) y UPPER(cadena).- Devuelven la cadena en minúscula (Lower) y mayúscula (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 función 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 número de caracteres especificados en x. Si el número 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 posición a.
- 107 -
Ejemplo:
TRANSLATE(cadena, valor_inicial, valor_final).- Esta función 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 número. Algunas de estas son:
ASCII(cadena).- Devuelve el número correspondiente al carácter especificado en el parámetro cadena.
Ejemplo: Select ASCII('&') Resultado from dual;
Resultado: 38
Si ejecutamos la sentencia Select CHR(38) Resultado from dual, mostrará el carácter &.
- 108 -
INSTR(cadena1, cadena2 [,a [,b] ] ).- Devuelve la posición dentro de la cadena1 dónde está contenida
la cadena2. Por defecto se explora desde la izquierda empezando en la posición a, si dicho valor es
negativo, se comienza desde la derecha. En b se especifica el número de la repetición 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 Conversión
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 instalación de la B.D.
- 109 -
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 parámetro 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 (día
y mes) y las abreviaturas de fecha (AM, PM, aC, dC). Los idiomas soportados se especifican en el
parámetro de configuración de Oracle denominado NLS_LANGUAGE que en nuestro caso es
AMERICAN. El valor se asigna de la siguiente forma: ‘NLS_DATE_LANGUAGE=idioma’.
- 110 -
- 111 -
El parámetro formato puede tomar los siguientes valores:
“texto” Texto encerrado entre dobles comillas.
D Día de la semana (1-7).
DD Día del mes (1-31).
DDD Día del año (1-366).
DY Nombre Abreviado del día. (Las tres primeras letras)
DAY Nombre del día, rellenado con espacios en blanco hasta nueve caracteres.
IW Número de Semana del Año.(1-52 ó 53)
W Semana del mes. (1-5)
IYYY,IYY,IY,I Los cuatro, tres, dos o un dígito del año.
Y,YYYY Año con una coma en esa posición.
YEAR Año en letras.
HH,HH12,HH24 Horas especificadas de 1 a 12 ó de 0 a 23.
MI Minutos. (0-59)
MM Meses en número. (1-12)
MON Nombre abreviado del mes.
MONTH Nombre del mes, rellenado con espacios en blanco hasta nueve caracteres.
PM, P.M. PostMeridian (Después de Medio día)
Q Trimestre del año. (1-4)
RM Meses en números romanos.
SS Segundos (0-59)
WW Semana del año (1-53). La primera semana comienza el primer día del año hasta el
séptimo día.
Ejemplos:
Select TO_CHAR (to_date('22/12/03'),' "Semana" IW "del Año 2003" ') Resultado from dual;
RESULTADO
Semana 52 del Año 2003
- 112 -
TO_CHAR(numero [,formato [,NLS_NUMERIC_ CHARACTERS NLS_CURRENCY]]).- Convierte el
valor de “numero” de tipo NUMBER a VARCHAR2.
El parámetro 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 parámetro lo
determina NLS_TERRITORY.
Ejemplo:
'NLS_NUMERIC_CHARACTERS=' ',.' ' NLS_CURRENCY=' 'Euros' ' '
El parámetro formato puede tomar los siguientes valores:
9 Cada número 9 representa un dígito significativo del resultado.
0 Devuelve ceros por la izquierda.
FM Devuelve un valor sin blancos a la izquierda.
RM o rm Devuelve el número como número romano en mayúscula o minúscula
respectivamente.
EEEE Devuelve el valor utilizando notación científica.
D Devuelve un punto Decimal en la posición especificada.
G Devuelve un separador de grupo en la posición especificada.
. , Devuelve un punto o coma en la posición especificada independientemente de G o
D
L Devuelve el símbolo de Moneda Local en la posición especificada.
C Devuelve la moneda ISO. (EUR)
PR Números negativos entre < >
S Signo + o - por la izquierda.
Ejemplos:
• Select TO_CHAR(1457,'09999') from dual;
- 113 -
Resultado: 01457
• Select TO_CHAR(15,'RM') from dual;
Resultado: XV
• Select TO_CHAR(1000000,'9EEEE') from dual;
Resultado: 1E+06
• Select TO_CHAR(1000000,'9G999G999D99') from dual;
Resultado: 1.000.000,00
• Select TO_CHAR(1000000.78,'9,999,999.99') from dual;
Resultado: 1,000,000.78
• Select TO_CHAR(10000.78,'L9G999G999D99') from dual;
Resultado: €10.000,78
• Select TO_CHAR(10000.78,'C9G999G999D99') from dual;
Resultado: EUR10.000,78
• Select TO_CHAR(-10000.78,'S9G999G999D99') from dual;
Resultado: -10.000,78
- 114 -
TO_DATE (cadena [,formato [,NLS_DATE_LANGUAGE]]).- Convierte una cadena VARVHAR2 o CHAR
en un valor de tipo DATE. El formato es una cadena del tipo de formato especificado en
TO_CHAR(fechas [,formato [,NLS_DATE_LANGUAGE] ]). TO_CHAR y TO_DATE tienes funciones
inversas.
Ejemplo:
Select TO_DATE('Mar 14 Ene','DY DD Mon') from dual;
Resultado: 14/01/03
TO_NUMBER(cadena [,formato[,NLS_DATE_LANGUAGE]]).- Convierte la cadena CHAR o VACHAR2
a un tipo NUMBER. Si se especifica un formato, la cadena debe ser igual al formato especificado.
Ejemplo:
Select TO_NUMBER('02.78','09.99') from dual;
Resultado: 2,78
6.7.3. Funciones Numéricas
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 números enteros positivos ni x ni y, salvo si x
es negativo, entonces y debe ser un número entero.
ROUND(x, [,y]).- Devuelve el valor de x redondeado a y posiciones a partir del número decimal.
Ejermplo:
Select ROUND(435.56789,4) from dual;
- 115 -
Resultado: 435,5679
TRUNC(x, [,y]).- Devuelve el valor de x redondeado a y posiciones a partir del número 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 raíz cuadrada de x.
6.7.4. Funciones de Fechas
Las funciones de fecha admiten parámetros del tipo DATE y devuelven valores del tipo DATE, salvo la
función 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 más x meses. El valor de x debe ser un número entero.
LAST_DAY(fecha).- Devuelve la fecha del último día especificada en fecha. Esta función es útil para
calcular el número de días que faltan para completar el mes actual.
- 116 -
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 número de meses existentes entre ambas fechas. Si
los días son los mismos entre ambas fechas, el resultado es un número entero, si son días 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 y hora de la
franja_horaria_2 correspondiente a la fecha especificada en fecha de la franja_horaria_1. Los valores
de los parámetros franja son cadenas de caracteres, cuyos valores pueden ser:
- 117 -
Franjas Horarias:
AST (Atlantic Standard Time) ( 4 horas menos a la GMT) (Horario Estándar del Atlántico)
ADT (Atlantic Daylight Time) ( 3 horas menos a la GMT) (Horario de Verano del Atlántico)
BST (Bering Standart Time)
BDT (Bering Daylight Time)
CST (Central Standart Time) (Horario Estándar de la zona Central)
CDT (Central Daylight Time)
EST (Eastern Standart Time) (Horario Estándar 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 Estándar de las Rocosas)
MDT (Mountain Daylight Time) (Horario de Verano de las Rocosas)
NST (Newfoundland Standart Time) (Horario Estándar 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 Página Web:
http://www.barceloviajes.com/franjah/horamundial.asp
NEXT_DAY(fecha,día_de_la_semana).- Devuelve la fecha del día especificado en día_de_la_semana
posterior a la fecha indicada en fecha.
- 118 -
Ejemplo:
Select NEXT_DAY('8/01/03','Martes') from dual;
Resultado: 14/01/03
6.7.5. Funciones de grupo
Estas funciones devuelven un sólo resultado aplicándose sobre un conjunto de filas de datos. Son usadas
conjuntamente con la cláusula GROUP BY.
Las cláusulas DISTINCT y ALL pueden usarse con algunas de estas funciones de grupo.
Al usar DISTINTC la función sólo toma aquellos valores de la consulta que sean distintos entre sí.
Al usar ALL la función toma todos los valores devueltos por la consulta, esta es la cláusula por defecto.
Partiendo de la tabla EMP del usuario SCOTT, es decir:
tendríamos:
Ejemplo:
• Select DISTINCT deptno from emp;
- 119 -
Resultado:
DEPTNO
10
20
30
• Select deptno from emp GROUP BY deptno;
Resultado:
DEPTNO
10
20
30
AVG( [ DISTINCT || ALL] columna ).- Devuelve la media de los valores de las columnas agrupadas.
Ejemplo:
• Select avg(sal) from emp;
Resultado: 2073,21429
• Select avg(sal) Media,deptno from emp group by deptno;
Resultado:
Media DEPTNO
2916,66667 10
2175 20
1566,66667 30
• Select avg(distinct sal),deptno from emp group by deptno;
Si existe algún 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 ).- Número de filas de la consulta.
Ejemplo:
• Select count(*) Total_Filas from emp;
- 120 -
Resultado: 14
• Select count( deptno) Total_Filas from emp where deptno=20;
Resultado: 5
• Select count(distinct deptno) Total_Filas from emp where deptno=20;
Resultado: 1
MAX(columna ).- Devuelve el valor máximo 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 mínimo de la columna consultada.
• Select min(sal) from emp;
Resultado: 800
• Select min(sal),deptno from emp group by deptno;
Resultado:
MIN(SAL) DEPTNO
1300 10
800 20
950 30
SUM([ DISTINCT || ALL] columna ).- Suma de las columnas.
• Select sum(sal) from emp;
Resultado: 29025
• Select sum(sal),deptno from emp group by deptno;
Resultado:
SUM(SAL) DEPTNO
8750 10
10875 20
9400 30
- 121 -
RECUERDE
- Oracle usa sentencias INSERT para las inserciones de datos.
- Sentencias UPDATE para las actualizaciones de los datos.
- DELETE para borrado de datos.
- Oracle nos proporciona una serie de funciones predefinidas para el manejos de los datos.
- 123 -
7.1. CLÁUSULA HAVING__________________________________________ 125
7.2. OPERACIONES DE CONJUNTOS EN CONSULTAS SQL _____________ 126
7.3. UNIONES INTERNAS Y EXTERNAS ______________________________ 127
7.4. SUBCONSULTAS ____________________________________________ 132
7.4.1. Select como parte de una cláusula Where o Having_______________ 132
7.4.2. Select como una tabla_____________________________________ 134
7.4.3. Select como una columna a mostrar __________________________ 134
7.4.4. Select como parte de una cláusula Having _____________________ 136
7.5. CONSULTAS RECURSIVAS____________________________________ 137
7.6. CONSULTAS CON LA FUNCIÓN DECODE ________________________ 139
Tema 7 CONSULTAS
- 125 -
7.1. CLÁUSULA HAVING
La cláusula HAVING se usa conjuntamente con la cláusula GROUP BY. Actúa igual que una cláusula
WHERE, salvo que la condición se aplica al resultado de la agrupación. Sería:
Select campo1, count(campo2) from tabla
Where campo1 = condicción
Groub by campo1
Having count(campo2) = condición;
En este tipo de sentencias, Oracle filtra los registros según la condición del where antes de agrupar. Una
vez filtrado agrupa, y después aplica la condición de la cláusula having.
Veamos un ejemplo aplicado a la tabla EMP (Empleados) del usuario Scott/tiger de Oracle. Aquí, se
solicitan números de los departamentos que posean más de dos empleados cuyo puesto de trabajo sea
“CLERK”. (Comercial).
- 126 -
7.2. OPERACIONES DE CONJUNTOS EN CONSULTAS SQL
SQL, nos permite hacer uso de los operadores de conjuntos para obtener datos de más 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 repetición 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 tendríamos:
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 obtendríamos: Select * from A INTERSECT Select * from B;
El resultado es: 4,5.
MINUS.- Este operador nos muestra todas las filas de la primera tabla salvo los que sean comunes a la
segunda tabla. Para los datos A={1,2,3,4,5} y B={4,5,7,8,9} tendríamos:
Select * from A MINUS Select * from B;
El resultado es: 1,2,3.
- 127 -
7.3. UNIONES INTERNAS Y EXTERNAS
Uniones Internas.- Son aquellas que combinan las filas de dos o más tablas usando para ello campos o
columnas de las tablas comunes, es decir, usando las columnas Primery Key y Foreing Key.
Este tipo de uniones sólo devuelve las filas comunes entre ambas tablas, NUNCA devuelve filas que no
estén en una tabla y en otra no.
Un ejemplo aplicado a las tablas EMP y DEPT del usuario Scott/tiger sería la siguiente:
Con esta select obtendríamos 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 más 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.
- 128 -
Para ello, usamos la simbología(+), en la parte de la condición de la cláusula where de la tabla de la cual
esperamos no obtener filas.
Por ejemplo si tuviésemos dos tablas CLIENTES y PEDIDOS y quisiéramos 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 unión interna pero especificando la simbología (+) 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;
- 129 -
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 definición de la estructura de la tabla empleado se ha
impuesto una restricción FOREING KEY hacia el campo DEPTNO.
- 130 -
El resultado sería igual al de una consulta interna.
Estas UNIONES EXTERNAS son conocidas también 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;
Sería:
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 -
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 -
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 cláusula Where.
• Como una tabla.
• Una columna a mostrar.
• Como parte de una cláusula Having.
Además, siempre deben ir entre paréntesis y nunca deben contener la cláusula ORDER BY, ni pueden
ser UNION de varias sentencias select.
7.4.1. Select como parte de una cláusula 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 Galán
150 La papelería s.a.
160 Librería Técnica s.l.
200 María García Acosta
210 José Martín Rubio
VENTAS
1 2.500 100
2 5.000 150
3 9.500 160
4 2.350 200
5 3.750 210
- 133 -
Si queremos obtener los clientes cuyas ventas superan la media de ventas de la empresa, sería:
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 papelería s.a. 5000
Librería Técnica s.l. 9500
José Martín Rubio 3750
Otro ejemplo aplicado a la tabla EMP del usuario Scott/tiger podría ser: ¿Obtener los nombres y salarios
de los empleados cuyo sueldo sea superior a la media de sueldos de la empresa?
- 134 -
7.4.2. Select como una tabla
Si en el ejemplo anterior se desease mostrar el valor de la media, podríamos 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 -
Si tenemos los datos:
CLIENTES
100 Juan Martos Galán
150 La papelería s.a.
160 Librería Técnica s.l.
200 María García Acosta
210 José Martín Rubio
VENTAS
1 2.500 2/1/03 100
2 5.000 10/1/03 150
3 9.500 5/01/03 160
4 2.350 12/01/03 200
5 3.750 15/01/03 210
6 1.250 18/01/03 150
7 3.500 4/01/03 160
8 7.500 4/01/03 210
9 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 sería:
Select Id_cliente,Descrip_Cliente, (select MAX(FECHA_VENTA) from VENTAS where
cli_id_cliente=id_cliente)
From clientes.
- 136 -
Este mismo resultado se podría 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 cláusula Having
Hemos dicho que la cláusula HAVING se aplica a las condiciones que afectan a funciones de
agrupamiento (SUM, MAX, COUNT,.....).
Una consulta muy típica es aquella que deseamos que nos muestre “el artículo más vendido y en qué
cuantía” o “el cliente que más nos ha comprado y qué cantidad”.
- 137 -
Basándonos en los datos de las tablas CLIENTES y VENTAS, para obtener el cliente que más compras
ha realizado, sería 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 dónde una columna “foreing key” puede tomar
el valor nulo o el valor de la columna “primery key” de una fila o registro de la misma tabla.
Por ejemplo: supongamos una tabla que almacena la información de los menús de una aplicación
informática:
- 138 -
MENU
ID_MENU DESCRIPCION ID_PADRE
1 ARCHIVO
2 Salir 1
3 NAVEGADOR
4 Refrescar 3
5 Buscar 3
Si deseamos saber cuantos submenús 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 sería:
- 139 -
7.6. CONSULTAS CON LA FUNCIÓN DECODE La función DECODE es equivalente a la instrucción de bifurcación IF-THEN-ELSE. Su sintaxis es: DECODE(expresion, valor_a_comparar1, valor1, valor_a_comparar2, valor2,.............,valorfinal)
La expresión 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, sería:
select decode(job,'ANALYST','Analista de cuentas',job) from emp;
- 140 -
RECUERDE
- La cláusula HAVING es como una cláusula WHERE, pero se aplica a las columnas de
agrupación.
- Podemos usar en las consultas los operadores de conjunto.
- Una consulta puede formar parte de otra consulta.
- 141 -
8.1. DEFINICIÓN DE PL/SQL _______________________________________ 143
8.2. PARTES DE UN PROGRAMA PL/SQL ____________________________ 144
8.2.1. Bloques _______________________________________________ 144
8.2.2. Variables y Constantes ____________________________________ 145
8.2.3. Instrucciones o Estructuras de Control ________________________ 154
8.2.4. Tratamientos de Errores (Exception)__________________________ 156
Tema 8 PL/SQL
- 143 -
8.1. DEFINICIÓN DE PL/SQL
Podemos definir PL/SQL (Procedural Language/Structured Query Language) como un lenguaje de
programación utilizado para acceder a la información existente en una B.D. relacional.
La gran ventaja de PL/SQL es que incluye las características de un lenguaje de 3GL y 4GL, es decir,
tercera y cuarta generación. Por lo que podemos usar instrucciones del tipo INSERT, DELETE, UPDATE,
etc. propias de los lenguajes de 4GL, dónde se dice lo que queremos hacer pero no se detalla cómo
hacerlo. Al mismo tiempo, con PL/SQL podemos usar las características de los lenguajes de 3GL cómo:
• Declaraciones de variables.
• Instrucciones de bifurcación, repetición.
• Declaraciones de procedimientos, funciones, etc.
Ejemplo de código PL/SQL:
DECLARE
vi_password NUMBER := 12525;
vi_nombre VARCHAR2(10) := ‘Juan’;
vi_apellido1 VARCHAR2(10) :=’García’;
vi_apellido2 VARCHAR2(10) :=’Martín’;
BEGÍN
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 generación.
- 144 -
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 dónde declaramos las variables internas, cursores,
procedimientos y funciones locales del bloque. */
BEGIN
/* Bloque principal o ejecutable.- Dónde desarrollamos la ejecución 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 sección 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:
BEGÍN
-- Bloque ejecutable
END;
- 145 -
Ejemplo 2:
DECLARE
-- Bloque declarativo
BEGÍN
-- 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 información que interactuará con la B.D. Las
constantes son un tipo de variable cuyo valor es invariable.
Ambas se declaran en la sección “DECLARE” de un bloque PL/SQL.
Su sintaxis es:
nombre_variable [CONSTANT] tipo_de_dato [ [NOT NULL] {DEFAULT || :=} expresión ] ;
Los tipos de datos son:
- 146 -
BINARY_INTEGER Valores enteros entre:
–2.147.483.647 y 2.147.483.647
Si su valor es desbordado no se produce error.
Esto no ocurre en Oracle 9i.
NUMBER Valores fijos o de coma flotante desde 1-130 a 10125
PLS_INTEGER Valores enteros entre:
–2.147.483.647 y 2.147.483.647
Si su valor es desbordado produce el error:
ORA-1426: numeric overflow
CHAR Almacena cadena de caracteres de longitud fija:
32.767 bytes. Un CHAR de un campo o columna de
la B.D. sólo admite 2.000 byte.
VARCHAR2 Puede contener cadena de caracteres de longitud
variable hasta 32.767 bytes. Un VARCHAR2 de un
campo o columna de la B.D. sólo admite 4000
caracteres.
DATE Guarda valores relacionados con fechas, horas,
minutos y segundos.
BOOLEAN TRUE, FALSE
ROWID Dirección física de una fila de la tabla.
UROWID Dirección física de una fila de la tabla particionada.
CLOB Almacena caracteres de GRAN TAMAÑO, hasta 4
GBytes.
BLOB Almacena objetos binarios de GRAN TAMAÑO,
hasta 4 GBytes.
BFILE Archivo binario externo, siendo el S.O. quien
determina el Tamaño. Su acceso es de sólo lectura.
Su información no es gestionada por Oracle, sino
por el S.O. por lo que no están sujetos a
transacciones.
- 147 -
Tipos de Datos Especiales:
RECORD
TABLE
VARRAY
REF_CURSOR
RECORD
Es un tipo de dato definido por el usuario que engloba a más de un tipo de dato simple.
Ejemplo 1:
-- Declaramos el tipo.
TYPE reg_cliente IS RECORD
(
id_cliente NUMBER(5),
Descripcion VARCHAR2(30)
);
-- Declaramos una variable del tipo anterior.
vi_registro reg_cliente;
Ejemplo 2:
TYPE reg_fecha_hora IS RECORD
(
dia number(2),
mes numer(2),
anyo number(4),
hora number(2),
minuto number(2)
);
-- Declaramos una variable del tipo anterior.
vi_datos reg_fecha_hora;
- 148 -
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),
- 149 -
Descripcion VARCHAR2(30)
);
vi_registro reg_cliente;
BEGIN
select id_cliente,descrip_cliente INTO vi_registro from clientes where id_cliente=200;
dbms_output.put_line(vi_registro.id_cliente);
dbms_output.put_line(vi_registro.descripcion);
END;
Usando el operador %ROWTYPE, tendríamos:
- 150 -
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 números –
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 después una variable de ese tipo.
Para declarar el TIPO sería:
TYPE nombre_tabla IS TABLE OF tipo_dato INDEX BY BINARY_INTEGER;
Después necesitaremos una Variable de ese tipo:
vi_matriz nombre_tabla;
El “tipo_dato” es un tipo de dato básico. Podemos especificar también 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 asignárselo a la matriz es:
nombre_variable_tipo_matriz (indice);
Para el ejemplo sería:
vi_matriz_fecha(1):=sysdate;
- 151 -
También se pueden crear Matrices de Registros:
TYPE matriz_cliente IS TABLE OF clientes.%ROWTYPE INDEX BY BINARY_INTEGER;
vi_matriz_cliente matriz_cliente;
Para referenciar los datos sería:
vi_matriz_cliente(indice).descrip_cliente;
Ejemplo:
Vamos a almacenar en una tabla llamada vi_matriz_cliente en el índice 160 el registro correspondiente al
cliente 160.
Oracle nos permite hacer uso de una serie de ATRIBUTOS de una matriz mediante el nombre de la
variable matriz y el nombre del atributo, es decir: vi_matriz_cliente.COUNT
Estos atributos son los siguientes:
COUNT Devuelve el número 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 -
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 están
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 programación,
dónde el índice comienza en 1 y se especifica en su declaración el índice límite.
Su sintaxis es:
TYPE nombre_del_array IS VARRAY(tamaño_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.
- 153 -
Ejemplo de VARRAY:
REF CURSOR
Este tipo de dato nos permite definir variables de tipo cursor. Serán tratadas en el tema correspondiente a
los cursores.
El AMBITO de una variable está sujeto al módulo DECLARE existente por encima de un bloque de
código BEGIN-END. Por ejemplo:
DECLARE
Variable1 NUMBER(10);
BEGIN
DECLARE
Variable2 VARCHAR2(50);
BEGIN
/* AMBITO de Variable2 */
END;
END;
- 154 -
8.2.3. Instrucciones o Estructuras de Control
Las instrucciones o estructuras de control de PL/SQL son las típicas de todo lenguaje de programación,
es decir las instrucciones de BIFURCACION y los BUCLES.
Bifurcación.
La sintaxis de la instrucción de bifurcación es:
IF expresión THEN
Sentencias;
[ELSIF expresión THEN
secuencias;] ........
[ELSE
sentencias;] END IF;
Ejemplo:
Partiendo de los datos de la tabla
VENTAS existentes en la imagen
gráfica, 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 -
El resultado sería:
Bucles
Un bucle permite ejecutar una sentencia o conjunto de sentencias, un número determinado de veces.
Bucles LOOP
Su sintaxis es:
LOOP
Sentencias;
EXIT WHEN condición;
END LOOP;
Este bucle finalizará cuando la condición sea verdadera. La instrucción EXIT WHEN condición; es
equivalente a usar
IF condicion THEN
EXIT;
END IF;
- 156 -
Bucles WHILE
Su sintaxis es:
WHILE condicion LOOP
Sentencias;
END LOOP;
Este bucle finalizará cuando la condición 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 números
pares desde el 2 al 10000.
DECLARE
vi_valor NUMBER(5) := 0;
BEGIN
FOR vi_contador IN 1..5 LOOP
vi_valor := vi_valor + 2;
insert into PARES values(vi_valor);
END LOOP;
END;
8.2.4. Tratamientos de Errores (Exception)
La forma en la que Oracle gestiona los errores es mediante las excepciones y los gestores de
excepciones.
- 157 -
Los TIPOS de ERRORES en un programa PL/SQL pueden ser:
Errores de Compilación.- Son tratados al compilar el programa PL/SQL y se actúa sobre ellos de forma
interactiva.
Errores de Ejecución.- Son tratados por los gestores de excepciones y se actúa sobre ellos
programando su resultado. Cuando se produce un error salta una excepción la cual es tomada por el
gestor de excepciones, consiguiendo de esta forma separar la lógica de nuestra aplicación del tratamiento
de errores.
EJEMPLO:
DECLARE
vi_valorA NUMBER(2) := 0;
vi_valorB NUMBER(2) := 12;
BEGIN
vi_valorB := vi_valorB / vi_valorA;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error al dividir por cero.');
END;
Las EXCEPCIONES las podemos dividir en dos tipos:
• Excepciones definidas por el programador.
• Excepciones predefinidas en Oracle.
a) Excepciones definidas por el programador
Son aquellas que crea el programador para su propio control de errores. Se declaran en el bloque
DECLARE del código 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_excepción;”, pasando el control del código PL/SQL al módulo EXCEPTION.
- 158 -
b) Excepciones predefinidas en Oracle
Son una serie de excepciones de errores comunes que Oracle ha predefinido para que puedan ser
tratadas en los códigos PL/SQL.
Algunas de ellas son:
ORA-0001 DUP_VAL_ON_INDEX Se incumple una restricción UNIQUE o PRIMERY KEY.
ORA-1001 INVALID_CURSOR Operación incorrecta con un CURSOR.
ORA-1012 NOT_LOGGED_ON Sin conexión con Oracle.
ORA-1017 LOGIN_DENIED Login o password incorrectos.
ORA-1403 NO_DATA_FOUND Ningún dato encontrado.
ORA-1422 TOO_MANY_ROOMS Select....INTO... con más de una fila.
ORA-1476 ZERO_DIVIDE Se intenta dividir por cero.
ORA-1722 INVALID_NUMBER Fallo al convertir a un número.
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 conversión, truncamiento o aritmético.
ORA-6511 CURSOR_ALREADY_OPEN Se ha intentado abrir un cursor que está abierto.
Estas no tienen por que ser llamadas con la sentencia RAISE.
Dentro del módulo o bloque EXCEPTION podemos controlar más de una EXCEPTION bien separándolas
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;
- 159 -
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 línea RAISE vi_error
Oracle nos proporciona dos funciones PREDEFINIDAS llamadas SQLCODE y SQLERRM las cuales nos
proporcionan el número del error (number) producido y el mensaje de error (longitud máxima 512
caracteres). Estas funciones predefinidas son muy útiles para la EXCEPTION others.
Si lo aplicamos al ejemplo anterior tendríamos:
- 160 -
Podemos usar la función predefinida RAISE_APPLICATION_ERROR para crear nuestros propios
mensajes de error.
Ejemplo:
- 161 -
Si se usa un solo módulo de EXCEPTION, podemos encontrarnos con problemas de localización 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
- Usamos PL/SQL para realizar programas que nos permitan obtener y manipular la información
almacenada en una B.D.
- Un programa PL/SQL se compone de tres bloques: Declaración, Ejecución y Excepción.
- Los tratamientos de errores pueden ser personalizados por el usuario o usar los predefinidos
por Oracle.
- 163 -
9.1. INTRODUCCIÓN _____________________________________________ 165
9.2. PROCEDIMIENTOS___________________________________________ 166
9.3. FUNCIONES ________________________________________________ 170
9.4. VISTAS RELACIONADAS CON LOS PROCEDIMIENTOS Y FUNCIONES _ 172
9.5. PAQUETES_________________________________________________ 174
9.6. DISPARADORES ____________________________________________ 176
9.7. DISPARADORES O TRIGGER MUTANTES ________________________ 178
Tema 9FUNCIONES,
PROCEDIMIENTOS, PAQUETES Y
DISPARADORES
- 165 -
9.1. INTRODUCIÓN Los programas PL/SQL vistos anteriormente son bloques anónimos, 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 ejecución
sin necesidad de que Oracle pierda tiempo en volver a compilar.
- 166 -
9.2. PROCEDIMIENTOS
Para crear un procedimiento podemos hacerlo desde la herramienta gráfica “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 }
<< Declaración de variables LOCALES >>
- 167 -
BEGIN
<< Cuerpo del Procedimiento >>
EXCEPTION
<< Tratamiento de la excepciones >>
END [nombre_procedimiento];
Consideraciones:
1.- Si no se usa la cláusula 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 serán
usados dentro del propio código 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 = Sólo LECTURA
§ OUT = Sólo ESCRITURA
§ IN OUT = Lectura / Escritura
4.- Un procedimiento es una orden DDL, por lo que lleva de forma implícita un COMMIT.
5.- Un procedimiento puede ser llamado desde un módulo PL/SQL anónimo o desde otro
procedimiento, usando tan solo el nombre del procedimiento.
6.- En la declaración del procedimiento es INCORRECTO restringir el argumento con el tipo.
Es decir:
CREATE PROCEDURE calcular ( valor1 NUMBER(3,2), nombre VARCHAR2(30) ) AS
nos daría un ERROR.
Debemos hacerlo:
CREATE PROCEDURE calcular ( valor1 NUMBER, nombre VARCHAR2 ) AS
Por lo que las restricciones de los parámetros o argumentos existentes en la cabecera de un
procedimiento, vendrán determinadas por los parámetros de la aplicación que llama al procedimiento,
conocidos con el nombre de parámetros reales.
- 168 -
Ejemplo:
Declare
Variable_1 NUMBER (5,2);
Variable_2 VARCHAR2(10);
/* Variable_1 y Variable_1 son parámetros 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 parámetro puede ser inicializado en la cabecera del procedimiento siguiendo la siguiente
sintaxis:
nombre_parámetro [ IN || IN OUT ] tipo { := | DEFAULT } valor_de_inicilaizacion
Ejemplo:
Partiendo de la tabla CLIENTES cuya estructura es:
ID_CLIENTE NOT NULL NUMBER(3)
DESCRIP_CLIENTE NOT NULL VARCHAR2(30)
Crear un procedimiento llamado insertar_clientes que nos inserte un cliente dado:
- 169 -
Podemos observar cómo se ha creado un objeto procedimiento en la B.D.:
Para ver ejecutar el procedimiento anteriormente creado sólo tendremos que hacer:
Para BORRAR un procedimiento, sólo tendremos de ejecutar la orden:
DROP PROCEDURE nombre_procedimiento;
- 170 -
9.3. FUNCIONES
Son muy parecidas a los procedimientos, reciben argumentos, tienen apartados de declaración, de
ejecución y control de excepciones.
LA DIFERENCIA es que la función siempre devuelve un valor “TEORICAMENTE” y éste es devuelto en el
nombre de la propia función. Una función puede devolver más de un valor si usamos los parámetros o
argumentos OUT, aunque se recomienda por “ética” que si devuelve más de un valor se use el
procedimiento.
Su sintaxis es:
CREATE [OR REPLACE] FUNCTION nombre_funcion
[(argumento [ { IN || OUT || IN OUT } ] tipo,
....
argumento [ { IN || OUT || IN OUT } ] tipo,) ] RETURN tipo_de_dato_de_retorno { IS || AS }
<< Declaración de variables LOCALES >>
BEGIN
<< Cuerpo del Procedimiento >>
RETURN expresion;
EXCEPTION
<< Tratamiento de la excepciones >>
END [nombre_funcion];
Ejemplo:
Crear una función que nos devuelva el número total de clientes existentes en nuestra tabla CLIENTES
CREATE FUNCTION numero_clientes
RETURN number
as
vi_num_clientes NUMBER;
- 171 -
BEGIN
Select count(*) into vi_num_clientes from clientes;
RETURN vi_num_clientes;
END numero_clientes;
Podemos observar cómo la función es un objeto dentro de la B.D.
- 172 -
Para hacer uso de la función creada, sólo con llamarla en un código PL/SQL nos valdría.
Para BORRAR una función, sólo 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 información 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
- 173 -
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 información cómo: Nombre del Objeto, Fecha de Creación, Fecha de última
modificación, estado actual, etc.
user_source.- Contiene el código fuente del procedimiento o de la función. Es decir, dicha vista está
constituida por las columnas:
NAME VARCHAR2(30)
TYPE VARCHAR2(12)
LINE NUMBER
TEXT VARCHAR2(4000)
Ejemplo:
- 174 -
user_errors.- Contiene la información de los mensajes de error en la compilación de un procedimiento o
función.
NAME NOT NULL VARCHAR2(30)
TYPE VARCHAR2(12)
SEQUENCE NOT NULL NUMBER
LINE NOT NULL NUMBER
POSITION NOT NULL NUMBER
TEXT NOT NULL VARCHAR2(4000)
9.5. PAQUETES
Un paquete es una estructura PL/SQL que nos permite almacenar sentencias SQL y programas PL/SQL.
En un paquete se diferencian dos partes:
Cabecera del Paquete.
Cuerpo del paquete.
- 175 -
Cabecera del Paquete
Contiene información declarativa sobre el contenido del paquete. Nunca debe contener el código PL/SQL
del cuerpo de una función o procedimiento.
Su sintaxis es:
CREATE [OR REPLACE] PACKAGE nombre_paquete
{ IS || AS}
[ Cabecera de PROCEDIMIENTO..]
[ Cabecera de FUNCION..]
[ Declaraciones de variable..]
[ Definición de tipo..]
[ Declaración de Excepción..]
[ Declaración_de_cursor;..]
END [nombre_paquete];
Cuerpo del paquete
Contiene el código de los elementos que forman el paquete, es decir, el código de la función,
procedimiento, etc.
Los elementos del cuerpo de un paquete NUNCA podrán ser compilados si no existe la declaración 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.
<<Código PL/SQL de los elementos del paquete>>
END [nombre_paquete];
- 176 -
Tanto la cabecera como el cuerpo son almacenados por Oracle en el Diccionario de Datos como objetos
diferentes.
IMPORTANTE
Todo elemento del paquete (Procedimiento, función,...) puede ser referenciado como se muestra a
continuación:
Nombre_paquete.elemto_del_paquete
9.6. DISPARADORES Los disparadores mas comúnmente 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 operación 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 acción del disparador, puede ser:
1.- Especificado a cada fila de la tabla, ejecutándose el cuerpo_disparo por cada fila afectada
cuando la condicion_disparo es verdadera.
2.- Especificado a toda la TABLA (conocido también como a nivel orden), es decir el
cuerpo_disparo se ejecuta cuando se realiza un insert, update o delete sobre referencia_tabla.
- 177 -
Por tanto, en total podremos realizan 12 acciones distintas:
I = Insert ; U=Update, D=Delete
B= Before, A= After
O= Orden, F=Fila
I , B, O U , B, O D , B, O
I , B, F U , B, F D , B, F
I , A, O U , A, O D , A, O
I , A, F U , A, F D , A, F
El disparador o trigger se ejecuta al ejecutarse una orden DLL, siendo el proceso a seguir el siguiente:
1.- Si existe, ejecutar el disparador de tipo BEFORE (antes) con NIVEL DE ORDEN.
2.- Para cada fila implicada en la orden:
2.1.- Si existe, ejecutar por cada fila el disparador BEFORE.
2.2.- Si existe, ejecutar por cada fila el disparador AFTER.
3.- Si existe, ejecutar el disparador de tipo AFTER (después) 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, sólo 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 según 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
- 178 -
Oracle nos permite programar un trigger o disparador hacia una tabla sobre la cual se vaya a realizar más
de una operación DML (insert, update y delete). Para distinguir qué acción 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 ]
También 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 información 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 código del cuerpo de un trigger, pueda
actuar o no sobre una tabla. Podemos distinguir:
TABLAS MUTANTES
TABLAS de RESTRICCION.
TABLAS MUTANTES.- Son aquellas sobre las que actúa una orden DML y la acción del TRIGGER
actúa sobre ellas. Por lo que las sentencias o instrucciones del cuerpo del disparador NO PODRAN leer o
modificar de dicha tabla.
- 179 -
Si el INSERT hacia una tabla sólo afecta a una fila, los trigger tanto del tipo BEFORE como AFTER no
darán 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, ningún 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 ningún 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, sólo 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 más de 6 empleados por departamento.
Estructura Tabla EMP:
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
Estructura Tabla DEPT:
DEPTNO NOT NULL NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)
Si ejecutamos la sentencia:
select count(*),deptno from emp group by deptno;
Tendremos:
- 180 -
Partiendo de esos datos realizaremos y comprobaremos el trigger.
- 181 -
Si intentamos actualizar el número del departamento para el empleado número 7369 al departamento 10,
Oracle nos informa de que la tabla está mutando.
- 182 -
RECUERDE
- Debemos utilizar los procedimientos y funciones para hacer que un programa PL/SQL no sea
anónimo.
- Las agrupaciones de procedimientos y funciones se llevarán a cabo con los paquetes.
- Las características de los procedimientos, funciones y paquetes las podemos visualizar mediante
las vistas del diccionario de datos o mediante la herramienta gráfica.
- Los TRIGGER van asociados a una acción INSERT,UPDATE o DELETE de una tabla.
- 183 -
10.1. TIPOS DE CURSORES _______________________________________ 185
10.2. ATRIBUTOS DE CURSORES __________________________________ 186
10.3. RECORRIDO DE CURSORES__________________________________ 188
10.4. BLOQUEOS CON EXCLUSIVIDAD ______________________________ 189
10.5. VARIABLES DE CURSOR_____________________________________ 190
Tema 10 CURSORES
- 185 -
10.1. TIPOS DE CURSORES
Un cursor es una referencia a una fila o conjunto de filas devueltas por una consulta a tablas de la B.D.
Diferenciamos dos tipos de cursores:
• Cursores Explícitos
• Cursores Implícitos
Cursores Explícitos
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. Declaración del cursor.- Se lleva a cabo en el apartado DECLARE de un programa PL/SQL,
además de asignarle la orden SELECT que devuelve las filas a procesar.
Su sintaxis:
CURSOR nombre_cursor IS SELECT ........;
Sólo 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.
- 186 -
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 implícita una orden CLOSE
del cursor. También podemos tener más 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 también:
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 número de variables existentes tiene que coincidir con el mismo
número 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 Implícitos
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 automática.
A este cursor se le conoce como cursor SQL.
10.2. ATRIBUTOS DE CURSORES Van asociados al nombre del cursor y devuelven un valor que puede ser procesado en instrucciones de
bifurcación o bucles.
Estos son:
%FOUND
Devuelve TRUE si la instrucción FETCH ha leído una fila o FALSE si no la ha leído.
- 187 -
%NOTFOUND
Actúa de forma inversa a %FOUND, es decir, devuelve TRUE si la instrucción FETCH NO ha leído una
fila y FALSE si la ha leído.
%ISOPEN
Nos informa si el cursor está abierto, devolviendo TRUE. Si no lo está, devuelve FALSE.
%ROWCOUNT
Nos informa del número de filas referenciadas por el cursor.
Estos atributos podemos aplicarlos tanto a los cursores explícitos como implícitos.
Ejemplo aplicado a CURSORES implícitos.
Se desea actualizar una fila de una tabla CLIENTES, si éste no existe, se insertará un nuevo registro.
Otra forma de programar este módulo PL/SQL es haciendo uso de una EXCEPTION de errores.
- 188 -
10.3. RECORRIDO DE CURSORES
Para recorrer toda la información referenciada por un cursor, podemos usar diferentes modalidades de
bucles. Distinguimos:
Bucles LOOP ..... END LOOP
La sintaxis para recorrer todos los registros de una tabla llamada CLIENTES:
DECLARE vi_registro CLIENTES%ROWTYPE; CURSOR c_cliente IS SELECT * FROM clientes;
BEGIN OPEN c_cliente; DBMS_OUTPUT.PUT_LINE( 'Datos de los Cliente'); LOOP FETCH c_cliente INTO vi_registro; EXIT WHEN c_cliente%NOTFOUND; DBMS_OUTPUT.PUT_LINE( vi_registro. descrip_cliente ); END LOOP; CLOSE c_cliente; COMMIT; END;
Bucles WHILE
El ejemplo anterior pero usando WHILE ..... END LOOP.
DECLARE
vi_registro CLIENTES%ROWTYPE; CURSOR c_cliente IS SELECT * FROM clientes;
BEGIN OPEN c_cliente; DBMS_OUTPUT.PUT_LINE( 'Datos de los Cliente');
FETCH c_cliente INTO vi_registro; WHILE c_cliente %FOUND LOOP DBMS_OUTPUT.PUT_LINE( vi_registro. descrip_cliente );
FETCH c_cliente INTO vi_registro; END LOOP; CLOSE c_cliente; COMMIT; END;
- 189 -
Bucles FOR
Este tipo de bucle ejecuta una orden OPEN, FETCH y CLOSE de forma implícita. El ejemplo anterior
quedaría:
10.4. BLOQUEOS CON EXCLUSIVIDAD
Cuando abrimos un cursor (OPEN) Oracle, toma una instancia de las tablas o conjuntos de tablas
especificadas en el select del cursor. Si otra sesión cambia o modifica los valores de esas tablas
incluyendo la confirmación de los cambios (commit), el cursor anteriormente abierto, no tiene consistencia
sobre los datos leídos, para ello se necesitaría volver a abrir el cursor.
- 190 -
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 sesión tuviese las filas bloqueadas en exclusividad, entonces la sentencia SELECT....FOR
UPDATE....esperaría hasta que se libere la exclusividad. Si se desea NO tener ese proceso en espera,
podemos usar la cláusula NOWAIT, por lo que la sentencia OPEN del cursor no se llevaría a cabo,
devolviendo Oracle un mensaje de error.
Además de usar FOR UPDATE, en la sentencia UPDATE o DELETE debemos usar la cláusula, WHERE
CURRENT OF nombre_cursor.
10.5. VARIABLES DE CURSOR
Las variables de cursor, nos permiten DEVOLVER cursores creados en tiempo de ejecución en
subprogramas PL/SQL para su procesamiento en aplicaciones externas.
Para declarar una variable cursor, primero tenemos que definir un tipo:
TYPE tipo_variable_cursor IS REF CURSOR [RETURN tipo_retorno_registro]; tipo_retorno_registro.- Es un tipo nombre_table%ROWTYPE, o bien una variable registro definida antes
del tipo.
Una vez declarado el tipo, tendremos que declarar una variable de ese tipo definido.
Ejemplos:
DECLARE
TYPE tipo_registro IS RECORD
( id_cliente CLIENTES.id_cliente%TYPE,
datos_cliente CLIENTES .descrip_cliente%TYPE);
- 191 -
TYPE tipo_ref_cursor IS REF CURSOR RETURN tipo_registro;
variable_cursor tipo_ref_cursor;
La declaración anterior, nos sirve para especificar una variable cursor con un número de columnas
específica. Si se deseasen todas las columnas de la fila sería:
TYPE tipo_ref_cursor IS REF CURSOR;
variable_cursor tipo_ref_cursor;
Una vez declarada, necesitamos abrirla para su manipulación. Para ello usaremos:
OPEN variable_cursor FOR sentencia_SELECT;
Para leer los valores de la variable cursor, usaremos orden:
FETCH nombre_variable_cursor INTO variable_interna1, variable_interna2,....
Al igual que un cursor, la variables cursor también deben ser cerradas, con la sentencia
CLOSE nombre_variable_cursor;
Ejemplo.
Crearemos un procedimiento llamado mostrar_datos que usando una variable cursor, me muestre los
datos de la tabla CLIENTES.
CREATE OR REPLACE PROCEDURE mostrar_datos
AS
TYPE tipo_cursor IS REF CURSOR;
variable_cursor tipo_cursor;
vi_id_cliente NUMBER;
vi_descripcion VARCHAR2(30);
BEGIN
- 192 -
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:
- 193 -
RECUERDE
- Los cursores son referencias a filas de datos, requiriendo ser declarados, abiertos, leídos y
cerrado si son del tipo explícito.
- Los atributos de cursores nos permiten obtener información de los cursores para su
procesamiento.
- Las variables de cursor nos permiten un empleo más generalizado de los cursores.
- 195 -
11.1. DEFINICIÓN _______________________________________________ 197
11.2. CARACTERÍTICAS DE LOS ÍNDICES ___________________________ 198
11.3. REGLAS A LA HORA DE CREAR UN ÍNDICE _____________________ 199
11.4. TIPOS DE ÍNDICES __________________________________________ 201
11.4.1. Índices de Tablas, Arbol-B, B-Tree o Normal _________________ 201
11.4.2. Índices de Mapas de Bits ________________________________ 201
11.4.3. Índices basados en una función___________________________ 203
11.4.4. Índices de Clave Inversa ________________________________ 203
11.4.5. Cluster o Agrupamiento _________________________________ 204
11.5. CREACIÓN DE ÍNDICES ______________________________________ 205
Tema 11 ÍNDICES
- 197 -
11.1. DEFINICIÓN
Los índices se aplican a columnas de una tabla, pudiendo estar constituidos por una o más columnas de
la tabla. Su funcionalidad es localizar la información a buscar lo más rápidamente posible y con el menor
número 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
gestión, lo cual hace que baje el rendimiento en lugar de aumentarlo. Los índices sólo pertenecen a una
tabla.
A continuación, 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, tendríamos un buffer de
lectura de:
Tamaño de columna: 30
Nº de columnas recuperadas: 26
Filas extraídas: 5
TOTAL BUFFER = 30 x 26 x 5 = 3900 caracteres.
Si en lugar de ser 5 filas fuesen 50.000 filas, tendríamos 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 variación en ese campo, también se lleva a cabo en el objeto índice creado.
Si ahora deseamos consultar la información 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, obtendríamos una lectura de 130 filas extraídas.
(Total Buffer / Tamaño Columna * Nº de columnas recuperadas = Filas Extraidas )
- 198 -
11.2. CARACTERÍTICAS DE LOS ÍNDICES
Cuando se insertan datos en una tabla, no se sigue ningún 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
información de dicho índice bien sea éste de tipo carácter, numérico 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 señalar que los índices pueden ser unívocos o no unívocos. 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 característica 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 jamás podrá crear el índice.
Si se elimina el índice asociado a una o más 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 más 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 deberíamos indexar ambos campos. A estos índices se les denomina
índices concatenados o índices compuestos.
Oracle crea de forma automática índices para las columnas clave o Primary Key. También para las
columnas sobre las cuales se aplique una restricción UNIQUE.
- 199 -
11.3. REGLAS A LA HORA DE CREAR UN ÍNDICE
A.- Debemos indexar las columnas que formen parte del predicado de una instrucción 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 idénticos 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 múltiples columnas en el predicado de una instrucción
SQL, debemos crear un índice concatenado o compuesto por esas columnas.
D.- A la hora de crear un índice, se aconseja y recomienda que éste se cree en un tablespaces distinto al
Tablespace de Datos o Default, al igual que se recomienda que estos tablespaces estén físicamente en
distintos discos duros.
- 200 -
Ya hemos comentado que Oracle crea automáticamente í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 instrucción SQL o mediante la herramienta gráfica.
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 gráfica, entramos en la pestaña “Almacenamiento de Restricciones”:
Las consultas de datos a través de los campos o campo que formen la PRIMERY KEY son mucho más
rápidas 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.
- 201 -
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 ubicación física 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 organización se
basa en la filosofía del Arbol-B, la cual consiste en una estructura compuesta de nodos y ramas,
manteniéndose ordenada para reducir la búsqueda.
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 restricción 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 creación 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 volúmenes de
datos con columnas cuyos valores varían muy poco.
En lugar de almacenar los valores claves, se almacenan mapas de bits.
Cada mapa de bits es un conjunto de bit (unos y ceros), que serán 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
tendríamos:
- 202 -
Select rownum, c3 from tabla;
ROWNUM C3 1 Informático 2 Abogado 3 Arquitecto 4 Abogado 5 Pedagogo 6 Informático 7 Abogado 8 Arquitecto 9 Informático 10 Arquitecto 11 Pedagogo 12 Abogado 13 Informático 14 Pedagogo 15 Arquitecto
Si hacemos una consulta ordenada por C3 y Rownum tendríamos:
ROWNUM C3 2 Abogado 4 Abogado 7 Abogado 12 Abogado 3 Arquitecto 8 Arquitecto 10 Arquitecto 15 Arquitecto 1 Informático 6 Informático 9 Informático 13 Informático 5 Pedagogo 11 Pedagogo 14 Pedagogo
Así pues, el objeto índice almacenaría en lugar del rownum el RowId y los valores de C3.
Si observamos el ejemplo, el campo C3 sólo posee 4 valores distintos. Si se crea un índice de mapa de
bit (Bitmap), en el cual cada mapa de bit almacena información de 12 filas de la tabla, obtendríamos lo
siguiente:
- 203 -
ROWNUM C3 rownumINICIAL rownumFINAL Bitmap
2,4,7,12 Abogado 1 12 0101.0010.0001
3,8,10 Arquitecto 1 12 0010.0001.0100
15 Arquitecto 13 24 0010.0000.0000
1,6,9 Informático 1 12 1000.0100.1000
16 Informático 13 24 0001.0000.0000
5,11 Pedagogo 1 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 más
valores diferentes existan, mayor será el tamaño del objeto índice y mayor tiempo para poder ser
gestionado.
11.4.3. Índices basados en una función
Son índices basados en expresiones creadas por el usuario aplicadas a las columnas de la tabla.
El índice almacena el resultado de la expresión y el RowID de la fila.
Así pues, su creación se recomienda para aquellas operaciones de consulta y borrado que usan
frecuentemente la misma expresión en la cláusula WHERE.
La expresión puede tener las siguientes características:
• Estar formada por operadores aritméticos.
• Funciones predefinidas (Concat, Lower, Upper, Rtrim, Ltrim,etc.) salvo las de agrupamiento
(Sum, Avg, Max, Min......).
• Una función creada por el usuario como objeto PL/SQL de tipo pública.
Por ejemplo: Si al consultar un campo o columna denominada “apellidos” de una tabla, en la cláusula
“where” siempre hacemos uso de UPPER (apellidos), podemos crea un índice de función 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”.
- 204 -
11.4.5. Cluster o Agrupamiento Oracle, nos permite almacenar físicamente 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 número de E/S a disco. Los cluster de datos es una alternativa a la indexación.
Las columnas relacionadas de las tablas se denominan clave de cluster.
Oracle nos proporciona dos tipos distintos de cluster:
a)Cluster de datos indexados.
b)Cluster de datos hash.
a) Cluster de datos indexados
En este tipo, Oracle almacena físicamente una fila en el cluster por cada valor de la clave de cluster.
Dicha clave de cluster se indexa utilizando un índice de cluster almacenándose sólo una vez su valor
para las distintas tablas del cluster.
Ejemplo:
Tabla Pedidos = { ID_Pedido, Fecha_Pedido, ....., ID_Articulo_FK, .....}
Tabla Articulos = { ID_Articulo, Descripcion, Cantidad,.........}
Para consultar los artículos 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 artículos incluidos en el pedido 100
Bloque de Datos 2:
ID_Pedido: 200
Todos los artículos incluidos en el pedido 200
..................
Y así sucesivamente.
- 205 -
b) Cluster de datos hash
En ellos, Oracle almacena físicamente una fila, según el resultado de aplicar una función hash al valor
clave del cluster (columnas relacionadas de las tablas) de la fila.
Además, almacena en el mismo bloque todas aquellas filas que dan el mismo resultado al aplicarles la
función 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 función hash al
criterio de selección, sabiendo perfectamente en qué bloque (grupo hash) se encuentran los datos.
Consideraciones:
- Mal funcionamiento de los cluster hash en tablas con constantes actualizaciones e
inserciones.
- Se aconseja el uso de cluster hash frente a cluster de índice.
- Mejoran el rendimiento en consultas que no incluyan rangos de filas, es decir, condiciones o
criterios de selección 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 físico. Al igual que ganamos en la selección, las inserciones,
borrados y actualizaciones pueden llegar a ser menos eficaces que en las tablas no agrupadas en cluster.
11.5. CREACIÓN 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.
- 206 -
Desde la consola o interfaz gráfica, una vez conectados, sólo tendremos que ir al apartado Esquema y
seleccionar la carpeta “Tabla” o la carpeta “Índices”. Si lo hacemos a través de la carpeta “Tabla”,
tendremos que posicionarnos en la carpeta “índice” de la tabla correspondiente.
Haciendo clic derecho y seleccionando la opción “Crear”, nos aparece la ventana de “Creación de índice”,
cuyo aspecto es el que se muestra a continuación:
- 207 -
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 dónde se almacenará el índice. Se aconseja y recomienda que
sea distinto al de datos y que físicamente esté en disco físico distinto.
Índice.- En tabla, que es la opción por defecto o en Agrupamiento (Cluster).
Esquema y Tabla.- Nombre del “Esquema” dónde se encuentra la “Tabla” para la que se crea el índice.
Alias de tabla para utilizar la expresión de columna.- Alias para la columna de expresión, que se
activa al pulsar el botón “Agregar Expresión de Columna”.
Listado de las columnas de la tabla sobre las cuales se puede aplicar el índice.
Botones de “Agregar / Borrar Expresión de Columna”.- Nos permite agregar una columna de expresión
(COLUMN EXPRESSION).
- 208 -
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
continuación:
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").
- 209 -
1.- Índice de Tabla (Arbol-B) ÚNICO sobre la columna MATRICULA.
CREATE UNIQUE INDEX "USR_PRUEBA"."INDICE1"
ON " USR_PRUEBA"."VEHICULOS" ("MATRICULA")
TABLESPACE "PRUEBA_INDEX";
Si ya existe un índice sobre la columna, Oracle nos comunica el error: “ ORA-01408: ésta lista de
columnas ya está indexada”.
2.- Índice de mapa de bit sobre la columna “COLOR”.
CREATE BITMAP INDEX "USR_PRUEBA"."INDICE2"
ON " USR_PRUEBA"."VEHICULOS" ("COLOR")
TABLESPACE "PRUEBA_INDEX";
3.- Índice de basado en función.
CREATE INDEX "USR_PRUEBA"."INDICE3"
ON " USR_PRUEBA"."VEHICULOS" columna_funcion( UPPER(COLOR))
TABLESPACE "PRUEBA_INDEX";
- 210 -
RECUERDE
- Los índices permiten un acceso más rápido a los datos.
- Oracle genera índices de forma automática para las columnas consideradas claves primarias y
únicas.
- Los índices deben ir a un tablespace distinto al default.
- 211 -
GLOSARIO A ADD DATAFILE. Cláusula que nos sirve para añadir un fichero de datos a un tablespace. AUTOEXTEND. Cláusula que nos permite especificar el crecimiento automático 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 información. BLOQUE LOGICO. Unidad lógica mínima de almacenamiento para los datos, directamente ligado al bloque físico del sistema operativo. C CAMPOS. Unidad Lógica mínima de almacenamiento de un registro de la B.D. COALESCE. Cláusula usada para realizar eliminar la desfragmentación 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. Cláusula 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 información necesaria para arrancar la B.D. Como nombre, fecha de creación, ficheros asociados, etc. FICHEROS DE DATOS. Ficheros físicos que almacenan la información 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.
- 212 -
H HAVING. Cláusula de una consulta que se aplica a los campos sobre los cuales existe una función de agrupamiento. I INITIAL. Tamaño de la extensión inicial asignada en el momento de creación del segmento. INVALID. Estado en el que puede quedar cualquier objeto de la B.D. J JAR. Extensión 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 extensión con respecto a la anterior asignada. PCTUSED. Porcentaje que determina cuando un bloque de datos es candidato para recibir inserciones. PL/SQL. Lenguaje de programación utilizado para acceder a la información 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. Ubicación en disco duro dónde se instalarán los programas de instalación de Oracle. ROWID. Identificador único por cada fila de una tabla de la B.D. S SCHEMA. Objeto de la B.D. dónde se recoge de forma lógica la estructura de un diseño relacional.
- 213 -
SEGMETOS DE DATOS. Conjunto de EXTENSIONES que almacena información de las tablas. SEGMETOS DE INDICE. Conjunto de EXTENSIONES que almacena información 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 informático 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 lógica para almacenar los datos. TABLESPACE. Estructura lógica de almacenamiento, con ficheros de datos físicos asociados a ella dónde se almacena información. TRANSACCION. Conjunto de sentencias que se ejecutan o se deshacen como un bloque hacia la B.D. TRUNCATE. Sentencia S.Q.L. que libera extensiones de datos e índices asociados a la tabla. U UNLIMITED. Cláusula que permite a un usuario a hacer uso de todo el espacio asignado a un tablespaces sin ningún tipo de restricción. USUARIOS. Persona autorizada a hacer uso de determinada información existente en la B.D.