manual_oracle 9i de eticom

216
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

Upload: ripli2014

Post on 16-Feb-2016

12 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Manual_Oracle 9i de Eticom

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

Page 2: Manual_Oracle 9i de Eticom
Page 3: Manual_Oracle 9i de Eticom

- 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

Page 4: Manual_Oracle 9i de Eticom
Page 5: Manual_Oracle 9i de Eticom

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

Page 6: Manual_Oracle 9i de Eticom

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

Page 7: Manual_Oracle 9i de Eticom

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

Page 8: Manual_Oracle 9i de Eticom

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

Page 9: Manual_Oracle 9i de Eticom

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

Page 10: Manual_Oracle 9i de Eticom

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

Page 11: Manual_Oracle 9i de Eticom

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

Page 12: Manual_Oracle 9i de Eticom

- 10 -

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

Page 13: Manual_Oracle 9i de Eticom

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

Page 14: Manual_Oracle 9i de Eticom
Page 15: Manual_Oracle 9i de Eticom

- 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

Page 16: Manual_Oracle 9i de Eticom
Page 17: Manual_Oracle 9i de Eticom

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

Page 18: Manual_Oracle 9i de Eticom

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

Page 19: Manual_Oracle 9i de Eticom

- 17 -

Page 20: Manual_Oracle 9i de Eticom

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

Page 21: Manual_Oracle 9i de Eticom

- 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

Page 22: Manual_Oracle 9i de Eticom

- 20 -

Un “Mapa de Tablespaces” proporcionado por Oracle sería:

Page 23: Manual_Oracle 9i de Eticom

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

Page 24: Manual_Oracle 9i de Eticom

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

Page 25: Manual_Oracle 9i de Eticom

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

Page 26: Manual_Oracle 9i de Eticom

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

Page 27: Manual_Oracle 9i de Eticom

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

Page 28: Manual_Oracle 9i de Eticom

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

Page 29: Manual_Oracle 9i de Eticom

- 27 -

Page 30: Manual_Oracle 9i de Eticom

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

Page 31: Manual_Oracle 9i de Eticom

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

Page 32: Manual_Oracle 9i de Eticom

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

Page 33: Manual_Oracle 9i de Eticom

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

Page 34: Manual_Oracle 9i de Eticom
Page 35: Manual_Oracle 9i de Eticom

- 33 -

3.1. DEFINICIÓN DE SQL. (STRUCTURED QUERY LANGUAGE) ____________ 35

3.2. CREACIÓN DE TABLESPACES __________________________________ 35

Tema 3 CREACIÓN DE TABLESPACES

Page 36: Manual_Oracle 9i de Eticom
Page 37: Manual_Oracle 9i de Eticom

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

Page 38: Manual_Oracle 9i de Eticom

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

Page 39: Manual_Oracle 9i de Eticom

- 37 -

Las opciones por defecto asignadas a los parámetros de almacenamiento son las siguientes:

Page 40: Manual_Oracle 9i de Eticom

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

Page 41: Manual_Oracle 9i de Eticom

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

Page 42: Manual_Oracle 9i de Eticom

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

Page 43: Manual_Oracle 9i de Eticom

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

Page 44: Manual_Oracle 9i de Eticom

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

Page 45: Manual_Oracle 9i de Eticom

- 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

Page 46: Manual_Oracle 9i de Eticom
Page 47: Manual_Oracle 9i de Eticom

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

Page 48: Manual_Oracle 9i de Eticom

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

Page 49: Manual_Oracle 9i de Eticom

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

Page 50: Manual_Oracle 9i de Eticom

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

Page 51: Manual_Oracle 9i de Eticom

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

Page 52: Manual_Oracle 9i de Eticom

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

Page 53: Manual_Oracle 9i de Eticom

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

Page 54: Manual_Oracle 9i de Eticom

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

Page 55: Manual_Oracle 9i de Eticom

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

Page 56: Manual_Oracle 9i de Eticom

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

Page 57: Manual_Oracle 9i de Eticom

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

Page 58: Manual_Oracle 9i de Eticom

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

Page 59: Manual_Oracle 9i de Eticom

- 57 -

Page 60: Manual_Oracle 9i de Eticom

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

Page 61: Manual_Oracle 9i de Eticom

- 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

Page 62: Manual_Oracle 9i de Eticom
Page 63: Manual_Oracle 9i de Eticom

- 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

Page 64: Manual_Oracle 9i de Eticom

- 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

Page 65: Manual_Oracle 9i de Eticom

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

Page 66: Manual_Oracle 9i de Eticom

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

Page 67: Manual_Oracle 9i de Eticom

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

Page 68: Manual_Oracle 9i de Eticom

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

Page 69: Manual_Oracle 9i de Eticom

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

Page 70: Manual_Oracle 9i de Eticom

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

Page 71: Manual_Oracle 9i de Eticom

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

Page 72: Manual_Oracle 9i de Eticom

- 70 -

Page 73: Manual_Oracle 9i de Eticom

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

Page 74: Manual_Oracle 9i de Eticom

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

Page 75: Manual_Oracle 9i de Eticom

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

Page 76: Manual_Oracle 9i de Eticom

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

Page 77: Manual_Oracle 9i de Eticom

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

Page 78: Manual_Oracle 9i de Eticom

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

Page 79: Manual_Oracle 9i de Eticom

- 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

Page 80: Manual_Oracle 9i de Eticom

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

Page 81: Manual_Oracle 9i de Eticom

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

Page 82: Manual_Oracle 9i de Eticom

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

Page 83: Manual_Oracle 9i de Eticom

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

Page 84: Manual_Oracle 9i de Eticom

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

Page 85: Manual_Oracle 9i de Eticom

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

Page 86: Manual_Oracle 9i de Eticom

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

Page 87: Manual_Oracle 9i de Eticom

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

Page 88: Manual_Oracle 9i de Eticom

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

Page 89: Manual_Oracle 9i de Eticom

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

Page 90: Manual_Oracle 9i de Eticom
Page 91: Manual_Oracle 9i de Eticom

- 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

Page 92: Manual_Oracle 9i de Eticom
Page 93: Manual_Oracle 9i de Eticom

- 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

Page 94: Manual_Oracle 9i de Eticom

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

Page 95: Manual_Oracle 9i de Eticom

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

Page 96: Manual_Oracle 9i de Eticom

- 94 -

Page 97: Manual_Oracle 9i de Eticom

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

Page 98: Manual_Oracle 9i de Eticom

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

Page 99: Manual_Oracle 9i de Eticom

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

Page 100: Manual_Oracle 9i de Eticom

- 98 -

Ejemplo 2:

DELETE FROM vehiculos;

Igual a:

DELETE vehiculos;

Page 101: Manual_Oracle 9i de Eticom

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

Page 102: Manual_Oracle 9i de Eticom

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

Page 103: Manual_Oracle 9i de Eticom

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

Page 104: Manual_Oracle 9i de Eticom

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

Page 105: Manual_Oracle 9i de Eticom

- 103 -

Page 106: Manual_Oracle 9i de Eticom

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

Page 107: Manual_Oracle 9i de Eticom

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

Page 108: Manual_Oracle 9i de Eticom

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

Page 109: Manual_Oracle 9i de Eticom

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

Page 110: Manual_Oracle 9i de Eticom

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

Page 111: Manual_Oracle 9i de Eticom

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

Page 112: Manual_Oracle 9i de Eticom

- 110 -

Page 113: Manual_Oracle 9i de Eticom

- 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

Page 114: Manual_Oracle 9i de Eticom

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

Page 115: Manual_Oracle 9i de Eticom

- 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

Page 116: Manual_Oracle 9i de Eticom

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

Page 117: Manual_Oracle 9i de Eticom

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

Page 118: Manual_Oracle 9i de Eticom

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

Page 119: Manual_Oracle 9i de Eticom

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

Page 120: Manual_Oracle 9i de Eticom

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

Page 121: Manual_Oracle 9i de Eticom

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

Page 122: Manual_Oracle 9i de Eticom

- 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

Page 123: Manual_Oracle 9i de Eticom

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

Page 124: Manual_Oracle 9i de Eticom
Page 125: Manual_Oracle 9i de Eticom

- 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

Page 126: Manual_Oracle 9i de Eticom
Page 127: Manual_Oracle 9i de Eticom

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

Page 128: Manual_Oracle 9i de Eticom

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

Page 129: Manual_Oracle 9i de Eticom

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

Page 130: Manual_Oracle 9i de Eticom

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

Page 131: Manual_Oracle 9i de Eticom

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

Page 132: Manual_Oracle 9i de Eticom

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

Page 133: Manual_Oracle 9i de Eticom

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

Page 134: Manual_Oracle 9i de Eticom

- 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

Page 135: Manual_Oracle 9i de Eticom

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

Page 136: Manual_Oracle 9i de Eticom

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

Page 137: Manual_Oracle 9i de Eticom

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

Page 138: Manual_Oracle 9i de Eticom

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

Page 139: Manual_Oracle 9i de Eticom

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

Page 140: Manual_Oracle 9i de Eticom

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

Page 141: Manual_Oracle 9i de Eticom

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

Page 142: Manual_Oracle 9i de Eticom

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

Page 143: Manual_Oracle 9i de Eticom

- 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

Page 144: Manual_Oracle 9i de Eticom
Page 145: Manual_Oracle 9i de Eticom

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

Page 146: Manual_Oracle 9i de Eticom

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

Page 147: Manual_Oracle 9i de Eticom

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

Page 148: Manual_Oracle 9i de Eticom

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

Page 149: Manual_Oracle 9i de Eticom

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

Page 150: Manual_Oracle 9i de Eticom

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

Page 151: Manual_Oracle 9i de Eticom

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

Page 152: Manual_Oracle 9i de Eticom

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

Page 153: Manual_Oracle 9i de Eticom

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

Page 154: Manual_Oracle 9i de Eticom

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

Page 155: Manual_Oracle 9i de Eticom

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

Page 156: Manual_Oracle 9i de Eticom

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

Page 157: Manual_Oracle 9i de Eticom

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

Page 158: Manual_Oracle 9i de Eticom

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

Page 159: Manual_Oracle 9i de Eticom

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

Page 160: Manual_Oracle 9i de Eticom

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

Page 161: Manual_Oracle 9i de Eticom

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

Page 162: Manual_Oracle 9i de Eticom

- 160 -

Podemos usar la función predefinida RAISE_APPLICATION_ERROR para crear nuestros propios

mensajes de error.

Ejemplo:

Page 163: Manual_Oracle 9i de Eticom

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

Page 164: Manual_Oracle 9i de Eticom

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

Page 165: Manual_Oracle 9i de Eticom

- 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

Page 166: Manual_Oracle 9i de Eticom
Page 167: Manual_Oracle 9i de Eticom

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

Page 168: Manual_Oracle 9i de Eticom

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

Page 169: Manual_Oracle 9i de Eticom

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

Page 170: Manual_Oracle 9i de Eticom

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

Page 171: Manual_Oracle 9i de Eticom

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

Page 172: Manual_Oracle 9i de Eticom

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

Page 173: Manual_Oracle 9i de Eticom

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

Page 174: Manual_Oracle 9i de Eticom

- 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

Page 175: Manual_Oracle 9i de Eticom

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

Page 176: Manual_Oracle 9i de Eticom

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

Page 177: Manual_Oracle 9i de Eticom

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

Page 178: Manual_Oracle 9i de Eticom

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

Page 179: Manual_Oracle 9i de Eticom

- 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

Page 180: Manual_Oracle 9i de Eticom

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

Page 181: Manual_Oracle 9i de Eticom

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

Page 182: Manual_Oracle 9i de Eticom

- 180 -

Partiendo de esos datos realizaremos y comprobaremos el trigger.

Page 183: Manual_Oracle 9i de Eticom

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

Page 184: Manual_Oracle 9i de Eticom

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

Page 185: Manual_Oracle 9i de Eticom

- 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

Page 186: Manual_Oracle 9i de Eticom
Page 187: Manual_Oracle 9i de Eticom

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

Page 188: Manual_Oracle 9i de Eticom

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

Page 189: Manual_Oracle 9i de Eticom

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

Page 190: Manual_Oracle 9i de Eticom

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

Page 191: Manual_Oracle 9i de Eticom

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

Page 192: Manual_Oracle 9i de Eticom

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

Page 193: Manual_Oracle 9i de Eticom

- 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

Page 194: Manual_Oracle 9i de Eticom

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

Page 195: Manual_Oracle 9i de Eticom

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

Page 196: Manual_Oracle 9i de Eticom
Page 197: Manual_Oracle 9i de Eticom

- 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

Page 198: Manual_Oracle 9i de Eticom
Page 199: Manual_Oracle 9i de Eticom

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

Page 200: Manual_Oracle 9i de Eticom

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

Page 201: Manual_Oracle 9i de Eticom

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

Page 202: Manual_Oracle 9i de Eticom

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

Page 203: Manual_Oracle 9i de Eticom

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

Page 204: Manual_Oracle 9i de Eticom

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

Page 205: Manual_Oracle 9i de Eticom

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

Page 206: Manual_Oracle 9i de Eticom

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

Page 207: Manual_Oracle 9i de Eticom

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

Page 208: Manual_Oracle 9i de Eticom

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

Page 209: Manual_Oracle 9i de Eticom

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

Page 210: Manual_Oracle 9i de Eticom

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

Page 211: Manual_Oracle 9i de Eticom

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

Page 212: Manual_Oracle 9i de Eticom

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

Page 213: Manual_Oracle 9i de Eticom

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

Page 214: Manual_Oracle 9i de Eticom

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

Page 215: Manual_Oracle 9i de Eticom

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

Page 216: Manual_Oracle 9i de Eticom