Sunteți pe pagina 1din 355

Introducción a Oracle 10g: SQL Fundamentals II

Base de Datos Oracle 10g:


Conceptos Fundamentales
de SQL II
Guía del Alumno • Volumen 1
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

1
Introducción a Oracle 10g: SQL Fundamentals II

Contenido

Prefacio

I Introducción
Objetivos I-2
Objetivos del Curso I-3
Visión General del Curso I-4
Aplicación del Curso 1-5
Resumen I-6

1 Control de Acceso de Usuarios


Objetivos 1-2
Control de Acceso de Usuarios 1-3
Privilegios 1-4
Privilegios del Sistema 1-5
Creación de Usuarios 1-6
Privilegios del Sistema de Usuario 1-7
B

Otorgamiento de Privilegios del Sistema 1-8


as L í

¿Qué es un Rol? 1-9


Creación y Otorgamiento de Privilegios a un Rol 1-10
Cambio de Contraseñas 1-11
e

Privilegios de Objeto 1-12


SQ Gu
de Fu de

Otorgamiento de Privilegios de Objeto 1-14


Transferencia de Privilegios 1-15
Confirmación de Privilegios Otorgados 1-16
Revocación de Privilegios de Objeto 1-17
D da Al

Resumen 1-19
at m u

Práctica 1: Visión General 1-20


os e m

2 Gestión de Objetos de Esquema


n

Objetivos 2-2
a

Sentencia ALTER TABLE 2-3


Adición de una Columna 2-5
O ta o

Modificación de una Columna 2-6


ra ls

Borrado de una Columna 2-7


l

Opción SET UNUSED 2-8


cl I

Adición de una Sintaxis de Restricción 2-10


n

Adición de una Restricción 2-11


e I

ON DELETE CASCADE 2-12


Diferir Restricciones 2-13
10

Borrado de una Restricción 2-14


Desactivación de Restricciones 2-15
n

iii

2
Introducción a Oracle 10g: SQL Fundamentals II

Activación de Restricciones 2-16


Restricciones en Cascada 2-18
Visión General de Índices 2-20
CREATE INDEX con Sentencia CREATE TABLE 2-21
Índices Basados en Funciones 2-23
Eliminación de un Índice 2-24
DROP TABLE ...PURGE 2-25
Sentencia FLASHBACK TABLE 2-26
Tablas Externas 2-28
Creacisn de un Directorio para la Tabla Externa 2-30
Creación de una Tabla Externa 2-32
Creación de una Tabla Externa mediante ORACLE_LOADER 2-34
Consulta de Tablas Externas 2-36
Resumen 2-37
Práctica 2: Visión General 2-38

3 Manipulación de Grandes Juegos de Datos


Objetivos 3-2
B

Uso de Subconsultas para Manipular Datos 3-3


Copia de Filas de Otra Tabla 3-4
as L í

Inserción mediante una Subconsulta como Destino 3-5


Recuperación de Datos con una Subconsulta como Origen 3-7
e

Actualización de Dos Columnas con una Subconsulta 3-8


SQ Gu

Actualización de Filas Basándose en Otra Tabla 3-9


de Fu de

Supresión de Filas Basándose en Otra Tabla 3-10


Uso de las Palabras Clave WITH CHECK OPTION en Sentencias DML 3-11
Visión General de la Función de Valor por Defecto Explícito 3-12
D da Al

Uso de Valores Por Defecto Explícitos 3-13


Visión General de Sentencias INSERT de Varias Tablas 3-14
at m u

Tipos de Sentencias INSERT de Varias Tablas 3-16


Sentencias INSERT de Varias Tablas 3-17
os e m
n

INSERT ALL Incondicional 3-19


a

INSERT ALL Condicional 3-20


INSERT FIRST Condicional 3-22
O ta o

INSERT de Pivoting 3-24


Sentencia MERGE 3-27
ra ls
l

Sintaxis de la Sentencia MERGE 3-28


Fusión de Filas 3-29
cl I
n

Seguimiento de Cambios en los Datos 3-31


e I

Ejemplo de Consulta de Versiones de Flashback 3-32


Cláusula VERSIONS BETWEEN 3-34
10

Resumen 3-35
Práctica 3: Visión General 3-36
n

iv

3
Introducción a Oracle 10g: SQL Fundamentals II

4 Generación de Informes mediante la Agrupación de Datos Relacionados


Objetivos 4-2
Revisión de Funciones de Grupo 4-3
Revisión de la Cláusula GROUP BY 4-4
Revisión de la Cláusula HAVING 4-5
GROUP BY con los Operadores ROLLUP y CUBE 4-6
Operador ROLLUP 4-7
Operador ROLLUP: Ejemplo 4-8
Operador CUBE 4-9
Operador CUBE: Ejemplo 4-10
Función GROUPING 4-11
Función GROUPING: Ejemplo 4-12
GROUPING SETS 4-13
GROUPING SETS: Ejemplo 4-15
Columnas Compuestas 4-17
Columnas Compuestas: Ejemplo 4-19
Agrupamientos Concatenados 4-21
Agrupamientos Concatenados: Ejemplo 4-22
B

Resumen 4-23
as L í

Práctica 4: Visión General 4-24

5 Gestión de Datos en Zonas Horarias Diferentes


e

Objetivos 5-2
SQ Gu

Zonas Horarias 5-3


de Fu de

Parámetro de Sesión TIME_ZONE 5-4


CURRENT_DATE, CURRENT_TIMESTAMP y LOCALTIMESTAMP 5-5
CURRENT_DATE 5-6
D da Al

CURRENT_TIMESTAMP 5-7
LOCALTIMESTAMP 5-8
at m u

DBTIMEZONE y SESSIONTIMEZONE 5-9


Tipo de Datos TIMESTAMP 5-10
os e m
n

Tipos de Datos TIMESTAMP 5-11


a

Campos TIMESTAMP 5-12


Diferencia entre DATE y TIMESTAMP 5-13
O ta o

Tipo de Datos TIMESTAMP WITH TIME ZONE 5-14


TIMESTAMP WITH TIMEZONE: Ejemplo 5-15
ra ls
l

TIMESTAMP WITH LOCAL TIMEZONE 5-16


TIMESTAMP WITH LOCAL TIMEZONE: Ejemplo 5-17
cl I
n

Tipos de Datos INTERVAL 5-18


e I

Campos INTERVAL 5-20


Tipo de Datos INTERVAL YEAR TO MONTH 5-21
10

INTERVAL YEAR TO MONTH: Ejemplo 5-22


Tipo de Datos INTERVAL DAY TO SECOND 5-23
n

4
Introducción a Oracle 10g: SQL Fundamentals II

Tipo de Datos INTERVAL DAY TO SECOND: Ejemplo 5-24


EXTRACT 5-25
TZ_OFFSET 5-26
Conversión de TIMESTAMP mediante FROM_TZ 5-28
Conversión a TIMESTAMP mediante TO_TIMESTAMP y TO_TIMESTAMP_TZ 5-29
Conversión de Intervalo de Tiempo con TO_YMINTERVAL 5-30
Uso de TO_DSINTERVAL: Ejemplo 5-31
Horario de Verano 5-32
Resumen 5-34
Práctica 5: Visión General 5-35

6 Recuperación de Datos mediante Subconsultas


Objetivos 6-2
Subconsultas de Varias Columnas 6-3
Comparaciones de Columnas 6-4
Subconsulta de Comparación entre Pares 6-5
Subconsulta de Comparación entre No Pares 6-6
Expresiones de Subconsultas Escalares 6-7
B

Subconsultas Escalares: Ejemplos 6-8


Subconsultas Correlacionadas 6-10
as L í

Uso de Subconsultas Correlacionadas 6-12


Uso del Operador EXISTS 6-14
e

Búsqueda de Empleados que Tengan al Menos una Persona a sus Órdenes 6-15
SQ Gu

Búsqueda de Todos los Departamentos que No Tengan Empleados 6-16


de Fu de

Consulta Correlacionada: UPDATE 6-17


Uso de Consultas Correlacionadas: UPDATE 6-18
Consulta Correlacionada: DELETE 6-20
D da Al

Uso de Consultas Correlacionadas: DELETE 6-21


Cláusula WITH 6-22
at m u

Cláusula WITH: Ejemplo 6-23


Resumen 6-25
os e m
n

Práctica 6: Visión General 6-27


a

7 Recuperación Jerárquica
O ta o

Objetivos 7-2
Ejemplo de Datos de la Tabla EMPLOYEES 7-3
ra ls

Estructura de Árbol Natural 7-4


l

Consultas Jerárquicas 7-5


cl I

Desplazamiento por el Árbol 7-6


n

Desplazamiento por el Árbol: De Abajo Arriba 7-8


e I

Desplazamiento por el Árbol: De Arriba Abajo 7-9


Clasificación de Filas con la Pseudocolumna LEVEL 7-10
10

Formato de Informes Jerárquicos mediante LEVEL y LPAD 7-11


n

Eliminación de Ramas 7-13


g

vi

5
Introducción a Oracle 10g: SQL Fundamentals II

Resumen 7-14
Práctica 7: Visión General 7-15

8 Soporte de Expresiones Normales


Objetivos 8-2
Visión General de Expresiones Normales 8-3
Metacaracteres 8-4
Uso de Metacaracteres 8-5
Funciones de Expresiones Normales 8-7
Sintaxis de la Función REGEXP 8-8
Realización de Búsquedas Básicas 8-9
Comprobación de la Presencia de un Patrón 8-10
Ejemplo de Extracción de Subcadenas 8-11
Sustitución de Patrones 8-12
Expresiones Normales y Restricciones de Control 8-13
Resumen 8-14
Práctica 8: Visión General 8-15

Apéndice A: Soluciones a la Práctica


B

Apéndice B: Descripciones de Tabla


as L í

Apéndice C: Escritura de Archivos de Comandos Avanzados


e

Objetivos C-2
Uso de SQL para Generar SQL C-3
SQ Gu
de Fu de

Creación de un Archivo de Comandos Básico C-4


Control del Entorno C-5
La Imagen Completa C-6
D da Al

Volcado del Contenido de una Tabla en un Archivo C-7


Generación de un Predicado Dinámico C-9
at m u

Resumen C-11
os e m

Apéndice D: Componentes de la Arquitectura Oracle


n
a

Objetivos D-2
Arquitectura de la Base de Datos Oracle: Visión General D-3
O ta o

Arquitectura Física de la Base de Datos D-4


Archivos de Control D-5
ra ls

Archivos Redo Log D-6


l

Tablespaces y Archivos de Datos D-7


cl I

Segmentos, Extensiones y Bloques D-8


n

Gestión de Instancias Oracle D-9


e I

Estructuras de Memoria Oracle D-10


Procesos Oracle D-12
10

Otras Estructuras Físicas Clave D-13


n

Procesamiento de una Sentencia SQL D-14


g

vii

6
Introducción a Oracle 10g: SQL Fundamentals II

Conexión a una Instancia D-15


Procesamiento de una Consulta D-17
Pool Compartido D-18
Caché de Buffers de Base de Datos D-20
PGA (Área Global de Programas) D-21
Procesamiento de una Sentencia DML D-22
Buffer de Redo Log D-24
Segmento de Rollback D-25
Procesamiento COMMIT D-26
Resumen D-28

Índice

Prácticas Adicionales

Soluciones a las Prácticas Adicionales


B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

viii

7
g
10

8
e I
cl I
ra ls
Introducción a Oracle 10g: SQL Fundamentals II

O ta o
n n
os e m
at m u
Prefacio

D da Al
n l
de Fu de
e a
as L í
B SQ Gu
g
10

9
e I
cl I
ra ls
Introducción a Oracle 10g: SQL Fundamentals II

O ta o
n n
os e m
at m u
D da Al

Prefacio - 2
n l
de Fu de
e a
as L í
B SQ Gu
Introducción a Oracle 10g: SQL Fundamentals II

Perfil

Antes de Empezar Este Curso


• Antes de empezar el curso, debe tener experiencia práctica con SQL.

Requisitos
• Base de Datos Oracle 10g: Conceptos Fundamentales de SQL I

Organización de Este Curso


Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II es un curso dirigido por un instructor
que ofrece clases teóricas y ejercicios prácticos. Las demostraciones en línea y las sesiones de prácticas
escritas refuerzan los conceptos y los conocimientos introducidos.
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Prefacio - 3
10
Introducción a Oracle 10g: SQL Fundamentals II

Publicaciones Relacionadas

Publicaciones Adicionales
• Boletines de versión de sistema
• Guías de usuario y de instalación
• Archivos read-me
• Artículos de IOUG (International Oracle User’s Group)
• Oracle Magazine
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Prefacio - 4
11
Introducción a Oracle 10g: SQL Fundamentals II

Convenciones Tipográficas

Convenciones Tipográficas del Texto

Convención Elemento Ejemplo


Negrita Frases y palabras enfatizadas Para navegar dentro de esta aplicación, no
sólo en el contenido Web haga clic en los botones Back y Forward.

Cursiva Términos de glosario (si hay El algoritmo inserta la clave nueva.


negrita algún glosario)

Corchetes Nombres de tecla Pulse [Enter].

Mayúsculas Botones, Haga clic en el botón Executable.


y minúsculas casillas de control, Active la casilla de control Registration
disparadores, Required.
ventanas
Asigne un disparador When-Validate-Item.
Abra la ventana Master Schedule.
B

Corchetes Rutas de acceso de menú Seleccione File > Save.


angulares
as L í

Comas Secuencias de teclas Pulse y suelte de una en una las siguientes


teclas:
e

[Alt], [F], [D]


SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Prefacio - 5
12
Introducción a Oracle 10g: SQL Fundamentals II

Convenciones Tipográficas (continuación)

Convenciones Tipográficas del Texto (continuación)

Convención Objeto o Término Ejemplo


Courier New, Salida de código, Salida de código: debug.seti (‘I’,300);
sensible a elementos de código Elementos de código SQL: Utilice el comando SELECT
mayúsculas/m SQL y PL/SQL,
para visualizar la información almacenada en la columna
inúsculas elementos de código
last_name de la tabla emp.
Java, nombres de
directorio, nombres Elementos de código Java: La programación Java afecta a
de archivo, las clases String y StringBuffer.
contraseñas, Nombres de directorio: bin (DOS), $FMHOME (UNIX)
nombres de ruta de
acceso, direcciones Nombres de archivo: Busque el archivo init.ora.
URL, Contraseñas: Utilice la contraseña tiger.
datos introducidos
por el usuario, Nombres de ruta de acceso: Abra
nombres de usuario c:\my_docs\projects.
B

Direcciones URL: Vaya a http://www.oracle.com.


as L í

Datos introducidos por el usuario: Introduzca 300.


Nombres de usuario: Conéctese como scott.
e
SQ Gu

Mayúsculas Etiquetas de gráficos Dirección de cliente (excepto Oracle Payables)


de Fu de

iniciales (siempre que el


término no sea un
nombre propio)
D da Al

Cursiva Frases y palabras No guarde los cambios en la base de datos.


at m u

enfatizadas en Para obtener más información, consulte Oracle7 Server


publicaciones SQL Language Reference Manual.
os e m

impresas, títulos de
n

Introduzca user_id@us.oracle.com, donde user_id


a

libros y cursos,
variables es el nombre de usuario.
O ta o

Signos más Combinaciones de Mantenga pulsadas las teclas siguientes:


teclas [Control] + [Alt] + [Supr]
ra ls
l

Comillas Títulos de capítulo y Este tema se trata en la Unidad II, Lección 3, “Trabajo con
cl I
n

de lección en Objetos”.
referencias cruzadas,
e I

elementos de Seleccione el componente “Include a reusable module


10

interfaz con component” y haga clic en Finish.


nombres largos que
n

sólo tienen las Utilice la propiedad “WHERE clause of query”.


g

iniciales en
mayúsculas

Prefacio - 6
13
Introducción a Oracle 10g: SQL Fundamentals II

Convenciones Tipográficas (continuación)


Convenciones Tipográficas de las Rutas de Acceso de Navegación
Este curso utiliza rutas de acceso de navegación simplificadas, como la del siguiente ejemplo, para guiarlo
a través de las aplicaciones Oracle.
Ejemplo:
Invoice Batch Summary
(N) Invoice > Entry > Invoice Batches Summary (M) Query > Find (B) Approve

Esta ruta de acceso simplificada significa lo siguiente:


1. (N) En la ventana del navegador, seleccione Invoice > Entry > Invoice Batches Summary.
2. (M) En el menú, seleccione Query > Find.
3. (B) Haga clic en el botón Approve.
Notación:
(N) = Navegador (I) = Icono
(M) = Menú (H) = Enlace de hipertexto
(S) = Separador (B) = Botón
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Prefacio - 7
14
g
10

15
e I
cl I
ra ls
Introducción a Oracle 10g: SQL Fundamentals II

O ta o
n n
os e m
at m u
D da Al

Prefacio - 8
n l
de Fu de
e a
as L í
B SQ Gu
g
10

16
e I
cl I
ra ls
Introducción a Oracle 10g: SQL Fundamentals II

O ta o
n n
os e m
Introducción

at m u
D da Al
n l
de Fu de
e a
as L í
B SQ Gu
Introducción a Oracle 10g: SQL Fundamentals II

Objetivos

Al finalizar esta lección, debería estar capacitado para:


• Mostrar los objetivos del curso
• Describir las tablas de ejemplo utilizadas en el curso
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II I-2


17
Introducción a Oracle 10g: SQL Fundamentals II

Objetivos del Curso

Al finalizar este curso, debería estar capacitado para:


• Utilizar técnicas SQL avanzadas de recuperación
de datos para recuperar datos de tablas de base
de datos
• Aplicar técnicas avanzadas en una práctica que
simule la vida real
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II I-3


18
Introducción a Oracle 10g: SQL Fundamentals II

Visión General del Curso

En este curso, utilizará técnicas avanzadas SQL de


recuperación de datos como:
• Funciones de fecha/hora
• GROUPING SETS y operadores ROLLUP y CUBE
• Consultas jerárquicas
• Subconsultas correlacionadas
• Inserciones de varias tablas
• Operación de fusión (merge)
• Tablas externas
B

• Uso de expresiones normales


as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II I-4


19
Introducción a Oracle 10g: SQL Fundamentals II

Aplicación del Curso

EMPLOYEES DEPARTMENTS LOCATIONS


B

REGIONS COUNTRIES
as L í
e
SQ Gu
de Fu de

Tablas Utilizadas en el Curso


D da Al

En el curso, se utilizan las siguientes tablas:


at m u

EMPLOYEES: La tabla EMPLOYEES contiene información sobre todos los empleados como
nombre y apellido, identificador de puesto, salario, fecha de contratación, identificador de
os e m

departamento e identificador de supervisor. Esta tabla es secundaria de la tabla DEPARTMENTS.


n
a

DEPARTMENTS: La tabla DEPARTMENTS contiene información como identificador de


departamento, nombre de departamento, identificador de supervisor e identificador de ubicación.
O ta o

Esta tabla es la tabla de clave primaria de la tabla EMPLOYEES.


LOCATIONS: Esta tabla contiene información de la ubicación de departamentos. Contiene
ra ls
l

información de identificador de ubicación, calle, ciudad, estado o provincia, código postal e


identificador de país. Es la tabla de clave primaria de la tabla DEPARTMENTS y secundaria de la
cl I

tabla COUNTRIES.
n

COUNTRIES: Esta tabla contiene los nombres de país, los identificadores de país y los
e I

identificadores de región. Es secundaria de la tabla REGIONS. Es la tabla de clave primaria de la


10

tabla LOCATIONS.
REGIONS: Esta tabla contiene identificadores de región y nombres de región de los diferentes
n

países. Es la tabla de clave primaria de la tabla COUNTRIES.


g

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II I-5


20
Introducción a Oracle 10g: SQL Fundamentals II

Resumen

En esta lección, ha aprendido lo siguiente:


• Objetivos del curso
• Tablas de ejemplo utilizadas en el curso
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II I-6


21
Introducción a Oracle 10g: SQL Fundamentals II

Control de Acceso de Usuarios


B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

22
Introducción a Oracle 10g: SQL Fundamentals II

Objetivos

Al finalizar esta lección, debería estar capacitado para:


• Diferenciar los privilegios del sistema de los de
objeto
• Otorgar privilegios en tablas
• Ver privilegios en el diccionario de datos
• Otorgar roles
• Distinguir entre privilegios y roles
B
as L í
e
SQ Gu
de Fu de

Objetivos
D da Al

En esta lección, aprenderá a controlar el acceso a base de datos para objetos específicos y a
agregar nuevos usuarios con diferentes niveles de privilegios de acceso.
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 1-2


23
Introducción a Oracle 10g: SQL Fundamentals II

Control de Acceso de Usuarios

Administrador
de la base
de datos

Nombre de usuario y contraseña


Privilegios

Usuarios
B
as L í
e
SQ Gu
de Fu de

Control de Acceso de Usuarios


D da Al

En un entorno de varios usuarios, necesita mantener la seguridad del acceso y el uso de la


base de datos. Con la seguridad de base de datos de Oracle Server, puede:
at m u

• Controlar el acceso a la base de datos


• Otorgar acceso a objetos específicos de la base de datos
os e m
n

• Confirmar los privilegios otorgados y recibidos con el diccionario de datos Oracle


a

• Crear sinónimos para objetos de base de datos


La seguridad de base de datos se puede clasificar en dos categorías: seguridad del sistema y
O ta o

seguridad de los datos. La seguridad del sistema cubre el acceso y el uso de la base de datos
ra ls

en el nivel del sistema como, por ejemplo, nombre de usuario y contraseña, el espacio en
l

disco asignado a los usuarios y las operaciones del sistema que pueden realizar los usuarios.
cl I

La seguridad de datos cubre el acceso y el uso de los objetos de base de datos y las acciones
n

que esos usuarios pueden llevar a cabo en los objetos.


e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 1-3


24
Introducción a Oracle 10g: SQL Fundamentals II

Privilegios

• Seguridad de base de datos:


– Seguridad del sistema
– Seguridad de datos
• Privilegios del sistema: Obtención de acceso a la
base de datos
• Privilegios de objeto: Manipulación del contenido
de los objetos de base de datos
• Esquemas: Recopilaciones de objetos como, por
ejemplo, tablas, vistas y secuencias
B
as L í
e
SQ Gu
de Fu de

Privilegios
D da Al

Los privilegios son el derecho a ejecutar sentencias SQL en particular. El DBA (administrador
at m u

de la base de datos) es un usuario de alto nivel con la capacidad de crear usuarios y de


otorgarles acceso a la base de datos y a sus objetos. Los usuarios necesitan privilegios del
os e m

sistema para obtener acceso a la base de datos y privilegios de objeto para manipular el
n

contenido de los objetos de la base de datos. A los usuarios también se les puede otorgar el
a

privilegio de otorgar privilegios adicionales a otros usuarios o a roles, que son grupos
especificados de privilegios relacionados.
O ta o

Esquemas
ra ls
l

Un esquema es una recopilación de objetos como, por ejemplo, tablas, vistas y secuencias. El
esquema es propiedad de un usuario de base de datos y tiene el mismo nombre que el usuario.
cl I
n

Para obtener más información, consulte el manual de referencia Oracle Database 10g
e I

Application Developer’s Guide – Fundamentals.


10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 1-4


25
Introducción a Oracle 10g: SQL Fundamentals II

Privilegios del Sistema

• Hay más de 100 privilegios disponibles.


• El administrador de la base de datos tiene
privilegios del sistema de alto nivel para tareas
como, por ejemplo:
– Creación de usuarios nuevos
– Eliminación de usuarios
– Eliminación de tablas
– Realización de copias de seguridad de tablas
B
as L í
e
SQ Gu
de Fu de

Privilegios del Sistema


D da Al

Los usuarios y los roles tienen a su disposición más de 100 privilegios del sistema distintos.
Los privilegios del sistema suelen ser proporcionados por el administrador de la base de datos.
at m u

Privilegios de DBA Típicos


os e m
n
a

Privilegio del Sistema Operaciones Autorizadas


CREATE USER La persona a la que se otorga el privilegio puede crear otros
O ta o

usuarios de Oracle
DROP USER La persona a la que se otorga el privilegio puede borrar otro
ra ls

usuario.
l

DROP ANY TABLE La persona a la que se otorga el privilegio puede borrar una tabla
cl I

de cualquier esquema.
n

BACKUP ANY TABLE La persona a la que se otorga el privilegio puede realizar copias
e I

de seguridad de cualquier esquema con la utilidad de exportación.


SELECT ANY TABLE La persona a la que se otorga el privilegio puede consultar tablas,
10

vistas o instantáneas en cualquier esquema.


CREATE ANY TABLE La persona a la que se otorga el privilegio puede crear tablas en
n

cualquier esquema.
g

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 1-5


26
Introducción a Oracle 10g: SQL Fundamentals II

Creación de Usuarios

El DBA crea usuarios mediante la sentencia CREATE USER.

CREATE USER user


IDENTIFIED BY password;

CREATE USER HR
IDENTIFIED BY HR;
User created.
B
as L í
e
SQ Gu
de Fu de

Creación de un Usuario
D da Al

Para crear el usuario, el DBA ejecuta la sentencia CREATE USER. El usuario no tiene ningún
privilegio en ese momento. Por tanto, el DBA puede otorgar privilegios a ese usuario. Estos
at m u

privilegios determinan lo que el usuario podrá hacer en el nivel de base de datos.


os e m

La diapositiva muestra la sintaxis resumida para crear un usuario.


n
a

En la sintaxis:
user es el nombre del usuario que se va a crear
O ta o

Password especifica que el usuario se debe conectar con esta contraseña


Para obtener más información, consulte Oracle Database 10g SQL Reference, “GRANT” y
ra ls
l

“CREATE USER”.
cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 1-6


27
Introducción a Oracle 10g: SQL Fundamentals II

Privilegios del Sistema de Usuario

• Una vez creado el usuario, el DBA le puede otorgar


privilegios del sistema específicos.
GRANT privilege [, privilege...]
TO user [, user| role, PUBLIC...];
• Un desarrollador de aplicaciones, por ejemplo,
puede tener los siguientes privilegios del sistema:
– CREATE SESSION
– CREATE TABLE
– CREATE SEQUENCE
B

– CREATE VIEW

as L í

CREATE PROCEDURE
e
SQ Gu
de Fu de

Privilegios de Usuario Típicos


D da Al

Una vez creado el usuario, el DBA le puede asignar privilegios.


at m u

Privilegio del Sistema Operaciones Autorizadas


CREATE SESSION Conectarse a la base de datos
os e m
n

CREATE TABLE Crear tablas en el esquema del usuario


a

CREATE SEQUENCE Crear una secuencia en el esquema del usuario


CREATE VIEW Crear una vista en el esquema del usuario
O ta o

CREATE PROCEDURE Crear un procedimiento, una función o un paquete en el esquema


ra ls

del usuario
l

cl I

En la sintaxis:
n

privilege es el privilegio del sistema que se va a otorgar


e I

user |role|PUBLIC es el nombre del usuario, el nombre del rol o, en el caso


de PUBLIC, designa que el privilegio se otorga a todos
10

los usuarios
n

Nota: Los privilegios del sistema actuales se pueden encontrar en la vista de diccionario
g

SESSION_PRIVS.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 1-7


28
Introducción a Oracle 10g: SQL Fundamentals II

Otorgamiento de Privilegios del Sistema

El DBA puede otorgar privilegios del sistema específicos


a un usuario.
GRANT create session, create table,
create sequence, create view
TO scott;
Grant succeeded.
B
as L í
e
SQ Gu
de Fu de

Otorgamiento de Privilegios del Sistema


D da Al

El DBA utiliza la sentencia GRANT para asignar privilegios del sistema al usuario. Una vez
at m u

que se le han otorgado los privilegios al usuario, éste puede utilizarlos de forma inmediata.
En el ejemplo de la diapositiva, se han asignado al usuario Scott privilegios para crear
os e m

sesiones, tablas, secuencias y vistas.


n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 1-8


29
Introducción a Oracle 10g: SQL Fundamentals II

¿Qué es un Rol?

Usuarios

Gestor

Privilegios
B

Asignación de privilegios Asignación de privilegios


sin un rol con un rol
as L í
e
SQ Gu
de Fu de

¿Qué es un Rol?
D da Al

Un rol es un grupo especificado de privilegios relacionados que se pueden otorgar al usuario.


Este método facilita la revocación y el mantenimiento de privilegios.
at m u

Un usuario puede tener acceso a varios roles y se puede asignar a varios usuarios el mismo
os e m

rol. Los roles se suelen crear para una aplicación de base de datos.
n
a

Creación y Asignación de un Rol


En primer lugar, el DBA debe crear el rol. Después, el DBA puede asignar privilegios al rol y
O ta o

asignar el rol a usuarios.


ra ls

Sintaxis
l

CREATE ROLE role;


cl I

En la sintaxis:
n

role es el nombre del rol que se va a crear


e I

Una vez creado el rol, el DBA puede utilizar la sentencia GRANT para asignar el rol a
10

usuarios, del mismo modo que puede asignar privilegios al rol.


n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 1-9


30
Introducción a Oracle 10g: SQL Fundamentals II

Creación y Otorgamiento de Privilegios a un Rol

• Cree un rol
CREATE ROLE manager;
Role created.
• Otorgue privilegios a un rol
GRANT create table, create view
TO manager;
Grant succeeded.

• Otorgue un rol a usuarios


GRANT manager TO DE HAAN, KOCHHAR;
B

Grant succeeded.
as L í
e
SQ Gu
de Fu de

Creación de un Rol
D da Al

El ejemplo de la diapositiva crea un rol de gestor y, a continuación, permite a los gestores


crear tablas y vistas. Otorga después a De Haan y a Kochhar el rol de gestores. De Haan y
at m u

Kochhar ya pueden crear tablas y vistas.


os e m

Si se otorga a los usuarios varios roles, reciben todos los privilegios asociados a esos roles.
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 1-10


31
Introducción a Oracle 10g: SQL Fundamentals II

Cambio de Contraseñas

• El DBA crea la cuenta de usuario e inicializa la


contraseña.
• La contraseña se puede cambiar mediante la
sentencia ALTER USER.

ALTER USER HR
IDENTIFIED BY employ;
User altered.
B
as L í
e
SQ Gu
de Fu de

Cambio de Contraseñas
D da Al

El DBA crea una cuenta e inicializa una contraseña para cada usuario. La contraseña se puede
cambiar mediante la sentencia ALTER USER.
at m u

Sintaxis
os e m
n

ALTER USER user IDENTIFIED BY password;


a

En la sintaxis:
user es el nombre del usuario
O ta o

password especifica la nueva contraseña


Aunque esta sentencia se puede utilizar para cambiar la contraseña, hay muchas otras
ra ls
l

opciones. Debe tener el privilegio ALTER USER para cambiar cualquier otra opción.
cl I

Para obtener más información, consulte el manual Oracle Database 10g SQL Reference.
n

Nota: SQL*Plus dispone de un comando PASSWORD (PASSW) que se puede utilizar para
e I

cambiar la contraseña de un usuario cuando éste está conectado. Este comando no está
disponible en iSQL*Plus.
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 1-11


32
Introducción a Oracle 10g: SQL Fundamentals II

Privilegios de Objeto

Privilegios
de Objeto Tabla Vista Secuencia Procedimiento

ALTER √ √

DELETE √ √

EXECUTE √

INDEX √

INSERT √ √

REFERENCES √
B

SELECT √ √ √
as L í

UPDATE √ √
e
SQ Gu
de Fu de

Privilegios de Objeto
D da Al

Un privilegio de objeto es un privilegio o un derecho a realizar una acción determinada en


una tabla, una vista, una secuencia o un procedimiento específicos. Cada objeto dispone de un
at m u

juego determinado de privilegios que se pueden otorgar. La tabla de la diapositiva muestra los
privilegios de varios objetos. Tenga en cuenta que los únicos privilegios que se aplican a una
os e m
n

secuencia son SELECT y ALTER. UPDATE, REFERENCES e INSERT se pueden restringir


a

mediante la especificación de un subjuego de columnas que se puedan actualizar. Para


restringir un privilegio SELECT, se puede crear una vista con un subjuego de columnas y
O ta o

otorgar el privilegio SELECT únicamente en la vista. Un privilegio otorgado en un sinónimo


se convierte en un privilegio en la tabla base a la que haga referencia el sinónimo.
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 1-12


33
Introducción a Oracle 10g: SQL Fundamentals II

Privilegios de Objeto

• Los privilegios de objeto varían de un objeto a otro.


• Un propietario tiene todos los privilegios en el objeto.
• Un propietario puede otorgar privilegios específicos
en el objeto del que es propietario.
GRANT object_priv [(columns)]
ON object
TO {user|role|PUBLIC}
[WITH GRANT OPTION];
B
as L í
e
SQ Gu
de Fu de

Otorgamiento de Privilegios de Objeto


D da Al

Existen diferentes privilegios de objeto disponibles para diferentes tipos de objetos de


esquema. Un usuario tiene automáticamente todos los privilegios de objeto para objetos de
at m u

esquema contenidos en el esquema del usuario. Un usuario puede otorgar cualquier privilegio
de objeto en cualquier objeto de esquema que sea propiedad del usuario a cualquier otro
os e m
n

usuario o rol. Si el otorgamiento incluye WITH GRANT OPTION, la persona a la que se


a

otorga el privilegio puede otorgar a su vez el privilegio de objeto a otros usuarios; de lo


contrario, la persona a la que se otorga el privilegio lo puede utilizar pero no lo puede otorgar
O ta o

a otros usuarios.
ra ls

En la sintaxis:
l

object_priv es un privilegio de objeto que se va a otorgar


cl I

ALL especifica todos los privilegios de objeto


n

columns especifica la columna de una tabla o de una vista en


e I

la que se otorgan los privilegios


ON object es el objeto en el que se otorgan privilegios
10

TO identifica a quién se otorga el privilegio


PUBLIC otorga privilegios de objeto a todos los usuarios
n

WITH GRANT OPTION permite a la persona a la que se otorga el privilegio


g

otorgar privilegios de objeto a otros usuarios y roles

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 1-13


34
Introducción a Oracle 10g: SQL Fundamentals II

Otorgamiento de Privilegios de Objeto

• Otorgue privilegios de consulta en la tabla EMPLOYEES.


GRANT select
ON employees
TO sue, rich;
Grant succeeded.

• Otorgue privilegios para actualizar columnas


específicas para usuarios y roles.
GRANT update (department_name, location_id)
ON departments
B

TO scott, manager;
Grant succeeded.
as L í
e
SQ Gu
de Fu de

Instrucciones
D da Al

• Para otorgar privilegios en un objeto, éste debe estar en el esquema o le deben haber
otorgado los privilegios de objeto con la cláusula WITH GRANT OPTION.
at m u

• Un propietario de objeto puede otorgar cualquier privilegio de objeto a cualquier otro


usuario o rol de la base de datos.
os e m
n

• El propietario de un objeto adquiere automáticamente todos los privilegios de objeto en


a

ese objeto.
El primer ejemplo de la diapositiva otorga a los usuarios Sue y Rich el privilegio para
O ta o

consultar la tabla EMPLOYEES. El segundo ejemplo otorga privilegios UPDATE en columnas


específicas de la tabla DEPARTMENTS a Scott y al rol de gestor.
ra ls
l

Si Sue o Rich quieren utilizar ahora una sentencia SELECT para obtener datos de la tabla
EMPLOYEES, la sintaxis que deben utilizar es:
cl I
n

SELECT * FROM HR.employees;


De forma alternativa, pueden crear un sinónimo para la tabla y emitir una sentencia SELECT
e I

desde el sinónimo:
10

CREATE SYNONYM emp FOR HR.employees;


SELECT * FROM emp;
n

Nota: Los DBA suelen asignar privilegios del sistema; cualquier usuario propietario de un
g

objeto puede otorgar privilegios de objeto.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 1-14


35
Introducción a Oracle 10g: SQL Fundamentals II

Transferencia de Privilegios

• Autorice a un usuario a transferir privilegios.


GRANT select, insert
ON departments
TO scott
WITH GRANT OPTION;
Grant succeeded.

• Permita a todos los usuarios del sistema consultar


datos de la tabla DEPARTMENTS de Alice.
GRANT select
B

ON alice.departments
TO PUBLIC;
as L í

Grant succeeded.
e
SQ Gu
de Fu de

Palabras Clave WITH GRANT OPTION


D da Al

La persona a la que se otorga un privilegio que se otorgue con la cláusula WITH GRANT
OPTION lo puede transferir a otros usuarios y roles. Los privilegios de objeto otorgados con
at m u

la cláusula WITH GRANT OPTION se revocan si se revoca el privilegio del otorgante.


os e m

El ejemplo de la diapositiva otorga al usuario Scott acceso a la tabla DEPARTMENTS con los
n

privilegios para consultar la tabla y agregarle filas. El ejemplo muestra también que Scott
a

puede otorgar a otros estos privilegios.


O ta o

Palabra Clave PUBLIC


Un propietario de la tabla puede otorgar acceso a todos los usuarios mediante la palabra clave
ra ls
l

PUBLIC.
cl I

El segundo ejemplo permite a todos los usuarios del sistema consultar datos de la tabla
n

DEPARTMENTS de Alice.
e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 1-15


36
Introducción a Oracle 10g: SQL Fundamentals II

Confirmación de Privilegios Otorgados


Vista del Diccionario de Datos Descripción
ROLE_SYS_PRIVS Privilegios del sistema otorgados a roles
ROLE_TAB_PRIVS Privilegios de la tabla otorgados a roles
USER_ROLE_PRIVS Roles a los que puede acceder el usuario
USER_TAB_PRIVS_MADE Privilegios de objeto otorgados en los
objetos del usuario
USER_TAB_PRIVS_RECD Privilegios de objeto otorgados al usuario
USER_COL_PRIVS_MADE Privilegios de objeto otorgados en las
columnas de los objetos del usuario
USER_COL_PRIVS_RECD Privilegios de objeto otorgados al usuario
B

en columnas específicas
as L í

USER_SYS_PRIVS Privilegios del sistema otorgados al usuario


e
SQ Gu
de Fu de

Confirmación de Privilegios Otorgados


D da Al

Si intenta realizar una operación no autorizada, como suprimir una fila de una tabla para la
que no tiene el privilegio DELETE, Oracle Server no permite que la operación se realice.
at m u

Si recibe el mensaje de error de Oracle Server “table or view does not exist”, es porque ha
os e m

realizado una de estas acciones:


n

• Ha especificado una tabla o una vista que no existen


a

• Ha intentado realizar una operación en una tabla o en una vista para la que no tiene el
privilegio adecuado
O ta o

Puede acceder al diccionario de datos para ver los privilegios de los que dispone. El gráfico
ra ls

de la diapositiva describe varias vistas de diccionario de datos.


l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 1-16


37
Introducción a Oracle 10g: SQL Fundamentals II

Revocación de Privilegios de Objeto

• Utilice la sentencia REVOKE para revocar privilegios


otorgados a otros usuarios.
• También se revocan los privilegios otorgados a
otros mediante la cláusula WITH GRANT OPTION.
REVOKE {privilege [, privilege...]|ALL}
ON object
FROM {user[, user...]|role|PUBLIC}
[CASCADE CONSTRAINTS];
B
as L í
e
SQ Gu
de Fu de

Revocación de Privilegios de Objeto


D da Al

Puede eliminar privilegios otorgados a otros usuarios mediante la sentencia REVOKE. Al


utilizar la sentencia REVOKE, los privilegios que especifique se revocarán de los usuarios que
at m u

especifique y de cualquier otro usuario a quien el usuario revocado hubiera otorgado esos
privilegios.
os e m
n
a

En la sintaxis:
CASCADE es necesario para eliminar cualquier restricción de integridad referencial realizada
O ta o

en el objeto CONSTRAINTS mediante el privilegio REFERENCES


Para obtener más información, consulte Oracle Database 10g SQL Reference.
ra ls
l

Nota: Si revoca los privilegios de un usuario que debe dejar la compañía, debe volver a
cl I

otorgar cualquier privilegio que este usuario hubiera otorgado a otros usuarios. Si borra la
n

cuenta de usuario sin revocarle los privilegios, esta acción no afectará a los privilegios del
e I

sistema otorgados por este usuario a otros usuarios.


10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 1-17


38
Introducción a Oracle 10g: SQL Fundamentals II

Revocación de Privilegios de Objeto

Como usuario Alice, revoque los privilegios SELECT e


INSERT otorgados al usuario Scott en la tabla
DEPARTMENTS.
REVOKE select, insert
ON departments
FROM scott;
Revoke succeeded.
B
as L í
e
SQ Gu
de Fu de

Revocación de Privilegios de Objeto (continuación)


D da Al

El ejemplo de la diapositiva revoca los privilegios SELECT e INSERT otorgados al usuario


Scott en la tabla DEPARTMENTS.
at m u

Nota: Si se otorga un privilegio a un usuario con la cláusula WITH GRANT OPTION, ese
os e m

usuario también puede otorgar el privilegio con la cláusula WITH GRANT OPTION, de
n

forma que es posible una larga cadena de personas a las que se otorgan privilegios, aunque no
a

se permiten otorgamientos circulares. Si el propietario revoca un privilegio de un usuario que


otorgó dicho privilegio a otros usuarios, se revocarán en cascada todos los privilegios
O ta o

otorgados.
ra ls

Por ejemplo, si el usuario A otorga un privilegio SELECT en una tabla al usuario B con la
l

cláusula WITH GRANT OPTION, el usuario B también puede otorgar al usuario C el


cl I

privilegio SELECT con la cláusula WITH GRANT OPTION y el usuario C puede otorgar al
n

usuario D el privilegio SELECT. Si el usuario A revoca los privilegios del usuario B, los
e I

privilegios otorgados a los usuarios C y D también se revocan.


10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 1-18


39
Introducción a Oracle 10g: SQL Fundamentals II

Resumen

En esta lección, ha obtenido información acerca de


sentencias que controlan el acceso a la base de datos
y a objetos de base de datos.
Sentencia Acción
CREATE USER Crea un usuario (la suele realizar un DBA)
GRANT Otorga a otros usuarios privilegios para
acceder a objetos
CREATE ROLE Crea una recopilación de privilegios (la suele
realizar un DBA)
B

ALTER USER Cambia la contraseña de un usuario


as L í

REVOKE Elimina privilegios en un objeto de usuarios


e
SQ Gu
de Fu de

Resumen
D da Al

Los DBA establecen la seguridad de base de datos inicial para los usuarios asignándoles
privilegios.
at m u

• El DBA crea usuarios que deben tener una contraseña. El DBA es responsable además
de establecer los privilegios iniciales del sistema para un usuario.
os e m
n

• Cuando el usuario ha creado un objeto, puede transferir cualquiera de los privilegios de


a

objeto disponibles a otros usuarios o a todos los usuarios mediante la sentencia GRANT.
• Un DBA puede crear roles mediante la sentencia CREATE ROLE para transferir una
O ta o

recopilación de privilegios del sistema o de objeto a varios usuarios. Los roles facilitan
el mantenimiento del otorgamiento y de la revocación de privilegios.
ra ls
l

• Los usuarios pueden cambiar la contraseña mediante la sentencia ALTER USER.


• Puede eliminar privilegios otorgados a otros usuarios mediante la sentencia REVOKE.
cl I
n

• Con las vistas de diccionario de datos, los usuarios pueden ver los privilegios que se les
han otorgado y los que se han otorgado a sus objetos.
e I

• Con los enlaces de base de datos, puede acceder a datos en bases de datos remotas. No
10

se pueden otorgar privilegios en objetos remotos.


n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 1-19


40
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 1: Visión General

Esta práctica cubre los temas siguientes:


• Otorgamiento a otros usuarios de privilegios de
su tabla
• Modificación de la tabla de otro usuario a través
de los privilegios que se le han otorgado
• Creación de sinónimos
• Consulta de las vistas de diccionario de datos
relacionadas con privilegios
B
as L í
e
SQ Gu
de Fu de

Práctica 1: Visión General


D da Al

Forme un equipo con otros alumnos para este ejercicio sobre el control del acceso a los objetos
de base de datos.
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 1-20


41
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 1
Para contestar a la pregunta 6 y a las posteriores, se deberá conectar a la base de datos
mediante iSQL*Plus. Para ello, inicie el explorador Internet Explorer desde el escritorio del
cliente. Introduzca la dirección URL en formato http://machinename:5561/isqlplus/ y utilice
la cuenta oraxx y la contraseña y el identificador de servicio correspondientes (en formato
Tx) que le proporcione el instructor para conectarse a la base de datos.
1. ¿Qué privilegio se debe otorgar a un usuario para conectarse a Oracle Server? ¿Se trata
de un privilegio de objeto o del sistema?
_____________________________________________________________________
2. ¿Qué privilegio se debe otorgar a un usuario para crear tablas?
_____________________________________________________________________
3. Si crea una tabla, ¿quién puede transferir privilegios a otros usuarios en su tabla?
_____________________________________________________________________
4. Usted es el DBA. Está creando muchos usuarios que requieren los mismos privilegios
del sistema.
¿Qué debería utilizar para facilitar el trabajo?
_____________________________________________________________________
5. ¿Qué comando se utiliza para cambiar la contraseña?
_____________________________________________________________________
B

6. Otorgue acceso a su tabla DEPARTMENTS a otro usuario. Haga que el usuario le


as L í

otorgue acceso de consulta a su tabla DEPARTMENTS.


7. Consulte todas las filas de la tabla DEPARTMENTS.
e
SQ Gu
de Fu de
D da Al
at m u


os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 1-21


42
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 1 (continuación)
8. Agregue una nueva fila a su tabla DEPARTMENTS. El equipo 1 debe agregar Education
como número de departamento 500. El equipo 2 debe agregar Human Resources como
número de departamento 510. Consulte la tabla del otro equipo.
9. Cree un sinónimo para la tabla DEPARTMENTS del otro equipo.
10. Consulte todas las filas de la tabla DEPARTMENTS del otro equipo mediante el sinónimo.
Team 1 SELECT statement results:


B
as L í
e
SQ Gu
de Fu de

Team 2 SELECT statement results:


D da Al
at m u
os e m
n
a

O ta o
ra ls
l


cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 1-22


43
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 1 (continuación)
11. Consulte el diccionario de datos USER_TABLES para ver información sobre las tablas
que son de su propiedad.

12. Consulte la vista de diccionario de datos ALL_TABLES para ver información sobre todas
las tablas a las que puede acceder. Excluya las tablas de su propiedad.
Nota: La lista que obtenga puede que no coincida exactamente con la que se muestra a
continuación.
B
as L í


e
SQ Gu
de Fu de

13. Revoque el privilegio SELECT del otro equipo.


D da Al

14. Elimine la fila que insertó en la tabla DEPARTMENTS en el paso 8 y guarde los cambios.
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 1-23


44
Introducción a Oracle 10g: SQL Fundamentals II

B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 1-24


45
Introducción a Oracle 10g: SQL Fundamentals II

Gestión de Objetos de Esquema


B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

46
Introducción a Oracle 10g: SQL Fundamentals II

Objetivos

Al finalizar esta lección, debería estar capacitado para:


• Agregar restricciones
• Crear índices
• Crear índices mediante la sentencia CREATE
TABLE
• Crear índices basados en funciones
• Borrar columnas y definir columnas como UNUSED
• Realizar operaciones FLASHBACK
• Crear y utilizar tablas externas
B
as L í
e
SQ Gu
de Fu de

Objetivos
D da Al

Esta lección contiene información sobre la creación de índices y restricciones, así como sobre
la modificación de objetos existentes. También recibirá información sobre tablas externas y la
at m u

provisión para asignar un nombre el índice en el momento de la creación de una restricción de


clave primaria.
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-2


47
Introducción a Oracle 10g: SQL Fundamentals II

Sentencia ALTER TABLE

Utilice la sentencia ALTER TABLE para:


• Agregar una nueva columna
• Modificar una columna existente
• Definir un valor por defecto para la nueva columna
• Borrar una columna
B
as L í
e
SQ Gu
de Fu de

Sentencia ALTER TABLE


D da Al

Después de crear una tabla, puede que necesite cambiar la estructura de tabla porque ha
omitido una columna, se debe cambiar la definición de columna o debe eliminar columnas.
at m u

Puede hacerlo mediante la sentencia ALTER TABLE.


os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-3


48
Introducción a Oracle 10g: SQL Fundamentals II

Sentencia ALTER TABLE

Utilice la sentencia ALTER TABLE para agregar,


modificar o borrar columnas.
ALTER TABLE table
ADD (column datatype [DEFAULT expr]
[, column datatype]...);

ALTER TABLE table


MODIFY (column datatype [DEFAULT expr]
[, column datatype]...);
B

ALTER TABLE table


DROP (column);
as L í
e
SQ Gu
de Fu de

Sentencia ALTER TABLE (continuación)


D da Al

Puede agregar columnas a una tabla, modificar columnas y borrar columnas de una tabla
mediante la sentencia ALTER TABLE.
at m u

En la sintaxis:
os e m

table es el nombre de la tabla


n

ADD|MODIFY|DROP es el tipo de modificación


a

column es el nombre de la nueva columna


datatype es el tipo de datos y la longitud de la nueva columna
O ta o

DEFAULT expr especifica el valor por defecto para una nueva columna
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-4


49
Introducción a Oracle 10g: SQL Fundamentals II

Adición de una Columna

• Se utiliza la cláusula ADD para agregar columnas.


ALTER TABLE dept80
ADD (job_id VARCHAR2(9));
Table altered.

• La nueva columna se convierte en la última.


B


as L í
e
SQ Gu
de Fu de

Instrucciones para Agregar una Columna


D da Al

• Puede agregar o modificar columnas.


• No puede especificar dónde aparecerá la columna. La nueva columna se convierte en la
at m u

última.
El ejemplo de la diapositiva agrega una columna denominada JOB_ID a la tabla DEPT80.
os e m
n

La columna JOB_ID se convierte en la última columna de la tabla.


a

Nota: Si una tabla ya contiene filas cuando se agrega una columna, la nueva columna es nula
inicialmente para todas las filas. No puede agregar una columna NOT NULL obligatoria a una
O ta o

tabla que contiene datos en otras columnas. Sólo puede agregar una columna NOT NULL a
ra ls

una tabla vacía.


l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-5


50
Introducción a Oracle 10g: SQL Fundamentals II

Modificación de una Columna

• Puede cambiar el tipo de datos de una columna,


su tamaño y el valor por defecto.
ALTER TABLE dept80
MODIFY (last_name VARCHAR2(30));
Table altered.
• Un cambio en el valor por defecto sólo afecta a las
siguientes inserciones en la tabla.
B
as L í
e
SQ Gu
de Fu de

Modificación de una Columna


D da Al

Puede modificar una definición de columna mediante la sentencia ALTER TABLE con la
cláusula MODIFY. La modificación de columnas puede incluir cambios en el tipo de datos de
at m u

una columna, su tamaño y el valor por defecto.


os e m

Instrucciones
n

• Puede aumentar el ancho o la precisión de una columna numérica.


a

• Puede aumentar el ancho de las columnas numéricas o de caracteres.


• Puede reducir el ancho de una columna si:
O ta o

- La columna contiene sólo valores nulos


ra ls

- La tabla no tiene ninguna fila


l

- La reducción en el ancho de columna no es menor que los valores existentes en esa


cl I

columna
n

• Puede cambiar el tipo de datos si la columna contiene sólo valores nulos. La excepción
e I

son las conversiones CHAR a VARCHAR2, que se pueden realizar con datos en las
columnas.
10

• Puede convertir una columna CHAR al tipo de datos VARCHAR2 o convertir una
columna VARCHAR2 al tipo de datos CHAR sólo si la columna contiene valores nulos o
n

si no cambia el tamaño.
g

• Un cambio en el valor por defecto de una columna sólo afecta a las siguientes
inserciones en la tabla.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-6


51
Introducción a Oracle 10g: SQL Fundamentals II

Borrado de una Columna

Utilice la cláusula DROP COLUMN para borrar las


columnas de la tabla que ya no necesite.

ALTER TABLE dept80


DROP COLUMN job_id;
Table altered.
B
as L í
e
SQ Gu
de Fu de

Borrado de una Columna


D da Al

Puede borrar una columna de una tabla mediante la sentencia ALTER TABLE con la cláusula
DROP COLUMN.
at m u

Instrucciones
os e m

• La columna puede contener o no datos.


n

• Mediante la sentencia ALTER TABLE, sólo se puede borrar una columna cada vez.
a

• Debe quedar al menos una columna en la tabla después de la modificación.


• Una vez borrada una columna, no se puede recuperar.
O ta o

• Una columna no se puede borrar si forma parte de una restricción o de una clave de
ra ls

índice a menos que se agregue la opción de cascada.


l

• El borrado de una columna puede tardar si la columna tiene muchos valores. En este
cl I

caso, es posible que sea mejor definirla como no utilizada y borrarla cuando haya menos
n

usuarios en el sistema para evitar bloqueos extendidos.


e I

Nota: Hay columnas que no se pueden borrar nunca, como las que forman parte de la clave de
partición de una tabla particionada o las columnas que forman parte de la clave primaria de
10

una tabla organizada por índice.


n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-7


52
Introducción a Oracle 10g: SQL Fundamentals II

Opción SET UNUSED

• Utilice la opción SET UNUSED para marcar una o más


columnas como no utilizadas.
• Utilice la opción DROP UNUSED COLUMNS para eliminar
las columnas marcadas como no utilizadas.
ALTER TABLE <table_name>
SET UNUSED(<column_name>);
OR
ALTER TABLE <table_name>
SET UNUSED COLUMN <column_name>;

ALTER TABLE <table_name>


B

DROP UNUSED COLUMNS;


as L í
e
SQ Gu
de Fu de

Opción SET UNUSED


D da Al

La opción SET UNUSED marca una o más columnas como no utilizadas para que se puedan
borrar cuando la demanda de recursos del sistema sea menor. La especificación de esta
at m u

cláusula no elimina realmente las columnas de destino de cada fila de la tabla (es decir, no
restaura el espacio en disco que utilizan estas columnas). Por lo tanto, el tiempo de respuesta
os e m
n

es más rápido que si ejecuta la cláusula DROP. Las columnas no utilizadas se tratan como si
a

se hubieran borrado, incluso aunque sus datos de columna sigan estando en las filas de la
tabla. Si una columna se ha marcado como no utilizada, no se puede acceder a ella. Una
O ta o

consulta SELECT * no recuperará datos de columnas no utilizadas. Además los nombres y


los tipos de columnas marcadas como no utilizadas no se mostrarán durante una sentencia
ra ls
l

DESCRIBE y puede agregar una nueva columna a la tabla con el mismo nombre que una
columna no utilizada. La información SET UNUSED se almacena en la vista de diccionario
cl I
n

USER_UNUSED_COL_TABS.
e I

Nota: Las instrucciones para definir una columna como UNUSED son parecidas a las que se
aplican al borrado de una columna.
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-8


53
Introducción a Oracle 10g: SQL Fundamentals II

Opción DROP UNUSED COLUMNS


DROP UNUSED COLUMNS elimina de la tabla todas las columnas marcadas actualmente
como no utilizadas. Puede utilizar esta sentencia si desea reclamar el espacio en disco
adicional de las columnas no utilizadas en la tabla. Si la tabla no contiene tablas no utilizadas,
la sentencia no devuelve ningún error.
ALTER TABLE dept80
SET UNUSED (last_name);
Table altered.

ALTER TABLE dept80


DROP UNUSED COLUMNS;
Table altered.
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-9


54
Introducción a Oracle 10g: SQL Fundamentals II

Adición de una Sintaxis de Restricción

Utilice la sentencia ALTER TABLE para:


• Agregar o borrar una restricción, pero sin modificar
su estructura
• Activar o desactivar restricciones
• Agregar una restricción NOT NULL mediante la
cláusula MODIFY
ALTER TABLE <table_name>
ADD [CONSTRAINT <constraint_name>]
type (<column_name>);
B
as L í
e
SQ Gu
de Fu de

Adición de una Restricción


D da Al

Puede agregar una restricción para tablas existentes mediante la sentencia ALTER TABLE
con la cláusula ADD.
at m u

En la sintaxis:
os e m

table es el nombre de la tabla


n

constraint es el nombre de la restricción


a

type es el tipo de restricción


column es el nombre de la columna a la que afecta la restricción
O ta o

La sintaxis de nombre de restricción es opcional, aunque se recomienda. Si no asigna nombres


ra ls

a las restricciones, el sistema los generará.


l

Instrucciones
cl I

• Puede agregar, borrar, activar o desactivar una restricción, pero no puede modificar su
n

estructura.
e I

• Puede agregar una restricción NOT NULL a una columna existente mediante la cláusula
MODIFY de la sentencia ALTER TABLE.
10

Nota: Puede definir una columna NOT NULL sólo si la tabla está vacía o si la columna tiene
n

un valor para todas las filas.


g

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-10


55
Introducción a Oracle 10g: SQL Fundamentals II

Adición de una Restricción

Agregue una restricción FOREIGN KEY a la tabla EMP2


que indique que ya debe existir un supervisor como
empleado válido en la tabla EMP2.
ALTER TABLE emp2
modify employee_id Primary Key;
Table altered.

ALTER TABLE emp2


ADD CONSTRAINT emp_mgr_fk
FOREIGN KEY(manager_id)
B

REFERENCES emp2(employee_id);
Table altered.
as L í
e
SQ Gu
de Fu de

Adición de una Restricción (continuación)


D da Al

El primer ejemplo de la diapositiva modifica la tabla EMP2 para agregar una restricción
PRIMARY KEY en la columna EMPLOYEE_ID. Observe que, como no se proporciona un
at m u

nombre de restricción, Oracle Server lo especifica automáticamente. El segundo ejemplo de la


diapositiva crea una restricción FOREIGN KEY en la tabla EMP2. La restricción asegura que
os e m
n

existe un supervisor como empleado válido en la tabla EMP2.


a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-11


56
Introducción a Oracle 10g: SQL Fundamentals II

ON DELETE CASCADE

Suprima las filas secundarias al suprimir una clave


principal.
ALTER TABLE Emp2 ADD CONSTRAINT emp_dt_fk
FOREIGN KEY (Department_id)
REFERENCES departments ON DELETE CASCADE);
Table altered.
B
as L í
e
SQ Gu
de Fu de

ON DELETE CASCADE
D da Al

La acción ON DELETE CASCADE permite que se supriman los datos de clave principal a los
que se hace referencia desde la tabla secundaria, pero no que se actualicen. Cuando se
at m u

suprimen los datos de la clave principal, también se suprimen todas las filas de la tabla
secundaria que dependen de los valores de la clave principal suprimida. Para especificar esta
os e m
n

acción referencial, incluya la opción ON DELETE CASCADE en la definición de la


a

restricción FOREIGN KEY.


O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-12


57
Introducción a Oracle 10g: SQL Fundamentals II

Diferir Restricciones

Las restricciones pueden tener estos atributos:


• DEFERRABLE o NOT DEFERRABLE
• INITIALLY DEFERRED o INITIALLY IMMEDIATE
Diferir restricciones en el
ALTER TABLE dept2 momento de la creación
ADD CONSTRAINT dept2_id_pk
PRIMARY KEY (department_id)
DEFERRABLE INITIALLY DEFERRED

Cambio de un atributo
SET CONSTRAINTS dept2_id_pk IMMEDIATE específico de restricción
B

ALTER SESSION Cambio de todas las


as L í

restricciones para una sesión


SET CONSTRAINTS= IMMEDIATE
e
SQ Gu
de Fu de

Diferir Restricciones
D da Al

Se puede diferir la comprobación de validez de las restricciones hasta el final de la transacción.


Una restricción es diferida si el sistema comprueba que se satisface únicamente en el momento
at m u

de la validación. Si se viola una restricción diferida, la validación provoca que se haga rollback
de la transacción. Si una restricción es inmediata (no diferida), se comprueba al final de cada
os e m
n

sentencia. Si se viola, se hace rollback de la sentencia de forma inmediata. Si una restricción


a

provoca una acción (por ejemplo, DELETE CASCADE), esa acción se toma siempre como
parte de la sentencia que la provocó, independientemente de que la restricción sea diferida o
O ta o

inmediata. Utilice la restricción SET CONSTRAINTS para especificar, para una transacción en
particular, si se comprueban las restricciones diferibles después de cada sentencia DML o en el
ra ls
l

momento de la validación de la transacción. Para crear restricciones diferibles, debe crear un


índice no único para esa restricción.
cl I
n

Puede definir restricciones como diferibles o no diferibles y como inicialmente diferidas o


e I

inicialmente inmediatas. Estos atributos pueden ser diferentes para cada restricción.
Supuesto de uso: La política de la compañía dicta que el número de departamento 40 se
10

debería cambiar a 45. El cambio de la columna DEPARTMENT_ID afecta a los empleados


asignados a este departamento. Por tanto, haga que la clave primaria y las claves ajenas sean
n

diferibles e inicialmente diferidas. Actualice la información de departamentos y empleados, y


todas las filas se validarán en el momento de la validación.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-13


58
Introducción a Oracle 10g: SQL Fundamentals II

Borrado de una Restricción

• Elimine la restricción de supervisor de la tabla EMP2.


ALTER TABLE emp2
DROP CONSTRAINT emp_mgr_fk;
Table altered.

• Elimine la restricción PRIMARY KEY en la tabla DEPT2


y borre la restricción FOREIGN KEY asociada en la
columna EMP2.DEPARTMENT_ID.
ALTER TABLE dept2
DROP PRIMARY KEY CASCADE;
B

Table altered.
as L í
e
SQ Gu
de Fu de

Borrado de una Restricción


D da Al

Para borrar una restricción, puede identificar el nombre de restricción desde las vistas de
diccionario de datos USER_CONSTRAINTS y USER_CONS_COLUMNS. Utilice a
at m u

continuación la sentencia ALTER TABLE con la cláusula DROP. La opción CASCADE de la


cláusula DROP provoca que se borre también cualquier restricción dependiente.
os e m
n

Sintaxis
a

ALTER TABLE table


O ta o

DROP PRIMARY KEY | UNIQUE (column) |


CONSTRAINT constraint [CASCADE];
ra ls

En la sintaxis:
l

table es el nombre de la tabla


cl I

es el nombre de la columna a la que afecta la restricción


n

column
constraint es el nombre de la restricción
e I

Al borrar una restricción de integridad, Oracle Server ya no fuerza esa restricción y ya no está
10

disponible en el diccionario de datos.


n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-14


59
Introducción a Oracle 10g: SQL Fundamentals II

Desactivación de Restricciones

• Ejecute la cláusula DISABLE de la sentencia ALTER


TABLE para desactivar una restricción de integridad.
• Aplique la opción CASCADE para desactivar las
restricciones de integridad dependientes.
ALTER TABLE emp2
DISABLE CONSTRAINT emp_dt_fk;
Table altered.
B
as L í
e
SQ Gu
de Fu de

Desactivación de una Restricción


D da Al

Puede desactivar una restricción sin borrarla ni volverla a crear mediante la sentencia ALTER
TABLE con la cláusula DISABLE.
at m u

Sintaxis
os e m

ALTER TABLE table


n
a

DISABLE CONSTRAINT constraint [CASCADE];


En la sintaxis:
O ta o

table es el nombre de la tabla


constraint es el nombre de la restricción
ra ls
l

Instrucciones
• Puede utilizar la cláusula DISABLE en las sentencias CREATE TABLE y
cl I
n

ALTER TABLE.
• La cláusula CASCADE desactiva las restricciones de integridad dependientes.
e I

• La desactivación de una restricción de clave primaria o única elimina el índice único.


10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-15


60
Introducción a Oracle 10g: SQL Fundamentals II

Activación de Restricciones

• Active una restricción de integridad actualmente


desactivada en la definición de tabla mediante la
cláusula ENABLE.
ALTER TABLE emp2
ENABLE CONSTRAINT emp_dt_fk;
Table altered.
• Se crea automáticamente un índice UNIQUE si
activa una restricción UNIQUE o PRIMARY KEY.
B
as L í
e
SQ Gu
de Fu de

Activación de una Restricción


D da Al

Puede activar una restricción sin borrarla ni volverla a crear mediante la sentencia ALTER
TABLE con la cláusula ENABLE.
at m u

Sintaxis
os e m

ALTER TABLE table


n

ENABLE CONSTRAINT constraint;


a

En la sintaxis:
O ta o

table es el nombre de la tabla


constraint es el nombre de la restricción
ra ls

Instrucciones
l

• Si activa una restricción, esa restricción se aplica a todos los datos de la tabla. Todos los
cl I

datos de la tabla deben cumplir con la restricción.


n

• Si activa una restricción UNIQUE o PRIMARY KEY, se crea automáticamente un índice


e I

UNIQUE o PRIMARY KEY. Si ya existe un índice, lo pueden utilizar estas claves.


• Puede utilizar la cláusula ENABLE en las sentencias CREATE TABLE y ALTER TABLE.
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-16


61
Introducción a Oracle 10g: SQL Fundamentals II

Activación de una Restricción (continuación)


Instrucciones (continuación)
• La activación de una restricción de clave primaria que se hubiese desactivado con la
opción CASCADE no activa las claves ajenas que sean dependientes de la clave
primaria.
• Para activar una restricción UNIQUE o PRIMARY KEY, debe disponer de los
privilegios necesarios para crear un índice en la tabla.
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-17


62
Introducción a Oracle 10g: SQL Fundamentals II

Restricciones en Cascada

• La cláusula CASCADE CONSTRAINTS se utiliza


junto con la cláusula DROP COLUMN.
• La cláusula CASCADE CONSTRAINTS borra todas
las restricciones de integridad referencial que
hacen referencia a las claves única y primaria
definidas en las columnas borradas.
• La cláusula CASCADE CONSTRAINTS también borra
todas las restricciones de varias columnas
definidas en las columnas borradas.
B
as L í
e
SQ Gu
de Fu de

Restricciones en Cascada
D da Al

Esta sentencia ilustra el uso de la cláusula CASCADE CONSTRAINTS. Suponga que se crea la
tabla TEST1 de este modo:
at m u

CREATE TABLE test1 (


pk NUMBER PRIMARY KEY,
os e m
n

fk NUMBER,
a

col1 NUMBER,
col2 NUMBER,
O ta o

CONSTRAINT fk_constraint FOREIGN KEY (fk) REFERENCES test1,


CONSTRAINT ck1 CHECK (pk > 0 and col1 > 0),
ra ls

CONSTRAINT ck2 CHECK (col2 > 0));


l

Se devuelve un error para las siguientes sentencias:


cl I

ALTER TABLE test1 DROP (pk); —pk es una clave principal.


n

ALTER TABLE test1 DROP (col1); —la restricción de varias columnas ck1
e I

hace referencia a col1.


10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-18


63
Introducción a Oracle 10g: SQL Fundamentals II

Restricciones en Cascada

Ejemplo:

ALTER TABLE emp2


DROP COLUMN employee_id CASCADE CONSTRAINTS;
Table altered.

ALTER TABLE test1


DROP (pk, fk, col1) CASCADE CONSTRAINTS;
Table altered.
B
as L í
e
SQ Gu
de Fu de

Restricciones en Cascada (continuación)


D da Al

Al ejecutar la siguiente sentencia, se borra la columna EMPLOYEE_ID, la restricción de clave


primaria y las restricciones de clave ajena que hacen referencia a la restricción de clave
at m u

primaria para la tabla EMP2:


ALTER TABLE emp2 DROP COLUMN employee_id CASCADE CONSTRAINTS;
os e m
n

Si se borran también todas las columnas a las que hacen referencia las restricciones definidas en
a

las columnas borradas, CASCADE CONSTRAINTS no es necesario. Por ejemplo, suponiendo


que ninguna otra restricción referencial de otras tablas hace referencia a la columna PK, es
O ta o

válido ejecutar la siguiente sentencia sin la cláusula CASCADE CONSTRAINTS para la tabla
ra ls

TEST1 creada en la página anterior:


l

ALTER TABLE test1 DROP (pk, fk, col1);


cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-19


64
Introducción a Oracle 10g: SQL Fundamentals II

Visión General de Índices

Los índices se crean:


• Automáticamente
– Creación de PRIMARY KEY
– Creación de UNIQUE KEY
• Manualmente
– Sentencia CREATE INDEX
– Sentencia CREATE TABLE
B
as L í
e
SQ Gu
de Fu de

Visión General de Índices


D da Al

Se pueden crear dos tipos de índices. Un tipo es el índice único. Oracle Server crea
automáticamente un índice único si se define una columna o un grupo de columnas en una
at m u

tabla para tener una restricción PRIMARY KEY o UNIQUE. El nombre del índice es el
nombre que se asigna a la restricción.
os e m
n

El otro tipo de índice es el no único y lo puede crear un usuario. Por ejemplo, puede crear un
a

índice de columna FOREIGN KEY que se utilizará en uniones para mejorar la velocidad de
recuperación.
O ta o

Puede crear un índice en una o más columnas mediante la emisión de la sentencia


ra ls

CREATE INDEX.
l

Para obtener más información, consulte Oracle Database 10g SQL Reference.
cl I
n

Nota: Puede crear manualmente un índice único, pero se recomienda que cree una restricción
única, lo que crea implícitamente un índice único.
e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-20


65
Introducción a Oracle 10g: SQL Fundamentals II

CREATE INDEX con Sentencia CREATE TABLE

CREATE TABLE NEW_EMP


(employee_id NUMBER(6)
PRIMARY KEY USING INDEX
(CREATE INDEX emp_id_idx ON
NEW_EMP(employee_id)),
first_name VARCHAR2(20),
last_name VARCHAR2(25));
Table created.

SELECT INDEX_NAME, TABLE_NAME


FROM USER_INDEXES
B

WHERE TABLE_NAME = 'NEW_EMP';


as L í
e
SQ Gu
de Fu de

CREATE INDEX con Sentencia CREATE TABLE


D da Al

En el ejemplo de la diapositiva, se utiliza la cláusula CREATE INDEX con la sentencia


CREATE TABLE para crear un índice de clave primaria explícitamente. Puede asignar
at m u

nombres a los índices en el momento de la creación de la clave primaria para que sean
diferentes al nombre de la restricción PRIMARY KEY. El siguiente ejemplo muestra el
os e m
n

comportamiento de la base de datos si no se asigna un nombre al índice explícitamente


a

CREATE TABLE EMP_UNNAMED_INDEX


(employee_id NUMBER(6) PRIMARY KEY ,
O ta o

first_name VARCHAR2(20),
ra ls

last_name VARCHAR2(25));
l

Table created.
cl I
n

SELECT INDEX_NAME, TABLE_NAME


FROM USER_INDEXES
e I

WHERE TABLE_NAME = 'EMP_UNNAMED_INDEX';


10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-21


66
Introducción a Oracle 10g: SQL Fundamentals II

CREATE INDEX con Sentencia CREATE TABLE (continuación)


Observe que Oracle Server asigna un nombre genérico al índice que se crea para la columna
PRIMARY KEY.
También puede utilizar un índice existente para la columna PRIMARY KEY, por ejemplo
cuando espera una carga grande de datos y desea acelerar la operación. Le conviene
desactivar las restricciones durante la carga y activarlas después, en cuyo caso el hecho de
tener un índice único en la clave primaria seguirá haciendo que se verifiquen los datos durante
la carga. Así pues, puede crear primero un índice no único en la columna designada como
PRIMARY KEY, crear a continuación la columna PRIMARY KEY y especificar que debería
utilizar el índice existente. Los siguientes ejemplos ilustran el proceso:

Paso 1: Creación de la Tabla

CREATE TABLE NEW_EMP2


( employee_id NUMBER(6)
first_name VARCHAR2(20),
last_name VARCHAR2(25)
);

Paso 2: Creación del Índice


B

CREATE INDEX emp_id_idx2 ON


as L í

new_emp2(employee_id);

Paso 3: Creación de la Clave Primaria


e

ALTER TABLE new_emp2 ADD PRIMARY KEY (employee_id) USING INDEX


SQ Gu

emp_id_idx2;
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-22


67
Introducción a Oracle 10g: SQL Fundamentals II

Índices Basados en Funciones

• Un índice basado en funciones se basa en


expresiones.
• La expresión del índice se genera a partir de
columnas de tablas, constantes, funciones SQL y
funciones definidas por el usuario.
CREATE INDEX upper_dept_name_idx
ON dept2(UPPER(department_name));

Index created.
B

SELECT *
FROM dept2
as L í

WHERE UPPER(department_name) = 'SALES';


e
SQ Gu
de Fu de

Índices Basados en Funciones


D da Al

Los índices basados en funciones definidos con las palabras clave UPPER(column_name)
o LOWER(column_name) permiten búsquedas no sensibles a mayúsculas/minúsculas. Por
at m u

ejemplo, el siguiente índice:


os e m

CREATE INDEX upper_last_name_idx ON emp2 (UPPER(last_name));


n
a

facilita el procesamiento de consultas como:


SELECT * FROM emp2 WHERE UPPER(last_name) = 'KING';
O ta o

Oracle Server utiliza el índice únicamente si esa función en particular se utiliza en una
consulta. Por ejemplo, la siguiente sentencia puede utilizar el índice, pero sin la cláusula
ra ls
l

WHERE Oracle Server puede realizar una exploración de tablas completas:


SELECT *
cl I
n

FROM employees
e I

WHERE UPPER (last_name) IS NOT NULL


ORDER BY UPPER (last_name);
10

Nota: Se debe definir el parámetro de inicialización QUERY_REWRITE_ENABLED en TRUE


para que se utilice un índice basado en funciones.
n

Oracle Server trata los índices con columnas marcadas como DESC como índices basados en
funciones. Las columnas marcadas como DESC se clasifican en orden descendente.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-23


68
Introducción a Oracle 10g: SQL Fundamentals II

Eliminación de un Índice

• Elimine un índice del diccionario de datos


mediante el comando DROP INDEX.
DROP INDEX index;

• Elimine el índice UPPER_DEPT_NAME_IDX del


diccionario de datos.
DROP INDEX upper_dept_name_idx;
Index dropped.
• Para borrar un índice, debe ser el propietario del
B

índice o tener el privilegio DROP ANY INDEX.


as L í
e
SQ Gu
de Fu de

Eliminación de un Índice
D da Al

Los índices no se pueden modificar. Para cambiar un índice, debe borrarlo y volverlo a crear.
Para eliminar una definición de índice del diccionario de datos, emita la sentencia DROP
at m u

INDEX. Para borrar un índice, debe ser el propietario del índice o tener el privilegio DROP
ANY INDEX.
os e m
n

En la sintaxis:
a

index es el nombre del índice


O ta o

Nota: Si borra una tabla, los índices y las restricciones se borran automáticamente, pero las
vistas y las secuencias permanecen.
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-24


69
Introducción a Oracle 10g: SQL Fundamentals II

DROP TABLE …PURGE

DROP TABLE dept80 PURGE;


B
as L í
e
SQ Gu
de Fu de

DROP TABLE …PURGE


D da Al

La base de datos Oracle 10g presenta una nueva función para borrar tablas. Al borrar una
tabla, la base de datos no libera inmediatamente el espacio asociado a la tabla. En su lugar, la
at m u

base de datos cambia el nombre de la tabla y la coloca en una papelera de reciclaje, de donde
se podrá recuperar después con la sentencia FLASHBACK TABLE si se da cuenta de que
os e m
n

borró la tabla por error. Si desea liberar de forma inmediata el espacio asociado a la tabla en
a

el momento de emitir la sentencia DROP TABLE, incluya la cláusula PURGE como se


muestra en la sentencia de la diapositiva.
O ta o

Especifique PURGE sólo si desea borrar la tabla y liberar el espacio asociado a ella en un solo
ra ls

paso. Si especifica PURGE, la base de datos no coloca la tabla y sus objetos dependientes en
l

la papelera de reciclaje.
cl I

La utilización de esta cláusula es equivalente a borrar primero la tabla y purgarla después de


n

la papelera de reciclaje. Esta cláusula le ahorra un paso en el proceso. Proporciona también


e I

una seguridad mejorada si desea evitar que aparezca material sensible en la papelera de
reciclaje.
10

Nota: No puede hacer rollback de una sentencia DROP TABLE con la cláusula PURGE, ni
n

tampoco puede recuperar la tabla si la ha borrado con la cláusula PURGE. Esta función no
g

estaba disponible en versiones anteriores.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-25


70
Introducción a Oracle 10g: SQL Fundamentals II

Sentencia FLASHBACK TABLE

• Herramienta de reparación para modificaciones


accidentales de tabla
– Restaura una tabla a un punto anterior en el tiempo
– Ventajas: Facilidad de uso, disponibilidad y
ejecución rápida
– Se realiza in situ
• Sintaxis:

FLASHBACK TABLE[schema.]table[,
[ schema.]table ]...
B

TO { TIMESTAMP | SCN } expr


[ { ENABLE | DISABLE } TRIGGERS ];
as L í
e
SQ Gu
de Fu de

Sentencia FLASHBACK TABLE


D da Al

Utilidad de Reparación de Autoservicio


La base de datos Oracle 10g proporciona un nuevo comando DDL de SQL, FLASHBACK
at m u

TABLE, para restaurar el estado de una tabla a un punto anterior en el tiempo en el caso de
que la haya suprimido o modificado de forma accidental. El comando FLASHBACK TABLE
os e m
n

es una herramienta de reparación de autoservicio para restaurar datos de una tabla junto con
a

los atributos asociados como, por ejemplo, índices o vistas. Esto se consigue cuando la base
de datos está online haciendo rollback sólo de los cambios posteriores en la tabla en cuestión.
O ta o

Si se compara con mecanismos de recuperación tradicionales, esta función ofrece ventajas


significativas, como la facilidad de uso, la disponibilidad y una recuperación más rápida.
ra ls

También libera al DBA del trabajo de encontrar y restaurar propiedades específicas de


l

aplicación. La función de flashback en tabla no se ocupa de la corrupción física provocada por


cl I

un disco en mal estado.


n

Sintaxis
e I

Puede llamar a una operación de flashback en tabla en una o más tablas, incluso en tablas de
diferentes esquemas. Para especificar el punto en el tiempo al que desea revertir, proporcione
10

un registro de hora válido. Por defecto, los disparadores de base de datos están desactivados
n

para todas las tablas implicadas. Para sustituir este comportamiento por defecto, especifique
g

la cláusula ENABLE TRIGGERS.


Nota: Para obtener más información sobre la semántica de flashback y de papelera de
reciclaje, consulte Oracle Database Administrator’s Reference 10g Release 1 (10.1).

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-26


71
Introducción a Oracle 10g: SQL Fundamentals II

Sentencia FLASHBACK TABLE

DROP TABLE emp2;


Table dropped

SELECT original_name, operation, droptime,


FROM recyclebin;

FLASHBACK TABLE emp2 TO BEFORE DROP;


Flashback complete
B
as L í
e
SQ Gu
de Fu de

Sentencia FLASHBACK TABLE (continuación)


D da Al

Sintaxis y Ejemplos (continuación)


at m u

El ejemplo restaura la tabla EMP2 a un estado anterior a una sentencia DROP.


La papelera de reciclaje es en realidad una tabla de diccionario de datos que contiene
os e m

información sobre objetos borrados. Las tablas borradas y los objetos asociados, como
n
a

índices, restricciones, tablas anidadas, etc., no se eliminan y siguen ocupando espacio. Siguen
ocupando las cuotas de espacio de usuario, hasta que se purgan específicamente de la papelera
O ta o

de reciclaje o hasta que se produce una situación poco probable en la que las deba purgar la
base de datos debido a restricciones de espacio de tablespace.
ra ls

Se puede considerar a cada usuario propietario de una papelera de reciclaje, ya que, a menos
l

que un usuario tenga el privilegio SYSDBA, los únicos objetos a los que puede acceder en la
cl I

papelera de reciclaje son los de su propiedad. Un usuario puede ver sus objetos en la papelera
n

de reciclaje mediante la siguiente sentencia:


e I

SELECT * FROM RECYCLEBIN;


10

Al borrar un usuario, los objetos que pertenecen a ese usuario no se colocarán en la papelera
de reciclaje y se purgarán todos los objetos de la papelera de reciclaje.
n

Puede purgar la papelera de reciclaje con la siguiente sentencia:


g

PURGE RECYCLEBIN;

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-27


72
Introducción a Oracle 10g: SQL Fundamentals II

Tablas Externas
B
as L í
e
SQ Gu
de Fu de

Tablas Externas
D da Al

Una tabla externa es una tabla de sólo lectura cuyos metadatos se almacenan en la base de
datos pero cuyos datos se almacenan fuera de la base de datos. Esta definición de tabla
at m u

externa se puede considerar una vista que se utiliza para ejecutar cualquier consulta SQL en
datos externos sin necesidad de que se carguen primero los datos externos en la base de datos.
os e m
n

Los datos de tabla externa se pueden consultar y unir directamente y en paralelo sin necesidad
a

de que se carguen primero los datos externos en la base de datos. Puede utilizar SQL, PL/SQL
y Java para consultar los datos en una tabla externa.
O ta o

La diferencia principal entre las tablas externas y las normales es que las tablas organizadas
ra ls

externamente son de sólo lectura. No son posibles las operaciones DML y no se pueden crear
l

índices en ellas. Sin embargo, se puede crear una tabla externa (y, por tanto, descargar datos)
cl I

mediante el comando CREATE TABLE AS SELECT.


n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-28


73
Introducción a Oracle 10g: SQL Fundamentals II

Tablas Externas (continuación)


Oracle Server proporciona dos controladores de acceso principales para las tablas externas.
Uno de ellos es el controlador de acceso de cargador (u ORACLE_LOADER), que se utiliza
para leer datos de archivos externos cuyo formato se puede interpretar mediante la utilidad
SQL*Loader. Observe que no se soporta toda la funcionalidad de SQL*Loader con tablas
externas.
El controlador de acceso ORACLE_DATAPUMP se puede utilizar para importar y exportar
datos mediante un formato independiente de la plataforma. El controlador de acceso
ORACLE_DATAPUMP escribe filas de una sentencia SELECT que se cargarán en una tabla
externa como parte de la sentencia CREATE TABLE...ORGANIZATION
EXTERNAL...AS SELECT. Puede utilizar SELECT para leer datos de ese archivo de
datos. También puede crear una definición de tabla externa en otro sistema y utilizar ese
archivo de datos. Esto permite que se muevan datos entre bases de datos Oracle.
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-29


74
Introducción a Oracle 10g: SQL Fundamentals II

Creación de un Directorio para la Tabla Externa

Cree un objeto DIRECTORY que se corresponda con el


directorio del sistema de archivos en el que reside el
origen de datos externo.

CREATE OR REPLACE DIRECTORY emp_dir


AS '/…/emp_dir';

GRANT READ ON DIRECTORY emp_dir TO hr;


B
as L í
e
SQ Gu
de Fu de

Ejemplo de Creación de una Tabla Externa


D da Al

Utilice el comando CREATE DIRECTORY para crear un objeto de directorio. Un objeto de


directorio especifica un alias para un directorio en el sistema de archivos del servidor en el
at m u

que reside un origen de datos externo. Puede utilizar nombres de directorio al hacer referencia
a un origen de datos externo, en lugar de predefinir el nombre de ruta de acceso de sistema
os e m
n

operativo, para obtener una mayor flexibilidad en la gestión de archivos.


a

Debe tener privilegios del sistema CREATE ANY DIRECTORY para crear directorios. Al
crear un directorio, se le otorgan automáticamente los privilegios de objeto READ y WRITE, y
O ta o

puede otorgar privilegios READ y WRITE a otros usuarios y roles. El DBA también puede
otorgar estos privilegios a otros usuarios y roles.
ra ls
l

Un usuario necesita privilegios READ para todos los directorios que se utilizan en las tablas
externas a las que haya que acceder y privilegios WRITE para las ubicaciones de los archivos
cl I

log, de errores y de desechos que se estén utilizando.


n

Además, es necesario un privilegio WRITE cuando el marco de tablas externas se utilice para
e I

descargar datos.
10

Oracle proporciona además el tipo ORACLE_DATAPUMP, con el que se pueden descargar


datos (es decir, leer datos de una tabla de la base de datos e insertarlos en una tabla externa) y
n

recargarlos después en una base de datos Oracle. Se trata de una operación que sólo se realiza
g

una vez y que se puede hacer al crear la tabla. Después de la creación y del relleno inicial, no
se puede actualizar, insertar ni suprimir ninguna fila.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-30


75
Introducción a Oracle 10g: SQL Fundamentals II

Ejemplo de Creación de una Tabla Externa (continuación)


Sintaxis
CREATE [OR REPLACE] DIRECTORY AS 'path_name';
En la sintaxis:
OR REPLACE Especifique OR REPLACE para volver a crear el objeto de
base de datos de directorio si ya existe. Puede utilizar esta
cláusula para cambiar la definición de un directorio existente
sin borrar, volver a crear y volver a otorgar privilegios de
objeto de base de datos anteriormente otorgados en el
directorio. Los usuarios a los que se otorgaron privilegios
anteriormente en un directorio redefinido pueden seguir
accediendo al directorio sin necesidad de que se vuelvan a
otorgar los privilegios.
directory Especifique el nombre del objeto de directorio que se va a
crear. La longitud máxima del nombre de directorio es de
30 bytes. No se puede cualificar un objeto de directorio con un
nombre de esquema.
'path_name' Especifique el nombre de ruta de acceso completa del
directorio de sistema operativo en el resultado. Observe que el
B

nombre de ruta de acceso es sensible a mayúsculas/minúsculas.


as L í

La sintaxis para utilizar el controlador de acceso ORACLE_DATAPUMP es la siguiente:


CREATE TABLE extract_emps
e

ORGANIZATION EXTERNAL (TYPE ORACLE_DATAPUMP


SQ Gu
de Fu de

DEFAULT DIRECTORY …
ACCESS PARAMETERS (… )
LOCATION (…)
D da Al

PARALLEL 4
at m u

REJECT LIMIT UNLIMITED


AS
os e m

SELECT * FROM …;
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-31


76
Introducción a Oracle 10g: SQL Fundamentals II

Creación de una Tabla Externa

CREATE TABLE <table_name>


( <col_name> <datatype>, … )
ORGANIZATION EXTERNAL
(TYPE <access_driver_type>
DEFAULT DIRECTORY <directory_name>
ACCESS PARAMETERS
(… ) )
LOCATION ('<location_specifier>') )
REJECT LIMIT [0 | <number> | UNLIMITED];
B
as L í
e
SQ Gu
de Fu de

Creación de una Tabla Externa


D da Al

Cree tablas externas mediante la cláusula ORGANIZATION EXTERNAL de la sentencia


CREATE TABLE. De hecho, no está creando una tabla. En realidad, está creando metadatos
at m u

en el diccionario de datos que se pueden utilizar para acceder a datos externos. Utilice la
cláusula ORGANIZATION para especificar el orden en que se almacenarán las filas de datos
os e m
n

de la tabla. Al especificar EXTERNAL en la cláusula ORGANIZATION, indica que la tabla es


a

de sólo lectura y que está ubicada fuera de la base de datos. Observe que los archivos externos
deben existir ya fuera de la base de datos.
O ta o

TYPE <access_driver_type> indica el controlador de acceso de la tabla externa. El


ra ls

controlador de acceso es la API (interfaz de programación de aplicaciones) que interpreta los


l

datos externos para la base de datos. Si no especifica TYPE, Oracle utiliza el controlador de
cl I

acceso por defecto, ORACLE_LOADER. La otra opción es ORACLE_DATAPUMP.


n

Utilice la cláusula DEFAULT DIRECTORY para especificar uno o más objetos de directorio
e I

de base de datos Oracle que se correspondan con directorios del sistema de archivos en los
que puedan residir orígenes de datos externos.
10

La cláusula opcional ACCESS PARAMETERS le permite asignar valores a los parámetros del
n

controlador de acceso específico para esta tabla externa.


g

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-32


77
Introducción a Oracle 10g: SQL Fundamentals II

Creación de una Tabla Externa (continuación)


Utilice la cláusula LOCATION para especificar un localizador externo para cada origen de
datos externo. Normalmente, <location_specifier> es un archivo, pero no
necesariamente.
La cláusula REJECT LIMIT le permite especificar cuántos errores de conversión se pueden
producir durante una consulta de los datos externos antes de que se devuelva un error Oracle y
se aborte la consulta. El valor por defecto es 0.
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-33


78
Introducción a Oracle 10g: SQL Fundamentals II

Creación de una Tabla Externa mediante


ORACLE_LOADER
CREATE TABLE oldemp (
fname char(25), lname CHAR(25))
ORGANIZATION EXTERNAL
(TYPE ORACLE_LOADER
DEFAULT DIRECTORY emp_dir
ACCESS PARAMETERS
(RECORDS DELIMITED BY NEWLINE
NOBADFILE
NOLOGFILE
FIELDS TERMINATED BY ','
(fname POSITION ( 1:20) CHAR,
lname POSITION (22:41) CHAR))
LOCATION ('emp.dat'))
B

PARALLEL 5
REJECT LIMIT 200;
as L í

Table created.
e
SQ Gu
de Fu de

Ejemplo de Creación de una Tabla Externa mediante el Controlador de Acceso


D da Al

ORACLE_LOADER
Suponga que hay un archivo plano que tiene registros en el siguiente formato:
at m u

10,jones,11-Dec-1934
os e m

20,smith,12-Jun-1972
n
a

Los registros se delimitan con nuevas líneas y todos los campos llevan una coma ( , ) al final.
El nombre del archivo es: /emp_dir/emp.dat
O ta o

Para convertir este archivo en el origen de datos para una tabla externa cuyos metadatos
residirán en la base de datos, debe seguir estos pasos:
ra ls
l

1. Cree un objeto de directorio emp_dir como se indica a continuación:


CREATE DIRECTORY emp_dir AS '/emp_dir' ;
cl I

2. Ejecute el comando CREATE TABLE que se muestra en la diapositiva.


n

El ejemplo de la diapositiva ilustra la especificación de tabla para crear una tabla externa para
e I

el archivo:
10

/emp_dir/emp.dat
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-34


79
Introducción a Oracle 10g: SQL Fundamentals II

Ejemplo de Creación de una Tabla Externa mediante el Controlador de Acceso


ORACLE_LOADER (continuación)
En el ejemplo, se ofrece la especificación TYPE sólo para ilustrar su uso. ORACLE_LOADER
es el controlador de acceso por defecto si no se especifica. La opción ACCESS PARAMETERS
proporciona valores a los parámetros del controlador de acceso especificado. Estos valores los
interpreta el controlador de acceso, no Oracle Server.
La cláusula PARALLEL permite que cinco servidores de ejecución en paralelo exploren
simultáneamente los orígenes (archivos) de datos externos cuando se ejecuta la sentencia
INSERT INTO TABLE. Por ejemplo, si se especifica PARALLEL=5, puede haber más de un
servidor de ejecución en paralelo trabajando en un origen de datos. Como las tablas externas
pueden ser muy grandes, por motivos de rendimiento, es recomendable especificar la cláusula
PARALLEL o una indicación paralela para la consulta.
La cláusula REJECT LIMIT especifica que si se producen más de 200 errores de conversión
durante una consulta de los datos externos, se aborta la consulta y se devuelve un error. Estos
errores de conversión pueden surgir cuando el controlador de acceso intenta transformar los
datos del archivo de datos para que coincidan con la definición de tabla externa.
Cuando el comando CREATE TABLE se haya ejecutado correctamente, se puede describir la
tabla externa OLDEMP y se puede consultar como una tabla relacional.
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-35


80
Introducción a Oracle 10g: SQL Fundamentals II

Consulta de Tablas Externas

SELECT *
FROM oldemp
B

OLDEMP
as L í

emp.dat
e
SQ Gu
de Fu de

Consulta de Tablas Externas


D da Al

Una tabla externa no describe ningún dato que esté almacenado en la base de datos. Tampoco
describe cómo se almacenan los datos en el origen externo. En realidad, describe cómo debe
at m u

presentar los datos al servidor el nivel de tabla externa. Corresponde al controlador de acceso
y al nivel de tabla externa realizar las transformaciones necesarias en los datos del archivo de
os e m
n

datos para que coincidan con la definición de tabla externa.


a

Cuando el servidor de bases de datos accede a datos de un origen externo, llama al


controlador de acceso adecuado para obtener los datos de un origen externo en la forma que
O ta o

espera el servidor de bases de datos.


ra ls

Es importante recordar que la descripción de los datos del origen de datos está separada de la
l

definición de la tabla externa. El archivo de origen puede contener más o menos campos que
cl I

el número de columnas de la tabla. Además, los tipos de datos del origen de datos pueden ser
n

diferentes a las columnas de la tabla. El controlador de acceso se asegura de que los datos del
e I

origen de datos se procesen para que coincidan con la definición de la tabla externa.
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-36


81
Introducción a Oracle 10g: SQL Fundamentals II

Resumen

En esta lección ha aprendido a:


• Agregar restricciones
• Crear índices
• Crear una restricción de tabla primaria mediante
un índice
• Crear índices mediante la sentencia CREATE TABLE
• Crear índices basados en funciones
• Borrar columnas y definir columnas como UNUSED
• Realizar operaciones FLASHBACK
B

• Crear y utilizar tablas externas


as L í
e
SQ Gu
de Fu de

Resumen
D da Al

Modifique tablas para agregar o modificar columnas o restricciones. Cree índices e índices
basados en funciones mediante la sentencia CREATE INDEX. Borre las columnas que no se
at m u

utilizan. Utilice la mecánica FLASHBACK para restaurar tablas. Utilice la cláusula


external_table para crear una tabla externa, que es una tabla de sólo lectura cuyos
os e m
n

metadatos se almacenan en la base de datos, pero cuyos datos se almacenan fuera de la base
a

de datos. Utilice tablas externas para consultar datos sin cargarlos primero en la base de datos.
Asigne nombres a los índices de columna PRIMARY KEY al crear la tabla con la sentencia
O ta o

CREATE TABLE.
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-37


82
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 2: Visión General

Esta práctica cubre los temas siguientes:


• Modificación de tablas
• Adición de columnas
• Borrado de columnas
• Creación de índices
• Creación de tablas externas
B
as L í
e
SQ Gu
de Fu de

Práctica 2: Visión General


D da Al

En esta práctica, utilizará el comando ALTER TABLE para modificar columnas y agregar
restricciones. Utilizará el comando CREATE INDEX para crear índices al crear una tabla,
at m u

junto con el comando CREATE TABLE. Creará tablas externas. Borrará columnas y utilizará
la operación FLASHBACK.
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-38


83
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 2
1. Cree la tabla DEPT2 basada en el siguiente gráfico de instancia de tabla. Guarde la
sintaxis en un archivo de comandos denominado lab02_01.sql y, a continuación,
ejecute la sentencia en el archivo de comandos para crear la tabla. Confirme que la tabla
se ha creado.
Column Name ID NAME
Key Type
Nulls/Unique
FK Table
FK Column
Data type NUMBER VARCHAR2
Length 7 25

2. Rellene la tabla DEPT2 con datos de la tabla DEPARTMENTS. Incluya sólo las
B

columnas que necesite.


as L í

3. Cree la tabla EMP2 basada en el siguiente gráfico de instancia de tabla. Guarde la


sintaxis en un archivo de comandos denominado lab02_03.sql y, a continuación,
ejecute la sentencia en el archivo de comandos para crear la tabla. Confirme que la tabla
e

se ha creado.
SQ Gu
de Fu de

Column Name ID LAST_NAME FIRST_NAME DEPT_ID


Key Type
Nulls/Unique
D da Al

FK Table
at m u

FK Column
os e m

Data type NUMBER VARCHAR2 VARCHAR2 NUMBER


n
a

Length 7 25 25 7
O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-39


84
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 2 (continuación)
4. Modifique la tabla EMP2 para permitir apellidos de empleado más largos. Confirme la
modificación.

5. Confirme que las tablas DEPT2 y EMP2 se han almacenado en el diccionario de datos.
(Indicación: USER_TABLES)

6. Cree la tabla EMPLOYEES2 basándose en la estructura de la tabla EMPLOYEES.


Incluya sólo las columnas EMPLOYEE_ID, FIRST_NAME, LAST_NAME, SALARY y
DEPARTMENT_ID. Asigne a las columnas de la nueva tabla los nombres ID,
FIRST_NAME, LAST_NAME, SALARY y DEPT_ID, respectivamente.
B

7. Borre la tabla EMP2.


8. Consulte la papelera de reciclaje para comprobar si está la tabla.
as L í
e

9. Anule el borrado de la tabla EMP2.


SQ Gu
de Fu de
D da Al
at m u
os e m
n

10. Borre la columna FIRST_NAME de la tabla EMPLOYEES2. Confirme la modificación


a

comprobando la descripción de la tabla.


11. En la tabla EMPLOYEES2, marque la columna DEPT_ID como UNUSED. Confirme la
O ta o

modificación comprobando la descripción de la tabla.


12. Borre todas las columnas UNUSED de la tabla EMPLOYEES2. Confirme la modificación
ra ls

comprobando la descripción de la tabla.


l

13. Agregue una restricción PRIMARY KEY de nivel de tabla a la tabla EMP2 en la
cl I
n

columna ID. Se debe asignar un nombre a la restricción en el momento de la creación.


Asigne a la restricción el nombre my_emp_id_pk.
e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-40


85
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 2 (continuación)
14. Cree una restricción PRIMARY KEY a la tabla DEPT2 mediante la columna ID. Se
debe asignar un nombre a la restricción en el momento de la creación. Asigne a la
restricción el nombre my_dept_id_pk.
15. Agregue una referencia de clave ajena en la tabla EMP2 que asegure que el empleado no
está asignado a un departamento inexistente. Asigne a la restricción el nombre
my_emp_dept_id_fk.
16. Confirme que las restricciones se han agregado consultando la vista
USER_CONSTRAINTS. Tenga en cuenta los tipos y los nombres de las restricciones.

17. Muestre los tipos y los nombres de objeto de la vista del diccionario de datos
USER_OBJECT para las tablas EMP2 y DEPT2. Observe que se han creado tablas
nuevas y un nuevo índice.

Si le queda tiempo, realice el siguiente ejercicio:


18. Modifique la tabla EMP2. Agregue una columna COMISSION de tipo de datos
B

NUMBER, precisión 2, escala 2. Agregue una restricción a la columna COMMISSION


que garantice que el valor de comisión es mayor que cero.
as L í

19. Borre las tablas EMP2 y DEPT2 de forma que no se puedan restaurar. Verifique la
papelera de reciclaje.
e

20. Cree la tabla DEPT_NAMED_INDEX basada en el siguiente gráfico de instancia de


SQ Gu

tabla. Asigne al índice de la columna PRIMARY KEY el nombre DEPT_PK_IDX.


de Fu de

Column Name Deptno Dname

Primary Key Yes


D da Al

Data Type Number VARCHAR2


at m u

Length 4 30
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-41


86
Introducción a Oracle 10g: SQL Fundamentals II

B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-42


87
Introducción a Oracle 10g: SQL Fundamentals II

Manipulación de Grandes Juegos de Datos


B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

88
Introducción a Oracle 10g: SQL Fundamentals II

Objetivos

Al finalizar esta lección, debería estar capacitado para:


• Manipular datos mediante subconsultas
• Describir las funciones de las inserciones de
varias tablas
• Utilizar los siguientes tipos de inserciones de
varias tablas
– INSERT incondicional
– INSERT de pivoting
– ALL INSERT condicional
– FIRST INSERT condicional
B

• Fusionar filas en una tabla


as L í

• Hacer un seguimiento de los cambios en datos


durante un período de tiempo
e
SQ Gu
de Fu de

Objetivos
D da Al

En esta lección aprenderá a manipular datos en la base de datos Oracle mediante subconsultas.
También recibirá información sobre sentencias de inserciones de varias tablas, la sentencia
at m u

MERGE y el seguimiento de los cambios en la base de datos.


os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-2


89
Introducción a Oracle 10g: SQL Fundamentals II

Uso de Subconsultas para Manipular Datos

Puede utilizar subconsultas en sentencias DML para:


• Copiar datos de una tabla a otra
• Recuperar datos de una vista en línea
• Actualizar datos en una tabla basándose en los
valores de otra tabla
• Suprimir filas de una tabla basándose en filas de
otra tabla
B
as L í
e
SQ Gu
de Fu de

Uso de Subconsultas para Manipular Datos


D da Al

Las subconsultas se pueden utilizar para recuperar datos de una tabla que podrá utilizar como
entrada en una inserción (INSERT) en una tabla diferente. Así, le resultará fácil copiar
at m u

grandes volúmenes de datos de una tabla a otra con una sola sentencia SELECT. De forma
parecida, puede utilizar subconsultas para realizar actualizaciones y supresiones masivas en la
os e m
n

cláusula WHERE de las sentencias UPDATE y DELETE. También puede utilizar subconsultas
a

en la cláusula FROM de una sentencia SELECT. Esto se conoce como vista en línea.
O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-3


90
Introducción a Oracle 10g: SQL Fundamentals II

Copia de Filas de Otra Tabla

• Escriba la sentencia INSERT con una subconsulta.


INSERT INTO sales_reps(id, name, salary, commission_pct)
SELECT employee_id, last_name, salary, commission_pct
FROM employees
WHERE job_id LIKE '%REP%';

4 rows created.

• No utilice la cláusula VALUES.


• Haga corresponder el número de columnas de la
cláusula INSERT con el de la subconsulta.
B
as L í
e
SQ Gu
de Fu de

Copia de Filas de Otra Tabla


D da Al

Puede utilizar sentencias INSERT para agregar filas a una tabla en la que los valores se
deriven de tablas existentes. En lugar de la cláusula VALUES, utilice una subconsulta.
at m u

Sintaxis
os e m

INSERT INTO table [ column (, column) ] subquery;


n
a

En la sintaxis:
table es el nombre de la tabla
O ta o

column es el nombre de la columna de la tabla que se va a rellenar


subquery es la subconsulta que devuelve filas a la tabla
ra ls
l

El número de columnas y los tipos de datos de la lista de columnas de la cláusula INSERT se


deben corresponder con el número de valores y los tipos de datos de la subconsulta. Para crear
cl I
n

una copia de las filas de una tabla, utilice SELECT * en la subconsulta.


e I

INSERT INTO EMPL3


SELECT *
10

FROM employees;
Para obtener más información, consulte Oracle Database 10g SQL Reference.
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-4


91
Introducción a Oracle 10g: SQL Fundamentals II

Inserción mediante una Subconsulta como Destino

INSERT INTO
(SELECT employee_id, last_name,
email, hire_date, job_id, salary,
department_id
FROM empl3
WHERE department_id = 50)
VALUES (99999, 'Taylor', 'DTAYLOR',
TO_DATE('07-JUN-99', 'DD-MON-RR'),
'ST_CLERK', 5000, 50);

1 row created.
B
as L í
e
SQ Gu
de Fu de

Inserción mediante una Subconsulta como Destino


D da Al

Puede utilizar una subconsulta en lugar del nombre de tabla en la cláusula INTO de la
sentencia INSERT.
at m u

La lista de selección de esta subconsulta debe tener el mismo número de columnas que la lista
os e m

de columnas de la cláusula VALUES. Para que la sentencia INSERT funcione correctamente,


n

se deben seguir las reglas de las columnas de la tabla base. Por ejemplo, no se puede agregar
a

un identificador de empleado duplicado ni omitir un valor para una columna obligatoria


NOT NULL.
O ta o

Esta aplicación de las subconsultas evita tener que crear una vista únicamente para realizar
ra ls

una inserción (INSERT).


l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-5


92
Introducción a Oracle 10g: SQL Fundamentals II

Inserción mediante una Subconsulta como Destino


Verifique el resultado.
SELECT employee_id, last_name, email, hire_date,
job_id, salary, department_id
FROM employees
WHERE department_id = 50;


B
as L í
e
SQ Gu
de Fu de

Inserción mediante una Subconsulta como Destino (continuación)


D da Al

El ejemplo muestra los resultados de la subconsulta que se utilizó para identificar la tabla para
la sentencia INSERT.
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-6


93
Introducción a Oracle 10g: SQL Fundamentals II

Recuperación de Datos con una


Subconsulta como Origen
SELECT a.last_name, a.salary,
a.department_id, b.salavg
FROM employees a, (SELECT department_id,
AVG(salary) salavg
FROM employees
GROUP BY department_id) b
WHERE a.department_id = b.department_id
AND a.salary > b.salavg;
B
as L í


e
SQ Gu
de Fu de

Recuperación de Datos con una Subconsulta como Origen


D da Al

Puede utilizar una subconsulta en la cláusula FROM de una sentencia SELECT, lo cual es muy
parecido al uso de las vistas. Una subconsulta en la cláusula FROM de una sentencia SELECT
at m u

se denomina también vista en línea. Una subconsulta en la cláusula FROM de una sentencia
SELECT define un origen de datos para una sentencia SELECT en particular y sólo para esa
os e m
n

sentencia SELECT. El ejemplo de la diapositiva muestra los apellidos de los empleados, los
a

salarios, los números de departamento y los salarios medios de todos los empleados que ganan
más que el salario medio en su departamento. La subconsulta de la cláusula FROM se
O ta o

denomina b y la consulta externa hace referencia a la columna SALAVG con este alias.
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-7


94
Introducción a Oracle 10g: SQL Fundamentals II

Actualización de Dos Columnas con


una Subconsulta

Actualice el puesto y el salario del empleado 114 para


hacerlos corresponder con los del empleado 205.
UPDATE empl3
SET job_id
= (SELECT job_id
FROM employees
WHERE employee_id = 205),
salary = (SELECT salary
FROM employees
WHERE employee_id = 205)
WHERE employee_id = 114;
1 row updated.
B
as L í
e
SQ Gu
de Fu de

Actualización de Dos Columnas con una Subconsulta


D da Al

Para actualizar varias columnas en la cláusula SET de una sentencia UPDATE, puede escribir
varias subconsultas.
at m u

Sintaxis
os e m

UPDATE table
n

SET column =
a

(SELECT column
FROM table
O ta o

WHERE condition)
[ ,
ra ls
l

column =
(SELECT column
cl I

FROM table
n

WHERE condition)]
e I

[WHERE condition ] ;
Nota: Si no se actualiza ninguna fila, se devuelve el mensaje “0 rows updated”.
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-8


95
Introducción a Oracle 10g: SQL Fundamentals II

Actualización de Filas Basándose


en Otra Tabla

Utilice subconsultas en sentencias UPDATE para


actualizar las filas de una tabla basándose en los
valores de otra tabla.

UPDATE empl3
SET department_id = (SELECT department_id
FROM employees
WHERE employee_id = 100)
WHERE job_id = (SELECT job_id
FROM employees
WHERE employee_id = 200);
1 row updated.
B
as L í
e
SQ Gu
de Fu de

Actualización de Filas Basándose en Otra Tabla


D da Al

Puede utilizar subconsultas en sentencias UPDATE para actualizar las filas de una tabla. El
ejemplo de la diapositiva actualiza la tabla EMPL3 basándose en los valores de la tabla
at m u

EMPLOYEES. Cambia el número de departamento de todos los empleados con el


identificador de puesto del empleado 200 al número de departamento actual del
os e m
n

empleado 100.
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-9


96
Introducción a Oracle 10g: SQL Fundamentals II

Supresión de Filas Basándose en Otra Tabla

Utilice subconsultas en sentencias DELETE para


eliminar filas de una tabla basándose en valores de
otra tabla.
DELETE FROM empl3
WHERE department_id =
(SELECT department_id
FROM departments
WHERE department_name
LIKE '%Public%');
1 row deleted.
B
as L í
e
SQ Gu
de Fu de

Supresión de Filas Basándose en Otra Tabla


D da Al

Puede utilizar subconsultas para suprimir filas de una tabla basándose en valores de otra tabla.
En el ejemplo de la diapositiva se suprimen todos los empleados que están en el departamento
at m u

cuyo nombre contiene la cadena “Public”. La subconsulta busca en la tabla DEPARTMENTS


el número de departamento basándose en el nombre de departamento que contiene la cadena
os e m
n

“Public”. La subconsulta proporciona a continuación el número de departamento a la consulta


a

principal, que suprime filas de datos de la tabla EMPLOYEES basándose en este número de
departamento.
O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-10


97
Introducción a Oracle 10g: SQL Fundamentals II

Uso de la Palabra Clave WITH CHECK OPTION


en Sentencias DML

• Se utiliza una subconsulta para identificar la tabla y


las columnas de la sentencia DML.
• Las palabras clave WITH CHECK OPTION le prohíben
cambiar las filas que no están en la subconsulta.
INSERT INTO (SELECT employee_id, last_name, email,
hire_date, job_id, salary
FROM empl3
WHERE department_id = 50
WITH CHECK OPTION)
VALUES (99998, 'Smith', 'JSMITH',
TO_DATE('07-JUN-99', 'DD-MON-RR'),
'ST_CLERK', 5000);
B

INSERT INTO
*
as L í

ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clause violation
e
SQ Gu
de Fu de

Palabras Clave WITH CHECK OPTION


D da Al

Especifique WITH CHECK OPTION para indicar que, si se utiliza la subconsulta en lugar de
una tabla en una sentencia INSERT, UPDATE o DELETE, en esa tabla no se permiten
at m u

cambios que produzcan filas que no estén incluidas en la subconsulta.


os e m

En el ejemplo, se utilizan las palabras clave WITH CHECK OPTION. La subconsulta


n

identifica filas que están en el departamento 50, pero el identificador de departamento no está
a

en la lista SELECT y no se proporciona un valor para dicho identificador en la lista VALUES.


La inserción de esta fila da como resultado un identificador de departamento nulo, que no está
O ta o

en la subconsulta.
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-11


98
Introducción a Oracle 10g: SQL Fundamentals II

Visión General de la Función de Valor por


Defecto Explícito

• La función de valor por defecto explícito le


permite utilizar la palabra clave DEFAULT como
valor de columna donde se desea el valor por
defecto de columna.
• Esta función se ha agregado por compatibilidad
con el estándar SQL:1999.
• Esto permite al usuario controlar dónde y cuándo
se debe aplicar el valor por defecto a los datos.
• Los valores por defecto explícitos se pueden
utilizar en las sentencias INSERT y UPDATE.
B
as L í
e
SQ Gu
de Fu de

Valores por Defecto Explícitos


D da Al

La palabra clave DEFAULT se puede utilizar en sentencias INSERT y UPDATE para


identificar un valor de columna por defecto. Si no existe ningún valor por defecto, se utiliza
at m u

un valor nulo.
os e m

La opción DEFAULT le ahorra tener que codificar el valor por defecto en los programas o
n

consultar el diccionario para encontrarlo, que es lo que se debía hacer antes de que se
a

introdujese esta función. Es problemático codificar el valor por defecto si éste cambia, porque
también habría que cambiar el código de forma consecuente. No se suele acceder al
O ta o

diccionario en un programa de aplicación, por lo que esta función es muy importante.


ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-12


99
Introducción a Oracle 10g: SQL Fundamentals II

Uso de Valores Por Defecto Explícitos

• DEFAULT con INSERT:


INSERT INTO deptm3
(department_id, department_name, manager_id)
VALUES (300, 'Engineering', DEFAULT);

• DEFAULT con UPDATE:


UPDATE deptm3
SET manager_id = DEFAULT
WHERE department_id = 10;
B
as L í
e
SQ Gu
de Fu de

Uso de Valores Por Defecto Explícitos


D da Al

Especifique DEFAULT para definir la columna en el valor especificado anteriormente como


valor por defecto para la columna. Si no se ha especificado ningún valor por defecto para la
at m u

columna correspondiente, Oracle Server define la columna como nula.


os e m

En el primer ejemplo de la diapositiva, la sentencia INSERT utiliza un valor por defecto para
n

la columna MANAGER_ID. Si no hay ningún valor por defecto definido para la columna, se
a

insertará un valor nulo.


O ta o

El segundo ejemplo utiliza la sentencia UPDATE para definir la columna MANAGER_ID en


un valor por defecto para el departamento 10. Si no se ha definido ningún valor por defecto
ra ls

para la columna, cambiará el valor a nulo.


l

Nota: Al crear una tabla, puede especificar un valor por defecto para una columna. Esto se
cl I

analiza en la lección titulada “Creating and Managing Tables”.


n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-13


100
Introducción a Oracle 10g: SQL Fundamentals II

Visión General de Sentencias INSERT de


Varias Tablas

INSERT ALL Table_a


INTO table_a VALUES(…,…,…)
INTO table_b VALUES(…,…,…)
INTO table_c VALUES(…,…,…)
SELECT …
FROM sourcetab
WHERE …; Table_b
B
as L í

Table_c
e
SQ Gu
de Fu de

Visión General de Sentencias INSERT de Varias Tablas


D da Al

En una sentencia INSERT de varias tablas, se insertan filas calculadas derivadas de las filas
devueltas de la evaluación de una subconsulta en una o más tablas.
at m u

Las sentencias INSERT de varias tablas pueden desempeñar un papel muy útil en el supuesto
os e m

de un almacén de datos. Debe cargar el almacén de datos con regularidad para que pueda
n

cumplir su propósito de facilitar el análisis de negocio. Para ello, se deben extraer y copiar
a

datos de uno o más sistemas operativos al almacén de datos. El proceso de extracción de datos
del sistema de origen y su transferencia al almacén de datos se suele denominar ETL (siglas
O ta o

de extraction, transformation, and loading, o extracción, transformación y carga).


ra ls

Durante la extracción, se deben identificar y extraer los datos deseados de diferentes orígenes
l

como, por ejemplo, aplicaciones y sistemas de bases de datos. Después de la extracción, los
cl I

datos se deben transportar físicamente al sistema de destino o a un sistema intermedio para


n

continuar su procesamiento. Dependiendo del medio de transporte seleccionado, algunas


e I

transformaciones se pueden realizar durante este proceso. Por ejemplo, una sentencia SQL
que acceda directamente a un destino remoto a través de un gateway puede concatenar dos
10

columnas como parte de la sentencia SELECT.


n

Una vez cargados los datos en la base de datos Oracle, las transformaciones de datos se
g

pueden ejecutar mediante operaciones SQL. Una sentencia INSERT de varias tablas es una de
las técnicas para implementar transformaciones de datos SQL.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-14


101
Introducción a Oracle 10g: SQL Fundamentals II

Visión General de Sentencias INSERT de


Varias Tablas

• La sentencia INSERT…SELECT se puede utilizar para


insertar filas en varias tablas como parte de una única
sentencia DML.
• Las sentencias INSERT de varias tablas se pueden
utilizar en sistemas de almacenes de datos para
transferir datos de uno o más orígenes operativos a
un juego de tablas destino.
• Proporcionan una mejora significativa del
rendimiento en:
– DML único frente a varias sentencias INSERT…SELECT
B

– DML único frente a un procedimiento para realizar


as L í

varias inserciones mediante la sintaxis IF...THEN


e
SQ Gu
de Fu de

Visión General de Sentencias INSERT de Varias Tablas (continuación)


D da Al

Las sentencias INSERT de varias tablas ofrecen las ventajas de la sentencia INSERT ...
SELECT cuando hay varias tablas implicadas como destinos. Con la funcionalidad anterior a
at m u

la base de datos Oracle9i, era necesario tratar con n sentencias INSERT ... SELECT
independientes, procesando los mismos datos de origen n veces y aumentando la carga de
os e m
n

trabajo de transformación n veces.


a

Como sucede con la sentencia INSERT ... SELECT existente, la nueva sentencia se puede
paralelizar y utilizar con el mecanismo de carga directa para obtener un rendimiento más
O ta o

rápido.
ra ls

Cada registro de cualquier flujo de entrada como, por ejemplo, una tabla de base de datos no
l

relacional, se puede convertir ahora en varios registros para un entorno de tabla de base de
cl I

datos más relacional. Para implementar esta funcionalidad de forma alternativa, había que
n

escribir varias sentencias INSERT.


e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-15


102
Introducción a Oracle 10g: SQL Fundamentals II

Tipos de Sentencias INSERT de Varias Tablas

Los diferentes tipos de sentencias INSERT de varias


tablas son:
• INSERT incondicional
• ALL INSERT condicional
• FIRST INSERT condicional
• INSERT de pivoting
B
as L í
e
SQ Gu
de Fu de

Tipos de Sentencias INSERT de Varias Tablas


D da Al

Los tipos de sentencias INSERT de varias tablas son:


• INSERT incondicional
at m u

• ALL INSERT condicional


• FIRST INSERT condicional
os e m
n

• INSERT de pivoting
a

Se utilizan diferentes cláusulas para indicar el tipo de inserción (INSERT) que se ejecutará.
O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-16


103
Introducción a Oracle 10g: SQL Fundamentals II

Sentencias INSERT de Varias Tablas

• Sintaxis
INSERT [ALL] [conditional_insert_clause]
[insert_into_clause values_clause] (subquery)

• conditional_insert_clause
[ALL] [FIRST]
[WHEN condition THEN] [insert_into_clause values_clause]
[ELSE] [insert_into_clause values_clause]
B
as L í
e
SQ Gu
de Fu de

Sentencias INSERT de Varias Tablas


D da Al

La diapositiva muestra el formato genérico para las sentencias INSERT de varias tablas.
at m u

INSERT Incondicional: ALL into_clause


Especifique ALL seguido de varias cláusulas insert_into_clauses para realizar una
os e m

inserción incondicional de varias tablas. Oracle Server ejecuta cada insert_into_


n
a

clause una vez para cada fila devuelta por la subconsulta.


INSERT Condicional: conditional_insert_clause
O ta o

Especifique la cláusula conditional_insert_clause para realizar una inserción


(INSERT) condicional de varias tablas. Oracle Server filtra cada cláusula insert_into_
ra ls
l

clause a través de la condición WHEN correspondiente, lo que determina si se ejecutará


insert_into_clause. Una única sentencia INSERT de varias tablas puede contener
cl I
n

hasta 127 cláusulas WHEN.


e I

INSERT Condicional: ALL


Si especifica ALL, Oracle Server evalúa cada cláusula WHEN independientemente de los
10

resultados de la evaluación de cualquier otra cláusula WHEN. Para cada cláusula WHEN cuya
condición se evalúe como verdadera, Oracle Server ejecuta la lista correspondiente de
n

cláusulas INTO.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-17


104
Introducción a Oracle 10g: SQL Fundamentals II

Sentencias INSERT de Varias Tablas (continuación)


INSERT Condicional: FIRST
Si especifica FIRST, Oracle Server evalúa cada cláusula WHEN en el orden en que aparece
en la sentencia. Si la primera cláusula WHEN se evalúa como verdadera, Oracle Server
ejecuta la cláusula INTO correspondiente y salta las cláusulas WHEN siguientes para la fila
especificada.
INSERT Condicional: Cláusula ELSE
Para una fila especificada, si no se evalúa ninguna cláusula WHEN como verdadera:
• Si ha especificado una cláusula ELSE, Oracle Server ejecuta la lista de cláusulas
INTO asociadas a la cláusula ELSE.
• Si no ha especificado una cláusula ELSE, Oracle Server no realiza ninguna acción
para esa fila.
Restricciones en Sentencias INSERT de Varias Tablas
• Se pueden realizar sentencias INSERT de varias tablas sólo en tablas, no en vistas ni
en vistas materializadas.
• No se puede realizar una inserción (INSERT) de varias tablas en una tabla remota.
• No se puede especificar una expresión de recopilación de tablas al realizar una
inserción (INSERT) de varias tablas.
• En una inserción (INSERT) de varias tablas, no se pueden combinar todas las
cláusulas insert_into_clauses para especificar más de 999 columnas de
B

destino.
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-18


105
Introducción a Oracle 10g: SQL Fundamentals II

INSERT ALL Incondicional

• Seleccione los valores EMPLOYEE_ID, HIRE_DATE,


SALARY y MANAGER_ID de la tabla EMPLOYEES de los
empleados cuyo EMPLOYEE_ID sea mayor que 200.
• Inserte estos valores en las tablas SAL_HISTORY y
MGR_HISTORY mediante una sentencia INSERT de
varias tablas.
INSERT ALL
INTO sal_history VALUES(EMPID,HIREDATE,SAL)
INTO mgr_history VALUES(EMPID,MGR,SAL)
SELECT employee_id EMPID, hire_date HIREDATE,
salary SAL, manager_id MGR
B

FROM employees
as L í

WHERE employee_id > 200;


8 rows created.
e
SQ Gu
de Fu de

INSERT ALL Incondicional


D da Al

El ejemplo de la diapositiva inserta filas en las tablas SAL_HISTORY y MGR_HISTORY.


La sentencia SELECT recupera los detalles de identificador de empleado, fecha de
at m u

contratación, salario e identificador de supervisor de los empleados cuyo identificador de


empleado es mayor que 200 en la tabla EMPLOYEES. Los detalles de identificador de
os e m
n

empleado, fecha de contratación y salario se insertan en la tabla SAL_HISTORY. Los detalles


a

de identificador de empleado, identificador de supervisor y salario se insertan en la tabla


MGR_HISTORY.
O ta o

La sentencia INSERT se conoce como INSERT incondicional, ya que no se aplican más


ra ls

restricciones a las filas que se recuperan mediante la sentencia SELECT. Todas las filas
l

recuperadas mediante la sentencia SELECT se insertan en las dos tablas, SAL_HISTORY y


cl I

MGR_HISTORY. La cláusula VALUES de las sentencias INSERT especifica las columnas de


n

la sentencia SELECT que se deben insertar en cada una de las tablas. Cada fila devuelta
e I

mediante la sentencia SELECT da como resultado dos inserciones, una para la tabla
SAL_HISTORY y una para la tabla MGR_HISTORY.
10

Se puede interpretar que el feedback 8 rows created significa que se realizó un total de
n

ocho inserciones en las tablas base, SAL_HISTORY y MGR_HISTORY.


g

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-19


106
Introducción a Oracle 10g: SQL Fundamentals II

INSERT ALL Condicional

• Seleccione los valores EMPLOYEE_ID, HIRE_DATE,


SALARY y MANAGER_ID de la tabla EMPLOYEES de los
empleados cuyo EMPLOYEE_ID sea mayor que 200.
• Si SALARY es mayor que 10.000 dólares, inserte
estos valores en la tabla SAL_HISTORY mediante una
sentencia INSERT condicional de varias tablas.
• Si MANAGER_ID es mayor que 200, inserte estos
valores en la tabla MGR_HISTORY mediante una
sentencia INSERT condicional de varias tablas.
B
as L í
e
SQ Gu
de Fu de

INSERT ALL Condicional


D da Al

En la diapositiva se especifica la sentencia con un problema para una sentencia INSERT ALL
condicional. La solución a este problema se muestra en la página siguiente.
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-20


107
Introducción a Oracle 10g: SQL Fundamentals II

INSERT ALL Condicional

INSERT ALL
WHEN SAL > 10000 THEN
INTO sal_history VALUES(EMPID,HIREDATE,SAL)
WHEN MGR > 200 THEN
INTO mgr_history VALUES(EMPID,MGR,SAL)
SELECT employee_id EMPID,hire_date HIREDATE,
salary SAL, manager_id MGR
FROM employees
WHERE employee_id > 200;
4 rows created.
B
as L í
e
SQ Gu
de Fu de

INSERT ALL Condicional (continuación)


D da Al

El ejemplo de la diapositiva es parecido al de la diapositiva anterior, ya que inserta filas en las


tablas SAL_HISTORY y MGR_HISTORY. La sentencia SELECT recupera los detalles de
at m u

identificador de empleado, fecha de contratación, salario e identificador de supervisor de los


empleados cuyo identificador de empleado es mayor que 200 en la tabla EMPLOYEES. Los
os e m
n

detalles de identificador de empleado, fecha de contratación y salario se insertan en la tabla


a

SAL_HISTORY. Los detalles de identificador de empleado, identificador de supervisor y


salario se insertan en la tabla MGR_HISTORY.
O ta o

La sentencia INSERT se conoce como ALL INSERT condicional, ya que se aplica una
ra ls

restricción más a las filas que se recuperan mediante la sentencia SELECT. De las filas
l

recuperadas mediante la sentencia SELECT, sólo aquéllas en las que el valor de la columna
cl I

SAL sea mayor que 10000 se insertarán en la tabla SAL_HISTORY y, de forma parecida, sólo
n

las filas en las que el valor de la columna MGR sean mayor que 200 se insertarán en la tabla
e I

MGR_HISTORY.
Observe que, a diferencia del ejemplo anterior, en el que se insertaron ocho filas en las tablas,
10

en este ejemplo sólo se insertan cuatro filas.


n

Se puede interpretar que el feedback 4 rows created significa que se realizó un total de
g

cuatro inserciones en las tablas base, SAL_HISTORY y MGR_HISTORY.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-21


108
Introducción a Oracle 10g: SQL Fundamentals II

INSERT FIRST Condicional

• Seleccione DEPARTMENT_ID , SUM(SALARY) y


MAX(HIRE_DATE) en la tabla EMPLOYEES.
• Si SUM(SALARY) es mayor que 25.000 dólares, inserte
estos valores en SPECIAL_SAL mediante una sentencia
FIRST INSERT condicional de varias tablas
• Si la primera cláusula WHEN se evalúa como verdadera,
se deben saltar las cláusulas WHEN siguientes para
esta fila.
• En las filas que no satisfacen la primera condición
WHEN, realice inserciones en las tablas HIREDATE_
HISTORY_00, HIREDATE_HISTORY_99 o HIREDATE_
B

HISTORY, basándose en el valor de la columna HIRE_


as L í

DATE mediante una sentencia INSERT condicional de


varias tablas.
e
SQ Gu
de Fu de

INSERT FIRST Condicional


D da Al

En la diapositiva se especifica la sentencia con un problema para una sentencia FIRST


INSERT condicional. La solución a este problema se muestra en la página siguiente.
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-22


109
Introducción a Oracle 10g: SQL Fundamentals II

INSERT FIRST Condicional

INSERT FIRST
WHEN SAL > 25000 THEN
INTO special_sal VALUES(DEPTID, SAL)
WHEN HIREDATE like ('%00%') THEN
INTO hiredate_history_00 VALUES(DEPTID,HIREDATE)
WHEN HIREDATE like ('%99%') THEN
INTO hiredate_history_99 VALUES(DEPTID, HIREDATE)
ELSE
INTO hiredate_history VALUES(DEPTID, HIREDATE)
SELECT department_id DEPTID, SUM(salary) SAL,
MAX(hire_date) HIREDATE
FROM employees
B

GROUP BY department_id;
as L í

8 rows created.
e
SQ Gu
de Fu de

INSERT FIRST Condicional (continuación)


D da Al

El ejemplo de la diapositiva inserta filas en más de una tabla mediante una única sentencia
INSERT. La sentencia SELECT recupera los detalles de identificador de departamento,
at m u

salario total y fecha de contratación máxima de cada departamento de la tabla EMPLOYEES.


Esta sentencia INSERT se conoce como FIRST INSERT condicional, ya que se realiza una
os e m
n

excepción para los departamentos cuyo salario total sea mayor que 25.000 dólares. La
a

condición WHEN ALL > 25000 se evalúa en primer lugar. Si el salario total de un
departamento es mayor que 25.000 dólares, el registro se inserta en la tabla SPECIAL_SAL,
O ta o

independientemente de la fecha de contratación. Si esta primera cláusula WHEN se evalúa


ra ls

como verdadera, Oracle Server ejecuta la cláusula INTO correspondiente y salta las cláusulas
l

WHEN siguientes para esta fila.


cl I

Para las filas que no satisfacen la primera condición WHEN (WHEN SAL > 25000), el resto de
n

las condiciones se evalúa igual que una sentencia INSERT condicional y los registros
e I

recuperados mediante la sentencia SELECT se insertan en las tablas HIREDATE_HISTORY_


00 o HIREDATE_HISTORY_99 o HIREDATE_HISTORY, basándose en el valor de la
10

columna HIREDATE.
Se puede interpretar que el feedback 8 rows created significa que se realizó un total de
n

ocho sentencias INSERT en las tablas base, SPECIAL_SAL, HIREDATE_HISTORY_00,


HIREDATE_HISTORY_99 y HIREDATE_HISTORY.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-23


110
Introducción a Oracle 10g: SQL Fundamentals II

INSERT de Pivoting

• Suponga que recibe un juego de registros de ventas


de una tabla de base de datos no relacional, SALES_
SOURCE_DATA, con el siguiente formato:
EMPLOYEE_ID, WEEK_ID, SALES_MON, SALES_TUE,
SALES_WED, SALES_THUR, SALES_FRI
• Desea almacenar estos registros en la tabla SALES_
INFO con un formato relacional más normal:
EMPLOYEE_ID, WEEK, SALES
• Mediante una sentencia INSERT de pivoting, convierta
el juego de registros de ventas de la tabla de la base
B

de datos no relacional al formato relacional.


as L í
e
SQ Gu
de Fu de

INSERT de Pivoting
D da Al

El pivoting es una operación en la que se debe crear una transformación tal que cada registro
de cualquier flujo de entrada como, por ejemplo, una tabla de base de datos no relacional, se
at m u

debe convertir en varios registros para un entorno de tablas de base de datos más relacional.
os e m

Para solucionar el problema que se menciona en la diapositiva, debe crear una transformación
n

tal que cada registro de la tabla de base de datos no relacional original, SALES_SOURCE_
a

DATA, se convierta en cinco registros para la tabla SALES_INFO del almacén de datos. Esta
operación se suele conocer como pivoting.
O ta o

En la diapositiva se especifica la sentencia con un problema para una sentencia INSERT de


ra ls

pivoting. La solución a este problema se muestra en la página siguiente.


l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-24


111
Introducción a Oracle 10g: SQL Fundamentals II

INSERT de Pivoting

INSERT ALL
INTO sales_info VALUES (employee_id,week_id,sales_MON)
INTO sales_info VALUES (employee_id,week_id,sales_TUE)
INTO sales_info VALUES (employee_id,week_id,sales_WED)
INTO sales_info VALUES (employee_id,week_id,sales_THUR)
INTO sales_info VALUES (employee_id,week_id, sales_FRI)
SELECT EMPLOYEE_ID, week_id, sales_MON, sales_TUE,
sales_WED, sales_THUR,sales_FRI
FROM sales_source_data;
5 rows created.
B
as L í
e
SQ Gu
de Fu de

INSERT de Pivoting (continuación)


D da Al

En el ejemplo de la diapositiva, los datos de ventas se reciben de la tabla de base de datos no


relacional SALES_SOURCE_DATA, que contiene los detalles de las ventas realizadas por el
at m u

representante de ventas cada día de la semana, durante una semana con un identificador de
semana en particular.
os e m
n
a

DESC SALES_SOURCE_DATA
O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-25


112
Introducción a Oracle 10g: SQL Fundamentals II

INSERT de Pivoting (continuación)


SELECT * FROM SALES_SOURCE_DATA;

DESC SALES_INFO

SELECT * FROM sales_info;


B

Observe en el ejemplo anterior que mediante una inserción (INSERT) de pivoting, una fila de
as L í

la tabla SALES_SOURCE_DATA se convierte en cinco registros de la tabla relacional,


SALES_INFO.
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-26


113
Introducción a Oracle 10g: SQL Fundamentals II

Sentencia MERGE

• Permite actualizar o insertar datos condicionalmente


en una tabla de base de datos
• Realiza una actualización (UPDATE) si existe la fila y
una inserción (INSERT) si es una fila nueva:
– Evita actualizaciones separadas
– Aumenta el rendimiento y la facilidad de uso
– Es útil en aplicaciones de almacenes de datos
B
as L í
e
SQ Gu
de Fu de

Sentencias MERGE
D da Al

Oracle Server soporta la sentencia MERGE para operaciones INSERT, UPDATE y DELETE.
Mediante esta sentencia, puede actualizar, insertar o suprimir una fila condicionalmente en
at m u

una tabla, con lo que se evitan varias sentencias DML. La decisión de actualizar, insertar o
suprimir en la tabla destino se basa en una condición de la cláusula ON.
os e m
n

Hay que tener privilegios de objeto INSERT y UPDATE en la tabla destino y el privilegio de
a

objeto SELECT en la tabla origen. Para especificar la cláusula DELETE de la cláusula


merge_update_clause, también debe tener el privilegio de objeto DELETE en la tabla
O ta o

destino.
ra ls

La sentencia MERGE es determinista. No se puede actualizar varias veces la misma fila de la


l

tabla destino en la misma sentencia MERGE.


cl I

Un enfoque alternativo es utilizar bucles PL/SQL y varias sentencias DML. La sentencia


n

MERGE, sin embargo, es fácil de utilizar y se expresa de forma más sencilla como una única
e I

sentencia SQL.
10

La sentencia MERGE es adecuada en diferentes aplicaciones de almacén de datos. Por


ejemplo, en una aplicación de almacén de datos, es posible que necesite trabajar con datos
n

procedentes de varios orígenes, algunos de los cuales pueden estar duplicados. Con la
g

sentencia MERGE, puede agregar o modificar filas condicionalmente.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-27


114
Introducción a Oracle 10g: SQL Fundamentals II

Sintaxis de la Sentencia MERGE

Puede insertar o actualizar filas condicionalmente en


una tabla mediante la sentencia MERGE.

MERGE INTO table_name table_alias


USING (table|view|sub_query) alias
ON (join condition)
WHEN MATCHED THEN
UPDATE SET
col1 = col_val1,
col2 = col2_val
WHEN NOT MATCHED THEN
INSERT (column_list)
B

VALUES (column_values);
as L í
e
SQ Gu
de Fu de

Fusión de Filas
D da Al

Puede actualizar filas existentes e insertar nuevas filas condicionalmente mediante la


sentencia MERGE.
at m u

En la sintaxis:
os e m

Cláusula INTO especifica la tabla destino que se va a actualizar o en la que se va


n

a insertar
a

Cláusula USING identifica el origen de los datos que se van a actualizar o insertar;
puede ser una tabla, una vista o una subconsulta
O ta o

Cláusula ON condición según la cual la operación MERGE actualiza o inserta


ra ls

WHEN MATCHED | indica al servidor cómo responder a los resultados de la condición


l

de unión
cl I

WHEN NOT MATCHED


n

Para obtener más información, consulte Oracle Database 10g SQL Reference, “MERGE”.
e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-28


115
Introducción a Oracle 10g: SQL Fundamentals II

Fusión de Filas

Inserte o actualice las filas de la tabla EMPL3 para que


se corresponda con la tabla EMPLOYEES.
MERGE INTO empl3 c
USING employees e
ON (c.employee_id = e.employee_id)
WHEN MATCHED THEN
UPDATE SET
c.first_name = e.first_name,
c.last_name = e.last_name,
...
c.department_id = e.department_id
WHEN NOT MATCHED THEN
INSERT VALUES(e.employee_id, e.first_name, e.last_name,
B

e.email, e.phone_number, e.hire_date, e.job_id,


as L í

e.salary, e.commission_pct, e.manager_id,


e.department_id);
e
SQ Gu
de Fu de

Ejemplo de Fusión de Filas


D da Al

MERGE INTO empl3 c


USING employees e
at m u

ON (c.employee_id = e.employee_id)
WHEN MATCHED THEN
os e m
n

UPDATE SET
a

c.first_name = e.first_name,
c.last_name = e.last_name,
O ta o

c.email = e.email,
c.phone_number = e.phone_number,
ra ls

c.hire_date = e.hire_date,
l

c.job_id = e.job_id,
c.salary = e.salary,
cl I
n

c.commission_pct = e.commission_pct,
c.manager_id = e.manager_id,
e I

c.department_id = e.department_id
WHEN NOT MATCHED THEN
10

INSERT VALUES(e.employee_id, e.first_name, e.last_name,


n

e.email, e.phone_number, e.hire_date, e.job_id,


g

e.salary, e.commission_pct, e.manager_id,


e.department_id);

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-29


116
Introducción a Oracle 10g: SQL Fundamentals II

Fusión de Filas
TRUNCATE TABLE empl3;

SELECT *
FROM empl3;
no rows selected
MERGE INTO empl3 c
USING employees e
ON (c.employee_id = e.employee_id)
WHEN MATCHED THEN
UPDATE SET
...
WHEN NOT MATCHED THEN
INSERT VALUES...;
SELECT *
B

FROM empl3;
as L í

20 rows selected.
e
SQ Gu
de Fu de

Ejemplo de Fusión de Filas (continuación)


D da Al

El ejemplo de la diapositiva hace corresponder EMPLOYEE_ID de la tabla EMPL3 con


EMPLOYEE_ID de la tabla EMPLOYEES. Si encuentra una correspondencia, la fila de la
at m u

tabla EMPL3 se actualiza para que se corresponda con la de la tabla EMPLOYEES. Si no


encuentra la fila, la inserta en la tabla EMPL3.
os e m
n

Se evalúa la condición c.employee_id = e.employee_id. Como la tabla EMPL3


a

está vacía, la condición devuelve false (no hay correspondencias). La lógica recae en la
cláusula WHEN NOT MATCHED y el comando MERGE inserta las filas de la tabla
O ta o

EMPLOYEES en la tabla EMPL3.


ra ls

Si existieran las filas en la tabla EMPL3 y los identificadores de empleado se correspondieran


l

en las dos tablas (en las tablas EMPL3 y EMPLOYEES), las filas existentes en la tabla EMPL3
cl I

se actualizarían para corresponderse con la tabla EMPLOYEES.


n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-30


117
Introducción a Oracle 10g: SQL Fundamentals II

Seguimiento de Cambios en los Datos

SELECT

B
as L í

Versiones de filas recuperadas


e
SQ Gu
de Fu de

Seguimiento de Cambios en los Datos


D da Al

Puede suceder que, de algún modo, haya datos en la tabla que se hayan cambiado
incorrectamente. Para investigar esto, puede utilizar varias consultas de flashback para ver los
at m u

datos de filas en puntos concretos en el tiempo. Lo que es más eficaz, puede utilizar la
función Consulta de Versiones de Flashback para ver todos los cambios efectuados en una fila
os e m

durante un período de tiempo. Esta función le permite agregar una cláusula VERSIONS a una
n

sentencia SELECT que especifique un SCN o rango de registro de hora en el que desee ver
a

cambios en los valores de fila. La consulta también puede devolver metadatos asociados
como, por ejemplo, la transacción responsable del cambio.
O ta o

Es más, después de identificar una transacción errónea, puede utilizar la función Consulta de
Versiones de Flashback para identificar otros cambios que haya realizado la transacción.
ra ls

Puede utilizar entonces la función Consulta de Versiones de Flashback para restaurar la tabla
l

a un estado anterior a la realización de los cambios.


cl I

Puede utilizar una consulta en una tabla con una cláusula VERSIONS para producir todas las
n

versiones de todas las filas que existen o que hayan existido entre el momento en que se
e I

emitió la consulta y los segundos undo_retention anteriores al momento actual. undo_


retention es un parámetro de inicialización de ajuste automático. Una consulta que
10

incluye una cláusula VERSIONS se conoce como consulta de versiones. Los resultados de
una consulta de versiones se comportan como si se hubiera aplicado la cláusula WHERE a las
n

versiones de las filas. La consulta de versiones devuelve versiones de las filas sólo en
g

transacciones.
SCN (número de cambio del sistema): Oracle Server asigna un SCN (número de cambio del
sistema) para identificar los registros de rehacer para cada transacción validada.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-31


118
Introducción a Oracle 10g: SQL Fundamentals II

Ejemplo de Consulta de Versiones de Flashback

SELECT salary FROM employees3


WHERE employee_id = 107;
1

UPDATE employees3 SET salary = salary * 1.30


WHERE employee_id = 107;
2
COMMIT;

SELECT salary FROM employees3


VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE 3
WHERE employee_id = 107;
B
as L í
e
SQ Gu
de Fu de

Ejemplo de Consulta de Versiones de Flashback


D da Al

En el ejemplo de la diapositiva, se recupera el salario del empleado 107 (1). El salario del
empleado 107 se aumenta en un 30 por ciento y se valida el cambio (2). Se muestran las
at m u

diferentes versiones del salario (3).


La cláusula VERSIONS no cambia el plan de la consulta. Por ejemplo, si ejecuta una consulta
os e m
n

en una tabla que utilice el método de acceso a índices, la misma consulta de la misma tabla con
a

una cláusula VERSIONS continúa utilizando el método de acceso a índices. Las versiones de
las filas devueltas por la consulta de versiones son versiones de las filas en las transacciones. La
O ta o

cláusula VERSIONS no afecta al comportamiento transaccional de una consulta. Esto significa


que una consulta en una tabla con una cláusula VERSIONS sigue heredando el entorno de la
ra ls
l

consulta de la transacción en curso.


cl I

La cláusula VERSIONS por defecto se puede especificar como VERSIONS BETWEEN


n

{SCN|TIMESTAMP} MINVALUE AND MAXVALUE.


e I

La cláusula VERSIONS es una extensión SQL únicamente para consultas. Puede tener
operaciones DML y DDL que utilicen una cláusula VERSIONS dentro de las subconsultas. La
10

consulta de versiones recupera todas las versiones validadas de las filas seleccionadas. Los
cambios realizados por la transacción activa actual no se devuelven. La consulta de versiones
n

recupera todas las encarnaciones de las filas. Esto significa en esencia que las versiones
devueltas incluyen las versiones suprimidas y subsiguientes reinsertadas de las filas.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-32


119
Introducción a Oracle 10g: SQL Fundamentals II

Ejemplo de Obtención de Versiones de Filas


El acceso a filas para una consulta de versiones se puede definir en una de las siguientes dos
categorías:
• Acceso a filas basado en ROWID: En el caso del acceso basado en ROWID, se devuelven
todas las versiones de los ROWID independientemente del contenido de las filas.
Básicamente, esto significa que se devuelven todas las versiones de la ranura del bloque
indicado por el ROWID.
• Acceso a todas las demás filas: Para el acceso a todas las demás filas, se devuelven
todas las versiones de las filas.
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-33


120
Introducción a Oracle 10g: SQL Fundamentals II

Cláusula VERSIONS BETWEEN

SELECT versions_starttime "START_DATE",


versions_endtime "END_DATE",
salary
FROM employees
VERSIONS BETWEEN SCN MINVALUE
AND MAXVALUE
WHERE last_name = 'Lorentz';
B
as L í
e
SQ Gu
de Fu de

Cláusula VERSIONS BETWEEN


D da Al

Puede utilizar la cláusula VERSIONS BETWEEN para recuperar todas las versiones de las
filas que existen o que han existido entre el momento en que se emitió la consulta y un punto
at m u

pasado en el tiempo.
os e m

Si el momento de retención de deshacer es mejor que el momento de límite inferior/SCN de la


n

cláusula BETWEEN, la consulta recupera únicamente las versiones hasta el momento de


a

retención de deshacer. El intervalo de tiempo de la cláusula BETWEEN se puede especificar


como intervalo SCN o como intervalo de reloj. Este intervalo de tiempo se cierra en los
O ta o

límites inferior y superior.


ra ls

En el ejemplo, se recuperan los cambios de salario de Lorentz. El valor NULL para


l

END_DATE para la primera versión indica que se trataba de la versión existente en el


cl I

momento de la consulta. El valor NULL para START_DATE para la última versión indica que
n

esta versión se creó en un momento anterior a la retención de deshacer.


e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-34


121
Introducción a Oracle 10g: SQL Fundamentals II

Resumen
En esta lección ha aprendido a:
• Utilizar sentencias DML y controlar transacciones
• Describir las funciones de las inserciones de varias
tablas
• Utilizar los siguientes tipos de inserciones de varias
tablas
– INSERT incondicional
– INSERT de pivoting
– ALL INSERT condicional
– FIRST INSERT condicional
• Fusionar filas en una tabla
B

• Manipular datos mediante subconsultas


as L í

• Hacer un seguimiento de los cambios en datos


durante un período de tiempo
e
SQ Gu
de Fu de

Resumen
D da Al

En esta lección ha aprendido a manipular datos en la base de datos Oracle mediante subconsultas.
También ha recibido información sobre sentencias INSERT de varias tablas, la sentencia MERGE
at m u

y el seguimiento de los cambios en la base de datos.


os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-35


122
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 3: Visión General

Esta práctica cubre los temas siguientes:


• Realización de inserciones (INSERT) de varias
tablas
• Realización de operaciones MERGE
• Seguimiento de versiones de filas
B
as L í
e
SQ Gu
de Fu de

Práctica 3: Visión General


D da Al

En esta práctica, agregará filas a la tabla emp_data, actualizará y suprimirá datos de la tabla
y realizará un seguimiento de las transacciones.
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-36


123
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 3
1. Ejecute el archivo de comandos lab_03_01.sql en la carpeta de prácticas para
crear la tabla SAL_HISTORY.
2. Muestre la estructura de la tabla SAL_HISTORY.

3. Ejecute el archivo de comandos lab_03_03.sql en la carpeta de prácticas para


crear la tabla MGR_HISTORY.
4. Muestre la estructura de la tabla MGR_HISTORY.

5. Ejecute el archivo de comandos lab_03_05.sql en la carpeta de prácticas para


crear la tabla SPECIAL_SAL.
B

6. Muestre la estructura de la tabla SPECIAL_SAL.


as L í
e
SQ Gu
de Fu de

7. a. Escriba una consulta para:


- Recuperar los detalles de identificador de empleado, fecha de contratación,
salario e identificador de supervisor de los empleados cuyo identificador de
D da Al

empleado es menor que 125 en la tabla EMPLOYEES.


- Si el salario es mayor que 20.000 dólares, insertar los detalles de identificador
at m u

de empleado y salario en la tabla SPECIAL_SAL.


- Insertar los detalles de identificador de empleado, fecha de contratación y
os e m
n

salario en la tabla SAL_HISTORY.


a

- Insertar los detalles de identificador de empleado, identificador de supervisor y


salario en la tabla MGR_HISTORY.
O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-37


124
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 3 (continuación)
b. Muestre los registros de la tabla SPECIAL_SAL.

c. Muestre los registros de la tabla SAL_HISTORY.


B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-38


125
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 3 (continuación)
d. Muestre los registros de la tabla MGR_HISTORY.

B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-39


126
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 3 (continuación)
8. a. Ejecute el archivo de comandos lab_03_08a.sql en la carpeta de prácticas
para crear la tabla SALES_SOURCE_DATA.
b. Ejecute el archivo de comandos lab_03_08b.sql en la carpeta de prácticas
para insertar registros en la tabla SALES_SOURCE_DATA.
c. Muestre la estructura de la tabla SALES_SOURCE_DATA.

d. Muestre los registros de la tabla SALES_SOURCE_DATA.

e. Ejecute el archivo de comandos lab_03_08c.sql en la carpeta de prácticas


para crear la tabla SALES_INFO.
B

f. Muestre la estructura de la tabla SALES_INFO.


as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-40


127
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 3 (continuación)
g. Escriba una consulta para:
Recuperar los detalles de identificador de empleado, identificador de semana, ventas
el lunes, ventas el martes, ventas el miércoles, ventas el jueves y ventas el viernes
de la tabla SALES_SOURCE_DATA.
Crear tal transformación que cada registro recuperado de la tabla SALES_
SOURCE_DATA se convierta en varios registros para la tabla SALES_INFO.
Indicación: Utilice una sentencia INSERT de pivoting.
h. Muestre los registros de la tabla SALES_INFO.

9. Tiene almacenados los datos de empleados antiguos en un archivo plano denominado


emp.data. Desea almacenar los nombres y los identificadores de correo electrónico de
todos los empleados antiguos y actuales en una tabla. Para ello, cree primero una tabla
externa denominada EMP_DATA mediante el archivo de origen emp.dat en el directorio
B

emp_dir. Para ello, puede utilizar el archivo de comandos lab_03_ 09.sql.


as L í

10. A continuación, ejecute el archivo de comandos lab_03_10.sql para crear la tabla


EMP_HIST.
a. Aumente el tamaño de la columna de correo electrónico a 45.
e

b. Fusione los datos de la tabla EMP_DATA creada en la última práctica en los datos de
SQ Gu

la tabla EMP_HIST. Suponga que los datos de la tabla externa EMP_DATA son los
de Fu de

más actualizados. Si una fila de la tabla EMP_DATA se corresponde con la tabla


EMP_HIST, actualice la columna de correo electrónico de la tabla EMP_ HIST
para hacerla corresponder con la fila de la tabla EMP_DATA. Si una fila de la tabla
D da Al

EMP_DATA no encuentra correspondencia, insértela en la tabla EMP_HIST. Se


considera que las filas se corresponden cuando el nombre y el apellido del empleado
at m u

son idénticos.
os e m

c. Recupere las filas de EMP_HIST después de la fusión.


n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-41


128
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 3 (continuación)


B
as L í
e
SQ Gu
de Fu de

11. Cree la tabla EMP3 mediante el archivo de comandos lab_03_11.sql. En la tabla


EMP3, cambie el departamento de Kochhar a 60 y valide el cambio. A continuación,
cambie el departamento de Kochhar a 50 y valide el cambio. Realice un seguimiento de
D da Al

los cambios efectuados en Kochhar mediante la función de versiones de filas.


at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-42


129
Introducción a Oracle 10g: SQL Fundamentals II

Generación de Informes mediante


la Agrupación de Datos Relacionados
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

130
Introducción a Oracle 10g: SQL Fundamentals II

Objetivos

Al finalizar esta lección, debería estar capacitado para:


• Utilizar la operación ROLLUP para generar valores
subtotales
• Utilizar la operación CUBE para generar valores desde
varias tablas
• Utilizar la función GROUPING para identificar los
valores de fila creados por ROLLUP o CUBE
• Utilizar GROUPING SETS para generar un juego de
resultados único
B
as L í
e
SQ Gu
de Fu de

Objetivos
D da Al

En esta lección, aprenderá a:


• Agrupar datos para obtener:
at m u

- Valores subtotales mediante el operador ROLLUP


- Valores desde varias tablas mediante el operador CUBE
os e m
n

• Utilice la función GROUPING para identificar el nivel de agregación en el juego de


a

resultados generado por un operador ROLLUP o CUBE


• Utilice GROUPING SETS para generar un único juego de resultados que sea
O ta o

equivalente a un enfoque UNION ALL


ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-2


131
Introducción a Oracle 10g: SQL Fundamentals II

Revisión de Funciones de Grupo

• Las funciones de grupo operan en juegos de filas


para dar un resultado por grupo.
SELECT [column,] group_function(column). . .
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column];

• Ejemplo:
SELECT AVG(salary), STDDEV(salary),
COUNT(commission_pct),MAX(hire_date)
B

FROM employees
as L í

WHERE job_id LIKE 'SA%';


e
SQ Gu
de Fu de

Funciones de Grupo
D da Al

Puede utilizar la cláusula GROUP BY para dividir las filas de una tabla en grupos. Puede
utilizar entonces las funciones de grupo para devolver información de resumen para cada
at m u

grupo. Las funciones de grupo pueden aparecer en listas de selección y en cláusulas ORDER
BY y HAVING. Oracle Server aplica las funciones de grupo a cada grupo de filas y devuelve
os e m

una sola fila de resultados para cada grupo.


n
a

Tipos de funciones de grupo: Cada una de las funciones de grupo AVG, SUM, MAX, MIN,
COUNT, STDDEV y VARIANCE acepta un argumento. Las funciones AVG, SUM, STDDEV y
O ta o

VARIANCE operan sólo en valores numéricos. MAX y MIN pueden operar en valores de datos
numéricos, de carácter o de fecha. COUNT devuelve el número de filas no nulas para la
ra ls

expresión específica. El ejemplo de la diapositiva calcula el salario medio, la desviación


l

estándar en el salario, el número de empleados que ganan una comisión y la fecha de


cl I

contratación máxima para los empleados cuyo JOB_ID empiece por SA.
n

Instrucciones para Utilizar Funciones de Grupo


e I

• Los tipos de datos para los argumentos pueden ser CHAR, VARCHAR2, NUMBER o DATE.
• Todas las funciones de grupo, excepto COUNT(*), ignoran los valores nulos. Para
10

sustituir con un valor los valores nulos, utilice la función NVL. COUNT devuelve un
número o cero.
n

• Oracle Server clasifica implícitamente el juego de resultados en orden ascendente de las


g

columnas de agrupamiento especificadas si se utiliza una cláusula GROUP BY. Para


sustituir esta clasificación por defecto, puede utilizar DESC en una cláusula ORDER BY.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-3


132
Introducción a Oracle 10g: SQL Fundamentals II

Revisión de la Cláusula GROUP BY

• Sintaxis:
SELECT [column,] group_function(column). . .
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column];

• Ejemplo:
SELECT department_id, job_id, SUM(salary),
COUNT(employee_id)
B

FROM employees
GROUP BY department_id, job_id ;
as L í
e
SQ Gu
de Fu de

Revisión de la Cláusula GROUP BY


D da Al

Oracle Server evalúa el ejemplo que se muestra en la diapositiva de la siguiente forma:


• La cláusula SELECT especifica que se deben recuperar las siguientes columnas:
at m u

- Columnas de identificador de departamento y de identificador de puesto de la tabla


EMPLOYEES
os e m
n

- Suma de todos los salarios y número de empleados en cada grupo que ha


a

especificado en la cláusula GROUP BY


• La cláusula GROUP BY especifica cómo se deben agrupar las filas en la tabla. El salario
O ta o

total y el número de empleados se calculan para cada identificador de puesto dentro de


cada departamento. Las filas se agrupan por identificador de departamento y después
ra ls
l

por puesto dentro de cada departamento.


cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-4


133
Introducción a Oracle 10g: SQL Fundamentals II

Revisión de la Cláusula HAVING

• Utilice la cláusula HAVING para especificar qué


grupos se deben mostrar.
• Restrinja aún más los grupos basándose en una
condición de limitación.
SELECT [column,] group_function(column)...
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING having_expression]
[ORDER BY column];
B
as L í
e
SQ Gu
de Fu de

Cláusula HAVING
D da Al

Se forman los grupos y se calculan las funciones de grupo antes de que se aplique la cláusula
HAVING a los grupos. La cláusula HAVING puede ir delante de la cláusula GROUP BY, pero
at m u

se recomienda colocar primero la cláusula GROUP BY, porque resulta más lógico.
os e m

Oracle Server sigue estos pasos si se utiliza la cláusula HAVING:


n

1. Agrupa las filas


a

2. Aplica las funciones de grupo a los grupos y muestra los grupos que cumplen los
criterios de la cláusula HAVING
O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-5


134
Introducción a Oracle 10g: SQL Fundamentals II

GROUP BY con los Operadores


ROLLUP y CUBE

• Utilice ROLLUP o CUBE con GROUP BY para generar


filas superagregadas mediante referencias
cruzadas a columnas.
• El agrupamiento con ROLLUP genera un juego de
resultados que contiene las filas agrupadas
normales y los valores subtotales.
• El agrupamiento con CUBE genera un juego de
resultados que contiene las filas de ROLLUP y las
filas de valores derivados de varias tablas.
B
as L í
e
SQ Gu
de Fu de

GROUP BY con los Operadores ROLLUP y CUBE


D da Al

Especifique los operadores ROLLUP y CUBE en la cláusula GROUP BY de una consulta. El


agrupamiento con ROLLUP genera un juego de resultados que contiene las filas agrupadas
at m u

normales y las filas subtotales. La operación CUBE de la cláusula GROUP BY agrupa las filas
seleccionadas basándose en los valores de todas las combinaciones posibles de expresiones de
os e m
n

las especificaciones y devuelve una sola fila de información resumida para cada grupo. Puede
a

utilizar el operador CUBE para generar filas de valores derivados de varias tablas.
Nota: Al trabajar con ROLLUP y CUBE, asegúrese de que las columnas que vayan después de
O ta o

GROUP BY tengan relaciones significativas y reales entre sí, ya que, de lo contrario, los
ra ls

operadores devolverán información irrelevante.


l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-6


135
Introducción a Oracle 10g: SQL Fundamentals II

Operador ROLLUP

• ROLLUP es una extensión de la cláusula GROUP BY.


• Utilice la operación ROLLUP para generar agregados
acumulativos como, por ejemplo, subtotales.
SELECT [column,] group_function(column). . .
FROM table
[WHERE condition]
[GROUP BY [ROLLUP] group_by_expression]
[HAVING having_expression];
[ORDER BY column];
B
as L í
e
SQ Gu
de Fu de

Operador ROLLUP
D da Al

El operador ROLLUP proporciona agregados y superagregados para expresiones dentro de una


sentencia GROUP BY. Los escritores de informes pueden utilizar el operador ROLLUP para
at m u

extraer estadísticas e información de resumen de los juegos de resultados. Los agregados


acumulativos se pueden utilizar en informes, diagramas y gráficos.
os e m
n

El operador ROLLUP crea agrupamientos moviéndose en una dirección, de derecha a


a

izquierda, a lo largo de la lista de columnas especificada en la cláusula GROUP BY. A


continuación, aplica la función agregada a estos agrupamientos.
O ta o

Nota
ra ls

• Para generar subtotales en n dimensiones (es decir, n columnas de la cláusula GROUP


l

BY) sin un operador ROLLUP, se deben enlazar n+1 sentencias SELECT con UNION
cl I

ALL. Esto hace que la ejecución de la consulta resulte ineficiente, ya que cada sentencia
n

SELECT provoca acceso a tablas. El operador ROLLUP recopila sus resultados con un
e I

solo acceso a tablas. El operador ROLLUP es útil cuando hay muchas columnas
implicadas en la generación de subtotales.
10

• Los subtotales y los totales se generan con ROLLUP. CUBE genera totales también, pero
n

acumula eficazmente en cada dirección posible, lo que genera datos de valores


g

derivados de varias tablas.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-7


136
Introducción a Oracle 10g: SQL Fundamentals II

Operador ROLLUP: Ejemplo

SELECT department_id, job_id, SUM(salary)


FROM employees
WHERE department_id < 60
GROUP BY ROLLUP(department_id, job_id);

2
B

3
as L í
e
SQ Gu
de Fu de

Ejemplo de un Operador ROLLUP


D da Al

En el ejemplo de la diapositiva:
• Los salarios totales de todos los identificadores de puesto de un departamento para los
at m u

departamentos cuyo identificador es menor que 60 se muestran mediante la cláusula


GROUP BY.
os e m

• El operador ROLLUP muestra:


n
a

- Salario total de cada departamento cuyo identificador es menor que 60


- Salario total de todos los departamentos cuyo identificador es menor que 60,
O ta o

independientemente de los identificadores de puesto


En este ejemplo, 1 indica un grupo totalizado tanto por DEPARTMENT_ID como por
ra ls

JOB_ID, 2 indica un grupo totalizado sólo por DEPARTMENT_ID y 3 indica la suma total.
l

El operador ROLLUP crea subtotales que acumulan desde el nivel más detallado hasta la suma
cl I

total, después de la lista de agrupamiento especificada en la cláusula GROUP BY. Primero,


n

calcula los valores agregados estándar para los grupos especificados en la cláusula GROUP
e I

BY (en el ejemplo, la suma de salarios agrupados en cada puesto de un departamento). A


continuación, va creando subtotales de mayor nivel progresivamente, de derecha a izquierda
10

en la lista de columnas de agrupamiento. (En el ejemplo, se calcula la suma de salarios para


cada departamento, seguida de la suma de los salarios para todos los departamentos).
n

• Dadas n expresiones en el operador ROLLUP de la cláusula GROUP BY, la operación da


g

como resultado n + 1 (en este caso, 2 + 1 = 3) agrupamientos.


• Las filas basadas en los valores de las n primeras expresiones se denominan filas o filas
normales y las demás, filas superagregadas.
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-8
137
Introducción a Oracle 10g: SQL Fundamentals II

Operador CUBE

• CUBE es una extensión de la cláusula GROUP BY.


• Puede utilizar el operador CUBE para generar valores
desde varias tablas con una única sentencia SELECT.
SELECT [column,] group_function(column)...
FROM table
[WHERE condition]
[GROUP BY [CUBE] group_by_expression]
[HAVING having_expression]
[ORDER BY column];
B
as L í
e
SQ Gu
de Fu de

Operador CUBE
D da Al

El operador CUBE es un conmutador adicional de la cláusula GROUP BY de una sentencia


SELECT. El operador CUBE se puede aplicar a todas las funciones agregadas, incluidas AVG,
at m u

SUM, MAX, MIN y COUNT. Se utiliza para generar juegos de resultados que se suelen utilizar
para informes de datos derivados de varias tablas. Mientras que ROLLUP genera sólo una
os e m
n

fracción de posibles combinaciones de subtotales, CUBE genera subtotales para todas las
a

posibles combinaciones de agrupamientos especificados en la cláusula GROUP BY y una


suma total.
O ta o

El operador CUBE se utiliza con una función agregada para generar filas adicionales en un
juego de resultados. Las columnas incluidas en la cláusula GROUP BY son de referencia
ra ls

cruzada y se utilizan para generar un superjuego de grupos. La función agregada especificada


l

en la lista de selecciones se aplica a estos grupos para generar valores de resumen para las filas
cl I

superagregadas adicionales. El número de grupos adicionales del juego de resultados lo


n

determina el número de columnas incluidas en la cláusula GROUP BY.


e I

De hecho, todas las posibles combinaciones de las columnas o las expresiones de la cláusula
GROUP BY se utilizan para generar superagregados. Si tiene n columnas o expresiones en la
10

cláusula GROUP BY, habrá 2n posibles combinaciones superagregadas. Matemáticamente,


estas combinaciones forman un cubo de n dimensiones, de ahí el nombre del operador.
n

Mediante la aplicación o herramientas de programación, estos valores superagregados se


pueden proporcionar a diagramas y gráficos que expresarán los resultados y las relaciones
eficazmente y de forma visual.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-9


138
Introducción a Oracle 10g: SQL Fundamentals II

Operador CUBE: Ejemplo

SELECT department_id, job_id, SUM(salary)


FROM employees
WHERE department_id < 60
GROUP BY CUBE (department_id, job_id);

3
B
as L í

4
e
SQ Gu
de Fu de

Ejemplo de un Operador CUBE


D da Al

La salida de la sentencia SELECT del ejemplo se puede interpretar así:


• El salario total de todos los puestos dentro de un departamento (para los departamentos
at m u

cuyo identificador es menor que 60) se muestra mediante la cláusula GROUP BY.
• Salario total de los departamentos cuyo identificador es menor que 60.
os e m
n

• Salario total de todos los puestos, independientemente del departamento.


a

• Salario total de los departamentos cuyo identificador es menor que 60,


independientemente de los cargos.
O ta o

En este ejemplo, 1 indica la suma total. 2 indica las filas totalizadas sólo por JOB_ID. 3
indica algunas de las filas totalizadas por DEPARTMENT_ID y JOB_ID. 4 indica algunas
ra ls

de las filas totalizadas sólo por DEPARTMENT_ID.


l

El operador CUBE también ha realizado la operación ROLLUP para mostrar los subtotales de
cl I

los departamentos cuyo identificador es menor que 60 y el salario total de los de los
n

departamentos cuyo identificador es menor que 60, independientemente de los cargos.


e I

Además, el operador CUBE muestra el salario total de todos los puestos, independientemente
del departamento.
10

Nota: De forma parecida al operador ROLLUP, para generar subtotales en n dimensiones (es
n

decir, n columnas de la cláusula GROUP BY) sin un operador CUBE, se deben enlazar 2n
g

sentencias SELECT con UNION ALL. Así pues, un informe de tres dimensiones requiere que
se enlacen 23 = 8 sentencias SELECT con UNION ALL.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-10


139
Introducción a Oracle 10g: SQL Fundamentals II

Función GROUPING

La función GROUPING:
• Se utiliza con los operadores CUBE o ROLLUP
• Se utiliza para encontrar los grupos que forman el
subtotal en una fila
• Se utiliza para diferenciar los valores NULL
almacenados de los valores NULL creados por
ROLLUP o CUBE
• Devuelve 0 ó 1
SELECT [column,] group_function(column) .. ,
GROUPING(expr)
FROM table
B

[WHERE condition]
[GROUP BY [ROLLUP][CUBE] group_by_expression]
as L í

[HAVING having_expression]
[ORDER BY column];
e
SQ Gu
de Fu de

Función GROUPING
D da Al

La función GROUPING se puede utilizar con los operadores CUBE o ROLLUP para entender
mejor el modo en que se ha obtenido un valor de resumen.
at m u

La función GROUPING utiliza una sola columna como argumento. El valor de expr en la
función GROUPING se debe corresponder con una de las expresiones de la cláusula GROUP
os e m

BY. La función devuelve un valor de 0 ó 1.


n
a

Los valores devueltos por la función GROUPING son útiles para:


• Determinar el nivel de agregación de un subtotal dado; es decir, el grupo o los grupos en
los que se basa el subtotal
O ta o

• Identificar si un valor NULL en la columna de expresiones de una fila del juego de


resultado indica:
ra ls
l

- Un valor NULL de la tabla base (valor NULL almacenado)


- Un valor NULL creado por ROLLUP o CUBE (como resultado de una función de
cl I
n

grupo en esa expresión)


Un valor de 0 devuelto por la función GROUPING basándose en una expresión indica una de
e I

estas posibilidades:
• Se ha utilizado la expresión para calcular el valor agregado.
10

• El valor NULL de la columna de expresiones es un valor NULL almacenado.


n

Un valor de 1 devuelto por la función GROUPING basándose en una expresión indica una de
g

estas posibilidades:
• No se ha utilizado la expresión para calcular el valor agregado.
• El valor NULL de la columna de expresiones se crea mediante ROLLUP o CUBE como
resultado del agrupamiento.
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-11
140
Introducción a Oracle 10g: SQL Fundamentals II

Función GROUPING: Ejemplo


SELECT department_id DEPTID, job_id JOB,
SUM(salary),
GROUPING(department_id) GRP_DEPT,
GROUPING(job_id) GRP_JOB
FROM employees
WHERE department_id < 50
GROUP BY ROLLUP(department_id, job_id);

1
2
B
as L í

3
e
SQ Gu
de Fu de

Ejemplo de una Función GROUPING


D da Al

En el ejemplo de la diapositiva, observe el valor de resumen 4400 de la primera fila


(etiquetado como 1). Este valor de resumen es el salario total del identificador de puesto
at m u

AD_ASST dentro del departamento 10. Para calcular este valor de resumen, se han tenido en
cuenta las columnas DEPARTMENT_ID y JOB_ID. Así pues, se devuelve un valor de 0 para
os e m
n

las expresiones GROUPING(department_id) y GROUPING(job_id).


a

Observe el valor de resumen 4400 de la segunda fila (etiquetado como 2). Este valor es el
salario total del departamento 10 y se ha calculado teniendo en cuenta la columna
O ta o

DEPARTMENT_ID; así pues, GROUPING(department_id) ha devuelto un valor de 0.


Como la columna JOB_ID no se ha tenido en cuenta para calcular este valor, se ha devuelto
ra ls
l

un valor de 1 para GROUPING(job_id). En la quinta fila, puede observar una salida


parecida.
cl I
n

En la última fila, observe el valor de resumen 54800 (etiquetado como 3). Es el salario total
e I

para los departamentos cuyo identificador es menor que 50 y todos los cargos. Para calcular
este valor de resumen, no se ha tenido en cuenta ninguna de las columnas DEPARTMENT_ID
10

y JOB_ID. Así pues, se devuelve un valor de 1 para las expresiones


GROUPING(department_id) y GROUPING(job_id).
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-12


141
Introducción a Oracle 10g: SQL Fundamentals II

GROUPING SETS

• Se utiliza la sintaxis de GROUPING SETS para definir


varios agrupamientos en la misma consulta.
• Se calculan todos los agrupamientos especificados
en la cláusula GROUPING SETS y los resultados de
agrupamientos individuales se combinan con una
operación UNION ALL.
• Eficiencia de los juegos de agrupamientos:
– Sólo se requiere una transferencia sobre la tabla base.
– No es necesario escribir sentencias UNION complejas.
– Cuantos más elementos tenga GROUPING SETS, mayor
B

será la ventaja en el rendimiento.


as L í
e
SQ Gu
de Fu de

GROUPING SETS
D da Al

GROUPING SETS es una extensión adicional de la cláusula GROUP BY que se puede


utilizar para especificar varios agrupamientos de datos. Esto facilita una agregación eficiente
at m u

y, por tanto, facilita el análisis de datos en varias dimensiones.


Ahora se puede escribir una sola sentencia SELECT mediante GROUPING SETS para
os e m
n

especificar varios agrupamientos (que también pueden incluir operadores ROLLUP o CUBE),
a

en lugar de varias sentencias SELECT combinadas mediante los operadores UNION ALL.
Por ejemplo:
O ta o

SELECT department_id, job_id, manager_id, AVG(salary)


ra ls

FROM employees
l

GROUP BY
GROUPING SETS
cl I
n

((department_id, job_id, manager_id),


(department_id, manager_id),(job_id, manager_id));
e I

Esta sentencia calcula agregados en tres agrupamientos:


10

(department_id, job_id, manager_id), (department_id,


manager_id) y (job_id, manager_id)
n

Sin esta función, se requieren varias consultas combinadas junto con UNION ALL para
g

obtener la salida de la sentencia SELECT anterior. Un enfoque multiconsulta resulta


ineficiente, ya que requiere varias exploraciones de los mismos datos.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-13


142
Introducción a Oracle 10g: SQL Fundamentals II

GROUPING SETS (continuación)


Compare el ejemplo anterior con la siguiente alternativa:
SELECT department_id, job_id, manager_id, AVG(salary)
FROM employees
GROUP BY CUBE(department_id, job_id, manager_id);
Esta sentencia calcula los 8 (2 *2 *2) agrupamientos, aunque sólo son los grupos
(department_id, job_id, manager_id), (department_id,
manager_id) y (job_id, manager_id) los que le interesan.
Otra alternativa es la siguiente sentencia:
SELECT department_id, job_id, manager_id, AVG(salary)
FROM employees
GROUP BY department_id, job_id, manager_id
UNION ALL
SELECT department_id, NULL, manager_id, AVG(salary)
FROM employees
GROUP BY department_id, manager_id
UNION ALL
SELECT NULL, job_id, manager_id, AVG(salary)
FROM employees
GROUP BY job_id, manager_id;
Esta sentencia requiere tres exploraciones de la tabla base, lo que la hace ineficiente.
B

CUBE y ROLLUP se pueden considerar juegos de agrupamientos con semántica muy


as L í

específica. La siguiente equivalencia lo muestra:

CUBE(a, b, c) GROUPING SETS


e

es equivalente a ((a, b, c), (a, b), (a, c), (b, c),


SQ Gu

(a), (b), (c), ())


de Fu de

ROLLUP(a, b, c) GROUPING SETS ((a, b, c), (a, b),(a), ())


es equivalente a
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-14


143
Introducción a Oracle 10g: SQL Fundamentals II

GROUPING SETS: Ejemplo


SELECT department_id, job_id,
manager_id,avg(salary)
FROM employees
GROUP BY GROUPING SETS
((department_id,job_id), (job_id,manager_id));


B
as L í

2

e
SQ Gu
de Fu de

GROUPING SETS: Ejemplo


D da Al

La consulta de la diapositiva calcula agregados en los dos agrupamientos. La tabla se divide


en los siguientes grupos:
at m u

• Identificadores de puesto, identificadores de supervisor


• Identificadores de departamento, identificadores de puesto
os e m
n

Se calculan los salarios medios de cada uno de estos grupos. El juego de resultados muestra el
a

salario medio de cada uno de los dos grupos.


O ta o

En la salida, el grupo marcado como 1 se puede interpretar como:


• El salario medio de todos los empleados con el identificador de puesto AD_VP a las
ra ls

órdenes del supervisor 100 es de 17000.


l

• El salario medio de todos los empleados con el identificador de puesto AD_MGR a las
cl I

órdenes del supervisor 101 es de 12000 y así sucesivamente.


n

El grupo marcado como 2 en la salida se interpreta como:


e I

• El salario medio de todos los empleados con el identificador de puesto FI_MGR del
departamento 100 es de 12000.
10

• El salario medio de todos los empleados con el identificador de puesto FI_ACCOUNT


n

en el departamento 100 es de 7920 y así sucesivamente.


g

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-15


144
Introducción a Oracle 10g: SQL Fundamentals II

GROUPING SETS: Ejemplo (continuación)


El ejemplo de la diapositiva también se puede escribir como:
SELECT department_id, job_id, NULL as manager_id,
AVG(salary) as AVGSAL
FROM employees
GROUP BY department_id, job_id
UNION ALL
SELECT NULL, job_id, manager_id, avg(salary) as AVGSAL
FROM employees
GROUP BY job_id, manager_id;
En ausencia de un optimizador que busque en los bloques de consulta para generar el plan de
ejecución, la consulta anterior necesitaría dos exploraciones de la tabla base, EMPLOYEES.
Esto podría resultar muy ineficiente. Por tanto, se recomienda utilizar la sentencia
GROUPING SETS.
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-16


145
Introducción a Oracle 10g: SQL Fundamentals II

Columnas Compuestas

• Una columna compuesta es una recopilación de


columnas que se tratan como una unidad.
ROLLUP (a, (b,c) , d)
• Utilice paréntesis dentro de la cláusula GROUP BY
para agrupar columnas, de modo que se traten
como una unidad al calcular operaciones ROLLUP
o CUBE.
• La utilización de columnas compuestas con
ROLLUP o CUBE provocaría el salto de la
agregación en determinados niveles.
B
as L í
e
SQ Gu
de Fu de

Columnas Compuestas
D da Al

Una columna compuesta es una recopilación de columnas que se tratan como una unidad
durante el cálculo de agrupamientos. Especifique las columnas entre paréntesis como en la
at m u

siguiente sentencia:
ROLLUP (a, (b, c), d)
os e m
n

Aquí, (b, c) forma una columna compuesta y se trata como una unidad. Por lo general, las
a

columnas compuestas son útiles en ROLLUP, CUBE y GROUPING SETS. Por ejemplo, en
CUBE o ROLLUP, las columnas compuestas provocarían el salto de la agregación en
O ta o

determinados niveles.
Es decir, GROUP BY ROLLUP(a, (b, c))es equivalente a
ra ls

GROUP BY a, b, c UNION ALL


l

GROUP BY a UNION ALL


cl I

GROUP BY ()
n

Aquí, (b, c) se trata como una unidad y ROLLUP no se aplica en (b, c). Es como si se
e I

tiene un alias, por ejemplo, z, para (b, c) y la expresión GROUP BY se reduce a


GROUP BY ROLLUP(a, z).
10

Nota: GROUP BY( ) normalmente es una sentencia SELECT con valores NULL para las
columnas a y b y sólo la función agregada. Esto se utiliza generalmente para generar sumas
n

totales.
g

SELECT NULL, NULL, aggregate_col


FROM <table_name>
GROUP BY ( );

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-17


146
Introducción a Oracle 10g: SQL Fundamentals II

Columnas Compuestas (continuación)


Compare esto con la operación ROLLUP normal, como en:
GROUP BY ROLLUP(a, b, c)
que sería
GROUP BY a, b, c UNION ALL
GROUP BY a, b UNION ALL
GROUP BY a UNION ALL
GROUP BY ()
De forma parecida,
GROUP BY CUBE((a, b), c)
sería equivalente a
GROUP BY a, b, c UNION ALL
GROUP BY a, b UNION ALL
GROUP BY c UNION ALL
GROUP BY ()
La siguiente tabla muestra una especificación de juegos de agrupamientos y la especificación
GROUP BY equivalente.

Sentencias GROUPING SETS Sentencias GROUP BY Equivalentes


B
as L í

GROUP BY GROUPING SETS(a, b, c) GROUP BY a UNION ALL


GROUP BY b UNION ALL
e

GROUP BY c
SQ Gu

GROUP BY GROUPING SETS(a, b,(b, c)) GROUP BY a UNION ALL


de Fu de

(La expresión GROUPING SETS tiene una columna GROUP BY b UNION ALL
compuesta). GROUP BY b, c
D da Al

GROUP BY GROUPING SETS((a, b, c)) GROUP BY a, b, c


at m u

GROUP BY GROUPING SETS(a, (b), ()) GROUP BY a UNION ALL


GROUP BY b UNION ALL
GROUP BY ()
os e m
n
a

GROUP BY GROUPING SETS GROUP BY a UNION ALL


(a,ROLLUP(b, c)) GROUP BY ROLLUP(b, c)
O ta o

(La expresión GROUPING SETS tiene


una columna compuesta).
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-18


147
Introducción a Oracle 10g: SQL Fundamentals II

Columnas Compuestas: Ejemplo

SELECT department_id, job_id, manager_id,


SUM(salary)
FROM employees
GROUP BY ROLLUP( department_id,(job_id, manager_id)) ;

2

3
B
as L í

4
e
SQ Gu
de Fu de

Columnas Compuestas: Ejemplo


D da Al

Observe el ejemplo:
SELECT department_id, job_id,manager_id, SUM(salary)
at m u

FROM employees
GROUP BY ROLLUP( department_id,job_id, manager_id);
os e m
n

Esta consulta hace que Oracle Server calcule los siguientes agrupamientos:
a

1. (job_id, manager_id)
2. (department_id, job_id, manager_id)
O ta o

3. (department_id)
4. Suma total
ra ls
l

Si sólo le interesan grupos específicos, no puede limitar el cálculo a esos agrupamientos sin
utilizar columnas compuestas. Con las columnas compuestas, esto es posible si se trata las
cl I
n

columnas JOB_ID y MANAGER_ID como una unidad durante la acumulación. Las columnas
entre paréntesis se tratan como una unidad durante los cálculos ROLLUP y CUBE. Esto se
e I

ilustra en el ejemplo de la diapositiva. Al poner las columnas JOB_ID y MANAGER_ID entre


10

paréntesis, le indica a Oracle Server que trate JOB_ID y MANAGER_ID como una unidad,
que es una columna compuesta.
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-19


148
Introducción a Oracle 10g: SQL Fundamentals II

Columnas Compuestas: Ejemplo (continuación)


El ejemplo de la diapositiva calcula los siguientes agrupamientos:
• (department_id, job_id, manager_id)
• (department_id)
• ( )
El ejemplo de la diapositiva muestra lo siguiente:
• Salario total de todos los puestos y supervisor (etiquetado como 1)
• Salario total de todos los departamentos, los puestos y los supervisores (etiquetado
como 2)
• Salario total de todos los departamentos (etiquetado como 3)
• Suma total (etiquetado como 4)
El ejemplo de la diapositiva también se puede escribir como:
SELECT department_id, job_id, manager_id, SUM(salary)
FROM employees
GROUP BY department_id,job_id, manager_id
UNION ALL
SELECT department_id, TO_CHAR(NULL),TO_NUMBER(NULL), SUM(salary)
FROM employees
GROUP BY department_id
UNION ALL
SELECT TO_NUMBER(NULL), TO_CHAR(NULL),TO_NUMBER(NULL), SUM(salary)
B

FROM employees
as L í

GROUP BY ();
En ausencia de un optimizador que busque en los bloques de consulta para generar el plan de
ejecución, la consulta anterior necesitaría tres exploraciones de la tabla base, EMPLOYEES.
e

Esto podría resultar muy ineficiente. Por tanto, se recomienda utilizar columnas compuestas.
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-20


149
Introducción a Oracle 10g: SQL Fundamentals II

Agrupamientos Concatenados

• Los agrupamientos concatenados ofrecen una


forma concisa de generar combinaciones de
agrupamientos útiles.
• Para especificar los juegos de agrupamientos
concatenados, separe varias operaciones ROLLUP,
CUBE y juegos de agrupamientos con comas, de
modo que Oracle Server las combine en una única
cláusula GROUP BY.
• El resultado es un producto combinado de
agrupamientos de cada juego de agrupamientos.
B

GROUP BY GROUPING SETS(a, b), GROUPING SETS(c, d)


as L í
e
SQ Gu
de Fu de

Columnas Concatenadas
D da Al

Los agrupamientos concatenados ofrecen una forma concisa de generar combinaciones de


agrupamientos útiles. Para especificar los agrupamientos concatenados, se muestran varios
at m u

juegos de agrupamientos, cubos y acumulaciones, y se separan con comas. A continuación se


ofrece un ejemplo de juegos de agrupamientos concatenados:
os e m
n

GROUP BY GROUPING SETS(a, b), GROUPING SETS(c, d)


a

Este ejemplo SQL define los siguientes agrupamientos:


O ta o

(a, c), (a, d), (b, c), (b, d)


La concatenación de juegos de agrupamientos es muy útil por estos motivos:
ra ls
l

• Facilidad de desarrollo de consultas: No es necesario enumerar manualmente todos


los agrupamientos.
cl I
n

• Uso por las aplicaciones: El SQL generado por aplicaciones OLAP suele implicar la
concatenación de juegos de agrupamientos, en la que cada juego de agrupamientos
e I

define los agrupamientos necesarios para una dimensión.


10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-21


150
Introducción a Oracle 10g: SQL Fundamentals II

Agrupamientos Concatenados: Ejemplo


SELECT department_id, job_id, manager_id,
SUM(salary)
FROM employees
GROUP BY department_id,
ROLLUP(job_id),
CUBE(manager_id);

2 …

3

4 5
B
as L í
e
SQ Gu
de Fu de

Agrupamientos Concatenados: Ejemplo


D da Al

El ejemplo de la diapositiva da como resultado los siguientes agrupamientos:


• (job_id, manager_id) (1)
at m u

• (department_id,job_id, manager_id) (2)


• (job_id)(3)
os e m
n

• (department_id,manager_id)(4)
a

• (department_id) (5)
Se calcula el salario total de cada uno de estos grupos.
O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-22


151
Introducción a Oracle 10g: SQL Fundamentals II

Resumen

En esta lección ha aprendido a utilizar:


• La operación ROLLUP para generar valores subtotales
• La operación CUBE para generar valores desde varias
tablas
• La función GROUPING para identificar los valores de
fila creados por ROLLUP o CUBE
• La sintaxis de GROUPING SETS para definir varios
agrupamientos en la misma consulta
• La cláusula GROUP BY para combinar expresiones de
B

diversos modos:
as L í

– Columnas compuestas
– Juegos de agrupamientos concatenados
e
SQ Gu
de Fu de

Resumen
D da Al

• ROLLUP y CUBE son extensiones de la cláusula GROUP BY.


• ROLLUP se utiliza para mostrar valores subtotales y la suma total.
at m u

• CUBE se utiliza para mostrar valores desde varias tablas.


• La función GROUPING le permite determinar si una fila es un agregado generado por un
os e m
n

operador CUBE o ROLLUP.


a

• Con la sintaxis de GROUPING SETS, puede definir varios agrupamientos en la misma


consulta. GROUP BY calcula todos los agrupamientos especificados y los combina con
O ta o

UNION ALL.
• Dentro de la cláusula GROUP BY, puede combinar expresiones de varias formas:-{}-
ra ls

- Para especificar columnas compuestas, se agrupan las columnas entre paréntesis,


l

de modo que Oracle Server las trate como una unidad al calcular operaciones
cl I

ROLLUP o CUBE.
n

- Para especificar juegos de agrupamientos concatenados, separe varias operaciones


e I

ROLLUP, CUBE y juegos de agrupamientos con comas, de modo que Oracle


Server las combine en una única cláusula GROUP BY. El resultado es un producto
10

combinado de agrupamientos de cada juego de agrupamientos.


n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-23


152
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 4: Visión General

Esta práctica trata sobre el uso de:


• Operadores ROLLUP
• Operadores CUBE
• Funciones GROUPING
• GROUPING SETS
B
as L í
e
SQ Gu
de Fu de

Práctica 4: Visión General


D da Al

En esta practica, utilizará los operadores ROLLUP y CUBE como extensiones de la cláusula
GROUP BY. Utilizará también GROUPING SETS.
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-24


153
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 4
1. Escriba una consulta para mostrar lo siguiente para los empleados cuyo identificador
de supervisor sea menor que 120:
- Identificador de supervisor
- Identificador de puesto y salario total de todos los identificadores de puesto de
los empleados que estén a las órdenes del mismo supervisor
- Salario total de esos supervisores
- Salario total de esos supervisores, independientemente de los identificadores de
puesto
B
as L í


e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-25


154
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 4 (continuación)
2. Observe la salida de la pregunta 1. Escriba una consulta mediante la función
GROUPING para determinar si los valores NULL de las columnas correspondientes a
las expresiones GROUP BY los genera la operación ROLLUP.


B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-26


155
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 4 (continuación)
3. Escriba una consulta para mostrar lo siguiente para los empleados cuyo identificador
de supervisor sea menor que 120:
- Identificador de supervisor
- Puesto y salarios totales de todos los puestos de empleados que estén a las
órdenes del mismo supervisor
- Salario total de esos supervisores
- Valores desde varias tablas para mostrar el salario total de todos los puestos,
independientemente del supervisor
- Salario total independientemente de todos los cargos


B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-27


156
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 4 (continuación)
4. Observe la salida de la pregunta 3. Escriba una consulta mediante la función
GROUPING para determinar si los valores NULL en las columnas correspondientes a
las expresiones GROUP BY los genera la operación CUBE.
B
as L í


e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-28


157
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 4 (continuación)
5. Mediante GROUPING SETS, escriba una consulta para mostrar los siguientes
agrupamientos:
- department_id, manager_id, job_id
- department_id, job_id
- manager_id, job_id
La consulta debe calcular la suma de los salarios para cada uno de estos grupos.


B
as L í


e
SQ Gu
de Fu de


D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-29


158
Introducción a Oracle 10g: SQL Fundamentals II

B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-30


159
Introducción a Oracle 10g: SQL Fundamentals II

Gestión de Datos en Zonas Horarias Diferentes


B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

160
Introducción a Oracle 10g: SQL Fundamentals II

Objetivos

Al final de esta lección, debería estar capacitado para


utilizar las siguientes funciones de fecha/hora:
• TZ_OFFSET • CURRENT_DATE
• FROM_TZ • CURRENT_TIMESTAMP
• TO_TIMESTAMP • LOCALTIMESTAMP
• TO_TIMESTAMP_TZ • DBTIMEZONE
• TO_YMINTERVAL • SESSIONTIMEZONE
• EXTRACT
B
as L í
e
SQ Gu
de Fu de

Objetivos
D da Al

Esta lección trata algunas de las funciones de fecha/hora disponibles en la base de


datos Oracle.
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-2


161
Introducción a Oracle 10g: SQL Fundamentals II

Zonas Horarias

-08:00 +07:00

+02:00 +10:00
-05:00
B

La imagen representa la hora para


cada zona horaria cuando son las
as L í

12:00 en Greenwich.
e
SQ Gu
de Fu de

Zonas Horarias
D da Al

Las horas del día se miden según la rotación de la Tierra. La hora en cualquier momento
concreto depende del lugar en el que se esté. Cuando son las doce del mediodía en
at m u

Greenwich, Inglaterra, es medianoche en toda la línea de fecha internacional. La Tierra se


divide en 24 zonas horarias, una para cada hora del día. La hora a lo largo del meridiano de
os e m
n

Greenwich, Inglaterra, se conoce como Hora del Meridiano de Greenwich, o GMT. GMT es
a

el estándar horario que sirve de referencia al resto de zonas horarias del mundo. Es la misma
durante todo el año y no se ve afectada por el horario de invierno o de verano. El meridiano es
O ta o

una línea imaginaria que va del Polo Norte al Polo Sur. Se conoce como longitud cero y es la
línea a partir de la cual se miden todas las demás líneas de longitud. Todas las horas se miden
ra ls
l

en relación al GMT y todos los lugares tienen una latitud (distancia al norte o al sur del
ecuador) y una longitud (distancia al este o al oeste del meridiano de Greenwich).
cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-3


162
Introducción a Oracle 10g: SQL Fundamentals II

Parámetro de Sesión TIME_ZONE

TIME_ZONE se puede definir en:


• Un offset absoluto
• Zona horaria de la base de datos
• Zona horaria del sistema operativo local
• Una región especificada

ALTER SESSION SET TIME_ZONE = '-05:00';


ALTER SESSION SET TIME_ZONE = dbtimezone;
ALTER SESSION SET TIME_ZONE = local;
ALTER SESSION SET TIME_ZONE = 'America/New_York';
B
as L í
e
SQ Gu
de Fu de

Parámetro de Sesión TIME_ZONE


D da Al

La base de datos Oracle soporta el almacenamiento de la zona horaria en sus datos de fecha y
hora, además de en fracciones de segundo. El comando ALTER SESSION se puede utilizar
at m u

para cambiar los valores de zona horaria en una sesión de usuario. Los valores de zona horaria
se pueden definir en un offset absoluto, una zona horaria especificada, una zona horaria de
os e m
n

base de datos o la zona horaria local.


a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-4


163
Introducción a Oracle 10g: SQL Fundamentals II

CURRENT_DATE, CURRENT_TIMESTAMP
y LOCALTIMESTAMP

• CURRENT_DATE
– Devuelve la fecha actual del sistema
– Tiene un tipo de datos DATE
• CURRENT_TIMESTAMP
– Devuelve el registro de hora actual del sistema
– Tiene un tipo de datos TIMESTAMP WITH TIME ZONE
• LOCALTIMESTAMP
– Devuelve el registro de hora actual de la sesión de
usuario
– Tiene un tipo de datos TIMESTAMP
B
as L í
e
SQ Gu
de Fu de

CURRENT_DATE, CURRENT_TIMESTAMP y LOCALTIMESTAMP


D da Al

Las funciones CURRENT_DATE y CURRENT_TIMESTAMP devuelven la fecha actual y el


registro de hora actual, respectivamente. El tipo de datos de CURRENT_DATE es DATE. El
at m u

tipo de datos de CURRENT_TIMESTAMP es TIMESTAMP WITH TIME ZONE. Los valores


devueltos muestran el desplazamiento de zona horaria de la sesión SQL que ejecuta las
os e m
n

funciones. El desplazamiento de zona horaria es la diferencia (en horas y minutos) entre la


a

hora local y UTC. El tipo de datos TIMESTAMP WITH TIME ZONE tiene el formato:
TIMESTAMP [ (fractional_seconds_precision) ] WITH TIME ZONE
O ta o

donde fractional_seconds_precision especifica opcionalmente el número de


ra ls

dígitos de la parte fraccional del campo de fecha/hora SECOND y puede ser un número en el
l

rango de 0 a 9. El valor por defecto es 6.


cl I

La función LOCALTIMESTAMP devuelve la fecha y la hora actuales de la zona horaria de la


n

sesión. La diferencia entre LOCALTIMESTAMP y CURRENT_TIMESTAMP es que


e I

LOCALTIMESTAMP devuelve un valor TIMESTAMP, mientras que CURRENT_TIMESTAMP


devuelve un valor TIMESTAMP WITH TIME ZONE.
10

Estas funciones son sensibles a NLS, es decir, los resultados estarán en los formatos de
n

fecha/hora y de calendario NLS actuales.


g

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-5


164
Introducción a Oracle 10g: SQL Fundamentals II

CURRENT_DATE

Muestre la fecha y la hora actuales de la zona horaria


de la sesión.
ALTER SESSION
SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';

ALTER SESSION SET TIME_ZONE = '-5:0';


SELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL;

ALTER SESSION SET TIME_ZONE = '-8:0';


B

SELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL;


as L í
e
SQ Gu
de Fu de

CURRENT_DATE
D da Al

La función CURRENT_DATE devuelve la fecha actual de la zona horaria de la sesión. El valor


de retorno es una fecha del calendario gregoriano.
at m u

Los ejemplos de la diapositiva ilustran que CURRENT_DATE es sensible a la zona horaria de


os e m

la sesión. En el primer ejemplo, la sesión se modifica para definir el parámetro TIME_ZONE


n

en –5:0. El parámetro TIME_ZONE especifica el desplazamiento de zona horaria local por


a

defecto para la sesión SQL actual. TIME_ZONE es sólo un parámetro de la sesión, y no un


parámetro de inicialización. El parámetro TIME_ZONE se define del modo siguiente:
O ta o

TIME_ZONE = '[+ | -] hh:mm'


ra ls

La máscara de formato ([+ | -] hh:mm) indica las horas y los minutos antes o después
l

de UTC (Hora Universal Coordinada, lo que antes se conocía como Hora del Meridiano
cl I

de Greenwich).
n

Observe en la salida que el valor de CURRENT_DATE cambia cuando el valor del parámetro
e I

TIME_ZONE se cambia a –8:0 en el segundo ejemplo.


10

Nota: El comando ALTER SESSION define el formato de fecha de la sesión en


'DD-MON-YYYY HH24:MI:SS' que es día del mes (1-31)-nombre abreviado del mes-
n

año con 4 dígitos hora del día (0-23):minuto (0-59):segundo (0-59).


g

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-6


165
Introducción a Oracle 10g: SQL Fundamentals II

CURRENT_TIMESTAMP

Muestre la fecha y la hora fraccional actuales de la


zona horaria de la sesión.
ALTER SESSION SET TIME_ZONE = '-5:0';
SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP
FROM DUAL;

ALTER SESSION SET TIME_ZONE = '-8:0';


SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP
FROM DUAL;
B
as L í
e
SQ Gu
de Fu de

CURRENT_TIMESTAMP
D da Al

La función CURRENT_TIMESTAMP devuelve la fecha y la hora actuales de la zona horaria


de la sesión, como valor del tipo de datos TIMESTAMP WITH TIME ZONE. El
at m u

desplazamiento de zona horaria refleja la hora local actual de la sesión SQL. La sintaxis de la
función CURRENT_TIMESTAMP es:
os e m
n

CURRENT_TIMESTAMP (precision)
a

donde precision es un argumento opcional que especifica la precisión en fracciones de


O ta o

segundo del valor horario devuelto. Si omite la precisión, el valor por defecto es 6.
El ejemplo de la diapositiva ilustra que CURRENT_TIMESTAMP es sensible a la zona horaria
ra ls

de la sesión. En el primer ejemplo, la sesión se modifica para definir el parámetro


l

TIME_ZONE en –5:0. Observe en la salida que el valor de CURRENT_TIMESTAMP cambia


cl I

cuando el valor del parámetro TIME_ZONE se cambia a –8:0 en el segundo ejemplo.


n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-7


166
Introducción a Oracle 10g: SQL Fundamentals II

LOCALTIMESTAMP

• Muestre la fecha y la hora actuales en la zona horaria


de la sesión en un valor del tipo de datos TIMESTAMP.
ALTER SESSION SET TIME_ZONE = '-5:0';
SELECT CURRENT_TIMESTAMP, LOCALTIMESTAMP
FROM DUAL;

ALTER SESSION SET TIME_ZONE = '-8:0';


SELECT CURRENT_TIMESTAMP, LOCALTIMESTAMP
FROM DUAL;
B

• LOCALTIMESTAMP devuelve un valor TIMESTAMP,


as L í

mientras que CURRENT_TIMESTAMP devuelve un valor


TIMESTAMP WITH TIME ZONE.
e
SQ Gu
de Fu de

LOCALTIMESTAMP
D da Al

La función LOCALTIMESTAMP devuelve la fecha y la hora actuales en la zona horaria de la


sesión. LOCALTIMESTAMP devuelve un valor TIMESTAMP. La sintaxis de la función
at m u

LOCAL_TIMESTAMP es:
os e m

LOCAL_TIMESTAMP (TIMESTAMP_precision)
n
a

donde TIMESTAMP precision es un argumento opcional que especifica la precisión en


fracciones de segundo del valor de TIMESTAMP devuelto.
O ta o

Los ejemplos de la diapositiva ilustran la diferencia entre LOCALTIMESTAMP y


CURRENT_TIMESTAMP. Observe que LOCALTIMESTAMP no muestra el valor de la zona
ra ls

horaria, mientras que CURRENT_TIMESTAMP sí.


l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-8


167
Introducción a Oracle 10g: SQL Fundamentals II

DBTIMEZONE y SESSIONTIMEZONE

• Muestre el valor de la zona horaria de la base de


datos.
SELECT DBTIMEZONE FROM DUAL;

• Muestre el valor de la zona horaria de la sesión.


SELECT SESSIONTIMEZONE FROM DUAL;
B
as L í
e
SQ Gu
de Fu de

DBTIMEZONE y SESSIONTIMEZONE
D da Al

El DBA define la zona horaria por defecto de la base de datos especificando la cláusula SET
TIME_ZONE de la sentencia CREATE DATABASE. Si se omite, la zona horaria por defecto de
at m u

la base de datos es la del sistema operativo. La zona horaria de la base de datos no se puede
cambiar para una sesión con una sentencia ALTER SESSION.
os e m
n

La función DBTIMEZONE devuelve el valor de la zona horaria de la base de datos. El tipo de


a

retorno es un offset de zona horaria (un tipo de carácter del formato '[+|-]TZH:TZM') o un
nombre de región de zona horaria, dependiendo de cómo haya especificado el usuario el valor de
O ta o

zona horaria de la base de datos en las sentencias CREATE DATABASE o ALTER DATABASE
ra ls

más recientes. El ejemplo de la diapositiva muestra que la zona horaria de la base de datos se
l

define en "–05:00", ya que el parámetro TIME_ZONE está en el formato: TIME_ZONE =


'[+ | -] hh:mm'
cl I
n

La función SESSIONTIMEZONE devuelve el valor de la zona horaria de la sesión actual. El tipo


e I

de retorno es un offset de zona horaria (un tipo de carácter del formato '[+|-]TZH:TZM') o un
nombre de región de zona horaria, dependiendo de cómo haya especificado el usuario el valor de
10

zona horaria de la sesión en la sentencia ALTER SESSION más reciente. El ejemplo de la


diapositiva muestra que la zona horaria de la sesión tiene un offset con respecto a UTC de –8
n

horas Observe que la zona horaria de la base de datos es diferente a la de la sesión actual.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-9


168
Introducción a Oracle 10g: SQL Fundamentals II

Tipo de Datos TIMESTAMP

• El tipo de datos TIMESTAMP es una extensión del


tipo de datos DATE.
• Almacena el año, el mes y el día del tipo de datos
DATE, más el valor de horas, minutos y segundos,
así como el valor de fracciones de segundo.
• Las variaciones en TIMESTAMP son:
– TIMESTAMP
[(fractional_seconds_precision)]_
– TIMESTAMP
[(fractional_seconds_precision)]_
WITH TIME ZONE
B

– TIMESTAMP
[(fractional_seconds_precision)]_
as L í

WITH LOCAL TIME ZONE


e
SQ Gu
de Fu de

Tipos de Datos de Fecha/Hora


D da Al

El tipo de datos TIMESTAMP contiene los campos de fecha/hora YEAR, MONTH, DAY, HOUR,
MINUTE y SECOND, y fracciones de segundo.
at m u

El tipo de datos TIMESTAMP WITH TIME ZONE contiene los campos de fecha/hora
os e m

HOUR, MINUTE, SECOND, TIMEZONE_HOUR y TIMEZONE_MINUTE, y fracciones


n

de segundo.
a

El tipo de datos TIMESTAMP WITH TIME ZONE contiene los campos de fecha/hora
O ta o

YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, TIMEZONE_HOUR y


TIMEZONE_MINUTE, y fracciones de segundo.
ra ls

Nota: La precisión de fracciones de segundo especifica el número de dígitos de la parte


l

fraccional del campo de fecha/hora SECOND y puede ser un número del rango de 0 a 9. El
cl I

valor por defecto es 6.


n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-10


169
Introducción a Oracle 10g: SQL Fundamentals II

Tipos de Datos TIMESTAMP

Tipo de Datos Campos

YEAR, MONTH, DAY, HOUR, MINUTE,


TIMESTAMP
SECOND con fracciones de segundo
TIMESTAMP WITH TIME YEAR, MONTH, DAY, HOUR, MINUTE,
ZONE SECOND con fracciones de segundo,
TIMEZONE_HOUR y TIMEZONE_
MINUTE o TIMEZONE_REGION

TIMESTAMP WITH LOCAL YEAR, MONTH, DAY, HOUR, MINUTE,


TIME ZONE SECOND con fracciones de segundo
B
as L í
e
SQ Gu
de Fu de

Tipos de Datos TIMESTAMP


D da Al

TIMESTAMP (fractional_seconds_precision)
at m u

Este tipo de datos contiene los valores de fecha de año, mes y día, además de los valores
de hora, minuto y segundo, donde la precisión de fracciones de segundo es el número de
os e m

dígitos de la parte fraccional del campo de fecha/hora SECOND. Los valores aceptados de
n

fractional_seconds_precision significativos son de 0 a 9. El valor por


a

defecto es 6.
O ta o

TIMESTAMP (fractional_seconds_precision) WITH TIME ZONE


Este tipo de datos contiene todos los valores de TIMESTAMP además del valor de
ra ls

desplazamiento de zona horaria.


l

TIMESTAMP (fractional_seconds_precision) WITH LOCAL TIME ZONE


cl I
n

Este tipo de datos contiene todos los valores de TIMESTAMP, con las siguientes excepciones:
• Los datos se normalizan en la zona horaria de la base de datos cuando se almacena en la
e I

base de datos.
10

• Cuando se recuperan los datos, los usuarios los ven en la zona horaria de la sesión.
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-11


170
Introducción a Oracle 10g: SQL Fundamentals II

Campos TIMESTAMP

Campo de Fecha/Hora Valores Válidos


YEAR De –4712 a 9999 (excluido el año 0)
MONTH De 01 a 12
DAY De 01 a 31
HOUR De 00 a 23
MINUTE De 00 a 59
SECOND De 00 a 59.9(N) donde 9(N) es la precisión
TIMEZONE_HOUR De –12 a 14
TIMEZONE_MINUTE De 00 a 59
B
as L í
e
SQ Gu
de Fu de

Campos TIMESTAMP
D da Al

Cada tipo de datos de fecha/hora está compuesto por varios de estos campos. Las fechas/horas
son asignables y comparables mutuamente sólo si tienen los mismos campos de fecha/hora.
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-12


171
Introducción a Oracle 10g: SQL Fundamentals II

Diferencia entre DATE y TIMESTAMP


A B
-- when hire_date is ALTER TABLE emp5
of type DATE MODIFY hire_date TIMESTAMP;

SELECT hire_date SELECT hire_date


FROM emp5; FROM emp5;
B


as L í


e
SQ Gu
de Fu de

Tipo de Datos TIMESTAMP: Ejemplo


D da Al

En la diapositiva, el ejemplo A muestra los datos de la columna hire_date de la tabla


EMP5 cuando el tipo de datos de la columna es DATE. En el ejemplo B, la tabla se modifica y
at m u

el tipo de datos de la columna hire_date se convierte en TIMESTAMP. La salida muestra


las diferencias en pantalla. Se puede convertir de DATE a TIMESTAMP cuando la columna
os e m
n

tiene datos, pero no se puede convertir de DATE o TIMESTAMP a TIMESTAMP WITH


a

TIME ZONE a menos que la columna esté vacía.


Puede especificar la precisión en fracciones de segundo para el registro de hora. Si no se
O ta o

especifica ninguna, como en el ejemplo anterior, toma el valor por defecto de 6.


ra ls

Por ejemplo, la siguiente sentencia define la precisión de fracciones de segundo en 7:


l

ALTER TABLE emp5


cl I

MODIFY hire_date TIMESTAMP(7);


n

Nota: El tipo de datos de fecha de Oracle por defecto aparece como se muestra en el ejemplo.
e I

Sin embargo, el tipo de datos de fecha también contiene información adicional como horas,
minutos, segundos, a.m. y p.m. Para obtener la fecha en este formato, puede aplicar una
10

máscara de formato o una función al valor de fecha.


n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-13


172
Introducción a Oracle 10g: SQL Fundamentals II

Tipo de Datos TIMESTAMP WITH TIME ZONE

• TIMESTAMP WITH TIME ZONE es una variante de


TIMESTAMP que incluye el desplazamiento de zona
horaria en su valor.
• El desplazamiento de zona horaria es la diferencia,
en horas y minutos, entre la hora local y UTC.
• Se especifica como:
TIMESTAMP[(fractional_seconds_precision)]
WITH TIME ZONE
B
as L í
e
SQ Gu
de Fu de

Tipo de Datos TIMESTAMP WITH TIME ZONE


D da Al

UTC son las siglas en inglés de Hora Universal Coordinada (lo que antes se conocía como
Hora del Meridiano de Greenwich). Dos valores TIMESTAMP WITH TIME ZONE se
at m u

consideran idénticos si representan el mismo instante en UTC, independientemente de los


offsets TIME ZONE almacenados en los datos. Por ejemplo:
os e m
n

TIMESTAMP '1999-04-15 8:00:00 -8:00'


a

es lo mismo que
TIMESTAMP '1999-04-15 11:00:00 -5:00'.
O ta o

Es decir, 8:00 a.m. Hora Oficial del Pacífico es lo mismo que 11:00 a.m. Hora Oficial
ra ls

Oriental.
l

También se puede especificar como:


cl I

TIMESTAMP '1999-04-15 8:00:00 US/Pacific'


n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-14


173
Introducción a Oracle 10g: SQL Fundamentals II

TIMESTAMP WITH TIMEZONE: Ejemplo

CREATE TABLE web_orders


(ord_id number primary key,
order_date TIMESTAMP WITH TIME ZONE);

INSERT INTO web_orders values


(ord_seq.nextval, current_date);

SELECT * FROM web_orders;


B
as L í
e
SQ Gu
de Fu de

TIMESTAMP WITH TIME ZONE: Ejemplo


D da Al

En el ejemplo de la diapositiva, se crea una nueva tabla, web_orders, con una columna del
tipo de datos TIMESTAMP WITH TIME ZONE. Esta tabla se rellena siempre que se realice
at m u

un pedido por Web (web_order). El registro de hora y la zona horaria del usuario que
realiza el pedido se inserta basándose en el valor de CURRENT_DATE. De este modo, una
os e m
n

compañía basada en Web garantiza el envío y puede estimar su tiempo de entrega basándose
a

en la zona horaria de la persona que realiza el pedido.


O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-15


174
Introducción a Oracle 10g: SQL Fundamentals II

TIMESTAMP WITH LOCAL TIMEZONE

• TIMESTAMP WITH LOCAL TIME ZONE es otra


variante de TIMESTAMP que incluye el
desplazamiento de la zona horaria en su valor.
• Los datos almacenados en la base de datos se
normalizan en la zona horaria de la misma.
• El desplazamiento de zona horaria no se almacena
como parte de los datos de columna.
• La base de datos Oracle devuelve los datos en la
zona horaria de la sesión local del usuario.
• El tipo de datos TIMESTAMP WITH LOCAL TIME
ZONE se especifica así:
B

TIMESTAMP[(fractional_seconds_precision)]
as L í

WITH LOCAL TIME ZONE


e
SQ Gu
de Fu de

TIMESTAMP WITH LOCAL TIMEZONE


D da Al

A diferencia de TIMESTAMP WITH TIME ZONE, puede especificar columnas del tipo
TIMESTAMP WITH LOCAL TIME ZONE como parte de una clave primaria o única. El
at m u

desplazamiento de zona horaria es la diferencia (en horas y minutos) entre la hora local y
UTC. No hay ningún literal para TIMESTAMP WITH LOCAL TIME ZONE.
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-16


175
Introducción a Oracle 10g: SQL Fundamentals II

TIMESTAMP WITH LOCAL TIMEZONE: Ejemplo

CREATE TABLE shipping (delivery_time TIMESTAMP WITH


LOCAL TIME ZONE);
INSERT INTO shipping VALUES(current_timestamp + 2);

SELECT * FROM shipping;

ALTER SESSION SET TIME_ZONE = 'EUROPE/LONDON';


SELECT * FROM shipping;
B
as L í
e
SQ Gu
de Fu de

TIMESTAMP WITH LOCAL TIME ZONE: Ejemplo


D da Al

En el ejemplo de la diapositiva, se crea una nueva tabla, SHIPPING , con una columna del
tipo de datos TIMESTAMP WITH LOCAL TIME ZONE. Para rellenar esta tabla, se insertan
at m u

en ella dos días desde el valor CURRENT_TIMESTAMP cada vez que se realice un pedido. La
salida de la tabla DATE_TAB muestra que los datos se almacenan sin el offset de zona
os e m
n

horaria. El comando ALTER SESSION se emite para cambiar la zona horaria a la zona
a

horaria local del lugar de entrega. Una segunda consulta en la misma tabla refleja ahora los
datos con la zona horaria local reflejada en el valor de hora, de modo que se puede notificar al
O ta o

cliente la hora de entrega estimada.


ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-17


176
Introducción a Oracle 10g: SQL Fundamentals II

Tipos de Datos INTERVAL

• Los tipos de datos INTERVAL se utilizan para almacenar


la diferencia entre dos valores de fecha/hora.
• Hay dos clases de intervalos:
– Año-mes
– Día-hora
• La precisión del intervalo:
– Es el subjuego real de campos que componen un
intervalo
– Se especifica en el cualificador de intervalo
Tipo de Datos Campos
B

INTERVAL YEAR TO MONTH YEAR, MONTH


as L í

DAY, HOUR, MINUTE, SECOND con


INTERVAL DAY TO SECOND
fracciones de segundo
e
SQ Gu
de Fu de

Tipos de Datos INTERVAL


D da Al

Los tipos de datos INTERVAL se utilizan para almacenar la diferencia entre dos valores de
fecha/hora. Hay dos clases de intervalos: intervalos año-mes e intervalos día-hora. Un
at m u

intervalo año-mes se compone de un subjuego contiguo de campos YEAR y MONTH, mientras


que un intervalo día-hora se compone de un subjuego contiguo de campos DAY, HOUR,
os e m
n

MINUTE y SECOND. El subjuego real de campos que componen un intervalo se denomina


a

precisión del intervalo y se especifica en el cualificador de intervalo. Como el número de días


de un año depende del calendario, el intervalo año-mes es dependiente de NLS, mientras que
O ta o

el intervalo día-hora es independiente de NLS.


ra ls

El cualificador de intervalo también puede especificar la precisión del campo inicial, que es el
l

número de dígitos del campo inicial o único (que en caso del campo final es SECOND)
cl I

también puede especificar la precisión de fracciones de segundo, que es el número de dígitos


n

de la parte fraccional del valor SECOND. Si no se especifica, el valor por defecto para la
e I

precisión de campo inicial es de 2 dígitos y el valor por defecto para la precisión de fracciones
de segundo es de 6 dígitos
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-18


177
Introducción a Oracle 10g: SQL Fundamentals II

Tipos de Datos INTERVAL (continuación)


INTERVAL YEAR (year_precision) TO MONTH
Este tipo de datos almacena un período de tiempo en años y meses, mientras que
year_precision es el número de dígitos del campo de fecha/hora YEAR. Los valores
aceptados son de 0 a 9. El valor por defecto es 6.
INTERVAL DAY (day_precision) TO SECOND
(fractional_seconds_precision)
Este tipo de datos almacena un período de tiempo en días, horas, minutos y segundos, donde
day_precision es el número máximo de dígitos del campo de fecha/hora DAY (los
valores aceptados son de 0 a 9; el valor por defecto es 2) y fractional_seconds_
precision es el número de dígitos de la parte fraccional del campo SECOND. Los valores
aceptados son de 0 a 9. El valor por defecto es 6.
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-19


178
Introducción a Oracle 10g: SQL Fundamentals II

Campos INTERVAL

Campo INTERVAL Valores Válidos para el Intervalo


YEAR Cualquier entero positivo o negativo
MONTH De 00 a 11
DAY Cualquier entero positivo o negativo
HOUR De 00 a 23
MINUTE De 00 a 59
SECOND De 00 a 59.9(N) donde 9(N) es la precisión
B
as L í
e
SQ Gu
de Fu de

Campos INTERVAL
D da Al

INTERVAL YEAR TO MONTH puede tener campos YEAR y MONTH.


at m u

INTERVAL DAY TO SECOND puede tener campos DAY, HOUR, MINUTE y SECOND.
El subjuego real de campos que componen un elemento de cualquiera de los dos tipos de
os e m

intervalo se define mediante un cualificador de intervalo y este subjuego se conoce como


n
a

precisión del elemento.


Los intervalos año-mes son asignables y comparables mutuamente sólo con otros intervalos
O ta o

año-mes y los intervalos día-hora son asignables y comparables mutuamente sólo con otros
intervalos día-hora.
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-20


179
Introducción a Oracle 10g: SQL Fundamentals II

Tipo de Datos INTERVAL YEAR TO MONTH

INTERVAL YEAR TO MONTH almacena un período de


tiempo mediante los campos de fecha/hora YEAR y MONTH.
INTERVAL YEAR [(year_precision)] TO MONTH

• Por ejemplo:
'312-2' assigned to INTERVAL YEAR(3) TO MONTH
Indicates an interval of 312 years and 2 months
'312-0' assigned to INTERVAL YEAR(3) TO MONTH
Indicates 312 years and 0 months
'0-3' assigned to INTERVAL YEAR TO MONTH
B

Indicates an interval of 3 months


as L í
e
SQ Gu
de Fu de

Tipo de Datos INTERVAL YEAR TO MONTH


D da Al

INTERVAL YEAR TO MONTH almacena un período de tiempo mediante los campos de


fecha/hora YEAR y MONTH. Especifique INTERVAL YEAR TO MONTH del siguiente modo:
at m u

INTERVAL YEAR [(year_precision)] TO MONTH


os e m

donde year_precision es el número de dígitos del campo de fecha/hora YEAR. El valor


n
a

por defecto de year_precision es 2.


Restricción: El campo inicial debe ser más significativo que el campo final. Por ejemplo,
O ta o

INTERVAL '0-1' MONTH TO YEAR no es válido.


El siguiente literal INTERVAL YEAR TO MONTH indica un intervalo de 123 años
ra ls
l

y 3 meses:
• INTERVAL '123-3' YEAR(3) TO MONTH
cl I
n

• INTERVAL '123' YEAR(3) indica un intervalo de 123 años y 0 meses.


• INTERVAL '3' MONTH indica un intervalo de 3 meses.
e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-21


180
Introducción a Oracle 10g: SQL Fundamentals II

INTERVAL YEAR TO MONTH: Ejemplo

CREATE TABLE warranty


(prod_id number, warranty_time INTERVAL YEAR(3)
TO MONTH);
INSERT INTO warranty VALUES (123, INTERVAL '8'
MONTH);
INSERT INTO warranty VALUES (155, INTERVAL '200'
YEAR(3));
INSERT INTO warranty VALUES (678, '200-11');
SELECT * FROM warranty;
B
as L í
e
SQ Gu
de Fu de

Tipo de Datos INTERVAL YEAR TO MONTH (continuación)


D da Al

INTERVAL YEAR TO MONTH almacena un período de tiempo mediante los campos de


fecha/hora YEAR y MONTH. Especifique INTERVAL YEAR TO MONTH del siguiente modo:
at m u

INTERVAL YEAR [(year_precision)] TO MONTH


os e m

donde year_precision es el número de dígitos del campo de fecha/hora YEAR. El valor


n
a

por defecto de year_precision es 2.


Restricción: El campo inicial debe ser más significativo que el campo final. Por ejemplo,
O ta o

INTERVAL '0-1' MONTH TO YEAR no es válido.


La base de datos Oracle soporta dos tipos de datos de intervalo: INTERVAL YEAR TO
ra ls
l

MONTH e INTERVAL DAY TO SECOND; el tipo de columna, el argumento PL/SQL, la


variable y el tipo de retorno deben ser de uno de los dos. Sin embargo, para literales de
cl I
n

intervalo el sistema reconoce otros tipos de intervalo ANSI como, por ejemplo, INTERVAL
'2' YEAR o INTERVAL '10' HOUR. En estos casos, cada intervalo se convierte a uno de
e I

los dos tipos soportados.


10

En el ejemplo anterior, se crea la tabla WARRANTY, que contiene una columna


warranty_time que toma el tipo de datos INTERVAL YEAR(3) TO MONTH. Se
n

insertan en ella valores diferentes para indicar años y meses para diversos productos. Cuando
g

se recuperan estas filas de la tabla, se ve que un valor de mes ha desplazado el valor de año
mediante un (-)

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-22


181
Introducción a Oracle 10g: SQL Fundamentals II

Tipo de Datos INTERVAL DAY TO SECOND

INTERVAL DAY TO SECOND


(fractional_seconds_precision) almacena un
período de tiempo en días, horas, minutos y segundos.
INTERVAL DAY[(day_precision)] TO Second

• Por ejemplo:
INTERVAL '6 03:30:16' DAY TO SECOND
Indicates an interval of 6 days 3 hours 30 minutes
and 16 seconds

INTERVAL '6 00:00:00' DAY TO SECOND


B

Indicates an interval of 6 days and 0 hours, 0


minutes and 0 seconds
as L í
e
SQ Gu
de Fu de

Tipo de Datos INTERVAL DAY TO SECOND


D da Al

INTERVAL DAY (day_precision) TO SECOND (fractional_seconds_


precision) almacena un período de tiempo en días, horas, minutos y segundos, donde
at m u

day_precision es el número máximo de dígitos del campo de fecha/hora DAY (los


valores aceptados son de 0 a 9; el valor por defecto es 2) y
os e m
n

fractional_seconds_precision es el número de dígitos de la parte fraccional del


a

campo SECOND. Los valores aceptados son de 0 a 9. El valor por defecto es 6.


En el ejemplo anterior, 6 representa el número de días y 03:30:15 indica los valores para
O ta o

horas, minutos y segundos.


ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-23


182
Introducción a Oracle 10g: SQL Fundamentals II

Tipo de Datos
INTERVAL DAY TO SECOND: Ejemplo

CREATE TABLE lab


( exp_id number, test_time INTERVAL DAY(2) TO
SECOND);

INSERT INTO lab VALUES (100012, '90 00:00:00');


INSERT INTO lab VALUES (56098,
INTERVAL '6 03:30:16' DAY TO SECOND);

SELECT * FROM lab;


B
as L í
e
SQ Gu
de Fu de

Tipo de Datos INTERVAL DAY TO SECOND: Ejemplo


D da Al

En el ejemplo anterior, está creando la tabla de prácticas con una columna test_time del
tipo de datos INTERVAL DAY TO SECOND. Inserte en ella a continuación el valor
at m u

“90 00:00:00” para indicar 90 días, 0 horas, 0 minutos y 0 segundos e INTERVAL


'6 03:30:16' DAY TO SECOND. La sentencia SELECT ilustra cómo se muestran estos
os e m
n

datos en la base de datos.


a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-24


183
Introducción a Oracle 10g: SQL Fundamentals II

EXTRACT

• Muestre el componente YEAR de SYSDATE.


SELECT EXTRACT (YEAR FROM SYSDATE) FROM DUAL;

• Muestre el componente MONTH de HIRE_DATE para


los empleados cuyo MANAGER_ID es 100.
SELECT last_name, hire_date,
EXTRACT (MONTH FROM HIRE_DATE)
FROM employees
WHERE manager_id = 100;
B
as L í
e
SQ Gu
de Fu de

EXTRACT
D da Al

La expresión EXTRACT extrae y devuelve el valor de un campo de fecha/hora especificado de


una expresión de valor de fecha/hora o intervalo. Puede extraer cualquiera de los
at m u

componentes mencionados en la siguiente sintaxis mediante la función EXTRACT. La sintaxis


de la función EXTRACT es:
os e m
n

SELECT EXTRACT ([YEAR] [MONTH][DAY] [HOUR] [MINUTE][SECOND]


a

[TIMEZONE_HOUR] [TIMEZONE_MINUTE]
[TIMEZONE_REGION] [TIMEZONE_ABBR]
O ta o

FROM [datetime_value_expression] [interval_value_expression]);


Al extraer TIMEZONE_REGION o TIMEZONE_ABBR (abreviatura), el valor devuelto es una
ra ls
l

cadena que contiene el nombre o la abreviatura de zona horaria adecuados. Al extraer


cualquiera de los otros valores, el valor devuelto es una fecha del calendario gregoriano. Al
cl I
n

realizar una extracción de una fecha/hora con un valor de zona horaria, el valor devuelto está
en UTC.
e I

En el primer ejemplo de la diapositiva, la función EXTRACT se utiliza para extraer el año


10

(YEAR) de SYSDATE. En el segundo ejemplo de la diapositiva, la función EXTRACT se


utiliza para extraer el mes (MONTH) de la columna HIRE_DATE de la tabla EMPLOYEES,
n

para los empleados que están bajo las órdenes del supervisor cuyo EMPLOYEE_ID es 100.
g

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-25


184
Introducción a Oracle 10g: SQL Fundamentals II

TZ_OFFSET

• Muestre el offset de zona horaria para la zona horaria


'US/Eastern'.
SELECT TZ_OFFSET('US/Eastern') FROM DUAL;

• Muestre el offset de zona horaria para la zona horaria


'Canada/Yukon'.
SELECT TZ_OFFSET('Canada/Yukon') FROM DUAL;

• Muestre el offset de zona horaria para la zona horaria


'Europe/London'.
B

SELECT TZ_OFFSET('Europe/London') FROM DUAL;


as L í
e
SQ Gu
de Fu de

TZ_OFFSET
D da Al

La función TZ_OFFSET devuelve el offset de zona horaria correspondiente al valor


introducido. El valor de retorno es dependiente de la fecha en la que se ejecutó la sentencia.
at m u

Por ejemplo, si la función TZ_OFFSET devuelve el valor –08:00, indica que en la zona
horaria en la que se ejecutó el comando son ocho horas menos que en UTC. Puede introducir
os e m
n

un nombre válido de zona horaria, un offset de zona horaria desde UTC (que simplemente se
a

devuelve a sí mismo) o las palabras clave SESSIONTIMEZONE o DBTIMEZONE. La sintaxis


de la función TZ_OFFSET es:
O ta o

TZ_OFFSET ( ['time_zone_name'] '[+ | -] hh:mm' ]


[ SESSIONTIMEZONE] [DBTIMEZONE]
ra ls
l

Fold Motor Company tiene las oficinas centrales en Michigan, EE.UU., que está en la zona
horaria US/Eastern. El presidente de la compañía, Mr. Fold, desea realizar una conferencia
cl I
n

telefónica con el vicepresidente de operaciones canadienses y el vicepresidente de


operaciones europeas, que están en las zonas horarias Canada/Yukon y Europe/London,
e I

respectivamente. Mr. Fold quiere conocer la hora en cada uno de estos lugares para asegurarse
de que los supervisores senior podrán asistir a la reunión. Para ayudarle, su secretario, Mr.
10

Scott, emite las consultas que se muestran en el ejemplo y obtiene los siguientes resultados:
n

• En la zona horaria 'US/Eastern' son cuatro horas menos que en UTC.


g

• En la zona horaria 'Canada/Yukon' son siete horas menos que en UTC.


• En la zona horaria 'Europe/London' es una hora más que en UTC.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-26


185
Introducción a Oracle 10g: SQL Fundamentals II

TZ_OFFSET (continuación)
Para obtener un listado de valores de nombres de zona horaria válidos, puede consultar la
vista de rendimiento dinámica V$TIMEZONE_NAMES.
SELECT * FROM V$TIMEZONE_NAMES;
B
as L í
e


SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-27


186
Introducción a Oracle 10g: SQL Fundamentals II

Conversión de TIMESTAMP mediante FROM_TZ

• Muestre el valor TIMESTAMP '2000-03-28 08:00:00'


como valor TIMESTAMP WITH TIME ZONE.
SELECT FROM_TZ(TIMESTAMP
'2000-03-28 08:00:00','3:00')
FROM DUAL;

• Muestre el valor TIMESTAMP '2000-03-28 08:00:00'


como valor TIMESTAMP WITH TIME ZONE para la
región de zona horaria 'Australia/North'.
SELECT FROM_TZ(TIMESTAMP
B

'2000-03-28 08:00:00', 'Australia/North')


FROM DUAL;
as L í
e
SQ Gu
de Fu de

Conversión de TIMESTAMP mediante FROM_TZ


D da Al

La función FROM_TZ convierte un valor TIMESTAMP a un valor TIMESTAMP WITH


TIME ZONE.
at m u

La sintaxis de la función FROM_TZ es la siguiente:


os e m

FROM_TZ(TIMESTAMP timestamp_value, time_zone_value)


n
a

donde time_zone_value es una cadena de caracteres con formato 'TZH:TZM' o una


expresión de carácter que devuelve una cadena en TZR (región de zona horaria) con formato
O ta o

TZD opcional. TZD es una cadena de zona horaria abreviada con información de horario de
verano. TZR representa la región de zona horaria en cadenas de entrada de fecha/hora.
ra ls

Algunos ejemplos son 'Australia/North', 'PST' para la hora oficial del


l

Pacífico/EE.UU. y 'PDT' para la hora en horario de verano del Pacífico/EE.UU., etc. Para
cl I

ver un listado de valores válidos para los elementos con formato TZR y TZD, consulte la vista
n

de rendimiento dinámica V$TIMEZONE_NAMES.


e I

El ejemplo de la diapositiva convierte un valor TIMESTAMP a TIMESTAMP WITH


10

TIME ZONE.
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-28


187
Introducción a Oracle 10g: SQL Fundamentals II

Conversión a TIMESTAMP mediante


TO_TIMESTAMP y TO_TIMESTAMP_TZ
• Muestre la cadena de caracteres '2000-12-01 11:00:00'
como un valor TIMESTAMP.
SELECT TO_TIMESTAMP ('2000-12-01 11:00:00',
'YYYY-MM-DD HH:MI:SS')
FROM DUAL;

• Muestre la cadena de caracteres '1999-12-01 11:00:00 -


8:00' como un valor TIMESTAMP WITH TIME ZONE.
SELECT
TO_TIMESTAMP_TZ('1999-12-01 11:00:00 -8:00',
'YYYY-MM-DD HH:MI:SS TZH:TZM')
B

FROM DUAL;
as L í
e
SQ Gu
de Fu de

Conversión a TIMESTAMP mediante TO_TIMESTAMP y TO_TIMESTAMP_TZ


D da Al

La función TO_TIMESTAMP convierte una cadena de tipo de datos CHAR, VARCHAR2,


NCHAR o NVARCHAR2 a un valor del tipo de datos TIMESTAMP. La sintaxis de la función
at m u

TO_TIMESTAMP es:
TO_TIMESTAMP (char,[fmt],['nlsparam'])
os e m
n

El parámetro fmt opcional especifica el formato de char si se omite. La cadena debe estar
a

en el formato del tipo de datos TIMESTAMP. El parámetro opcional nlsparam especifica el


idioma en que se devolverán los nombres y las abreviaturas de mes y de día. Este argumento
O ta o

puede tener esta forma:


'NLS_DATE_LANGUAGE = language'
ra ls

Si omite nlsparams, esta función utiliza el idioma de fecha por defecto para la sesión. El
l

ejemplo de la diapositiva convierte una cadena de caracteres a un valor TIMESTAMP.


cl I

La función TO_TIMESTAMP_TZ convierte una cadena de tipo de datos CHAR, VARCHAR2,


n

NCHAR o NVARCHAR2 a un valor del tipo de datos TIMESTAMP WITH TIME ZONE. La
e I

sintaxis de la función TO_TIMESTAMP_TZ es:


TO_TIMESTAMP_TZ (char,[fmt],['nlsparam'])
10

El parámetro opcional fmt especifica el formato de char. Si se omite, una cadena debe
n

estar en el formato por defecto del tipo de datos TIMESTAMP WITH TIME ZONE. El
g

ejemplo de la diapositiva convierte una cadena de caracteres a un valor TIMESTAMP WITH


TIME ZONE.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-29


188
Introducción a Oracle 10g: SQL Fundamentals II

Conversión de Intervalo de Tiempo con


TO_YMINTERVAL

Muestre una fecha que sea posterior en un año y dos


meses a la fecha de contratación de los empleados que
trabajen en el departamento con DEPARTMENT_ID 20.
SELECT hire_date,
hire_date + TO_YMINTERVAL('01-02') AS
HIRE_DATE_YMININTERVAL
FROM employees
WHERE department_id = 20;
B
as L í
e
SQ Gu
de Fu de

Conversión de Intervalo de Tiempo con TO_YMINTERVAL


D da Al

La función TO_YMINTERVAL convierte una cadena de tipo de datos CHAR, VARCHAR2,


NCHAR o NVARCHAR2 a un tipo de datos INTERVAL YEAR TO MONTH. El tipo de datos
at m u

INTERVAL YEAR TO MONTH almacena un período de tiempo mediante los campos de


fecha/hora YEAR y MONTH: El formato de INTERVAL YEAR TO MONTH es el siguiente:
os e m

INTERVAL YEAR [(year_precision)] TO MONTH


n

donde year_precision es el número de dígitos del campo de fecha/hora YEAR. El valor


a

por defecto de year_precision es 2.


La sintaxis de la función TO_YMINTERVAL es:
O ta o

TO_YMINTERVAL (char)
donde char es la cadena de caracteres que se va a convertir.
ra ls
l

En el ejemplo de la diapositiva se calcula una fecha posterior en un año y dos meses a la fecha
de contratación del empleado que trabaja en el departamento 20 de la tabla EMPLOYEES.
cl I
n

También se puede realizar un cálculo inverso mediante la función TO_YMINTERVAL.


Por ejemplo:
e I

SELECT hire_date, hire_date + TO_YMINTERVAL('-02-04') AS


HIRE_DATE_YMINTERVAL
10

FROM EMPLOYEES WHERE department_id = 20;


n

Observe que la cadena de caracteres transferida a la función TO_YMINTERVAL tiene


g

un valor negativo. El ejemplo devuelve una fecha anterior en dos años y cuatro meses a
la fecha de contratación de los empleados que trabajan en el departamento 20 de la
tabla EMPLOYEES.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-30


189
Introducción a Oracle 10g: SQL Fundamentals II

Uso de TO_DSINTERVAL: Ejemplo

TO_DSINTERVAL: Convierte una cadena de caracteres


a un tipo de datos INTERVAL DAY TO SECOND
SELECT last_name,
TO_CHAR(hire_date, 'mm-dd-yy:hh:mi:ss') hire_date,
TO_CHAR(hire_date +
TO_DSINTERVAL('100 10:00:00'),
'mm-dd-yy:hh:mi:ss') hiredate2
FROM employees;
B
as L í


e
SQ Gu
de Fu de

TO_DSINTERVAL
D da Al

TO_DSINTERVAL convierte una cadena de caracteres de tipo de datos CHAR, VARCHAR2,


NCHAR o NVARCHAR2 a un tipo INTERVAL DAY TO SECOND.
at m u

En el ejemplo anterior, se obtiene una fecha posterior en 100 días y 10 horas a la fecha
de contratación.
os e m
n
a

TO_YMINTERVAL
La función TO_YMINTERVAL convierte una cadena de caracteres de tipo de datos CHAR,
O ta o

VARCHAR2, NCHAR o NVARCHAR2 a un tipo INTERVAL YEAR TO MONTH.


En el siguiente ejemplo, se obtiene una fecha posterior en un año y dos meses a la fecha
ra ls
l

de contratación.
SELECT hire_date, hire_date + TO_YMINTERVAL('01-02') ytm
cl I

FROM employees;
n

e I

HIRE_DATE YTM
--------- ---------
10

17-JUN-87 17-AUG-88
21-SEP-89 21-NOV-90
n

13-JAN-93 13-MAR-94
03-JAN-90 03-MAR-91
g

21-MAY-91 21-JUL-92

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-31


190
Introducción a Oracle 10g: SQL Fundamentals II

Horario de Verano

• Primer domingo de abril


– La hora pasa de 01:59:59 a.m. a 03:00:00 a.m.
– Los valores entre 02:00:00 a.m. y 02:59:59 a.m. no
son válidos.
• Último domingo de octubre
– La hora pasa de 02:00:00 a.m. a 01:00:01 a.m.
– Los valores entre 01:00:01 a.m. y 02:00:00 a.m. son
ambiguos porque suceden dos veces.
B
as L í
e
SQ Gu
de Fu de

DST (Horario de Verano)


D da Al

La mayoría de las naciones occidentales adelanta el reloj una hora en los meses de verano.
Este período se denomina horario de verano. El horario de verano se extiende desde el primer
at m u

domingo de abril al último domingo de octubre en la mayor parte de Estados Unidos, México
y Canadá. Las naciones de la Unión Europea también utilizan el horario de verano. El horario
os e m
n

de verano de Europa comienza una semana antes que en Norteamérica, pero termina a la vez.
a

La base de datos Oracle determina automáticamente, para cualquier región de zona horaria, si
el horario de verano está en vigor y devuelve los valores de hora local de la manera
O ta o

correspondiente. El valor de fecha/hora es suficiente para que la base de datos Oracle


ra ls

determine si el horario de verano está en vigor en una región determinada en todos los casos,
l

excepto en la hora del cambio. La hora del cambio se produce durante el período en que el
cl I

horario de verano entra en vigor o deja de estar en vigor. Por ejemplo, en la región oriental de
n

EE.UU., cuando el horario de verano entra en vigor, la hora cambia de 01:59:59 a.m. a
e I

3:00:00 a.m. El intervalo de una hora entre 02:00:00 y 02:59:59 a.m. no existe. Cuando el
horario de verano deja de estar en vigor, la hora cambia de 02:00:00 a.m. a 01:00:01 a.m. y el
10

intervalo de una hora entre 01:00:01 y 02:00:00 a.m. se repite.


n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-32


191
Introducción a Oracle 10g: SQL Fundamentals II

DST (Horario de Verano) (continuación)


ERROR_ON_OVERLAP_TIME
ERROR_ON_OVERLAP_TIME es un parámetro de sesión para notificar al sistema que emita
un error cuando encuentre una fecha/hora que se produzca en el período superpuesto y no se
ha especificado ninguna abreviatura de zona para distinguir el período.
Por ejemplo, si el horario de verano termina el 31 de octubre, a las 02:00:01 a.m., los períodos
superpuestos serían:
• De 10/31/2004 01:00:01 a.m. a 10/31/2004 02:00:00 a.m. (EDT)
• De 10/31/2004 01:00:01 a.m. a 10/31/2004 02:00:00 a.m. (EST)
Si introduce una cadena de fecha/hora que se produce en uno de estos dos períodos, debe
especificar la abreviatura de zona horaria (por ejemplo, EDT o EST) en la cadena de entrada
para que el sistema determine el período. Sin esta abreviatura de zona horaria, el sistema hará
lo siguiente:
Si el parámetro ERROR_ON_OVERLAP_TIME es FALSE, asume que la hora de entrada es la
hora oficial (por ejemplo, EST). De lo contrario, se produce un error.
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-33


192
Introducción a Oracle 10g: SQL Fundamentals II

Resumen

En esta lección, ha aprendido a utilizar estas


funciones:
• TZ_OFFSET • CURRENT_DATE
• FROM_TZ • CURRENT_TIMESTAMP
• TO_TIMESTAMP • LOCALTIMESTAMP
• TO_TIMESTAMP_TZ • DBTIMEZONE
• TO_YMINTERVAL • SESSIONTIMEZONE
• EXTRACT
B
as L í
e
SQ Gu
de Fu de

Resumen
D da Al

Esta lección ha tratado algunas de las funciones de fecha/hora disponibles en la base de


datos Oracle.
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-34


193
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 5: Visión General

Esta práctica cubre el uso de las funciones de


fecha/hora.
B
as L í
e
SQ Gu
de Fu de

Práctica 5: Visión General


D da Al

En esta práctica, mostrará los offsets de zona horaria, CURRENT_DATE, CURRENT_


TIMESTAMP y LOCALTIMESTAMP. También definirá zonas horarias y utilizará la función
at m u

EXTRACT.
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-35


194
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 5
1. Modifique la sesión para definir NLS_DATE_FORMAT en DD-MON-YYYY
HH24:MI:SS.
2. a. Escriba consultas para mostrar los offsets de zona horaria (TZ_OFFSET) para las
siguientes zonas horarias.
- US/Pacific-New

- Singapore

- Egypt

b. Modifique la sesión para definir el valor del parámetro TIME_ZONE en el offset


de zona horaria US/Pacific-New.
c. Muestre los valores de CURRENT_DATE, CURRENT_TIMESTAMP y
LOCALTIMESTAMP para esta sesión.
B
as L í

d. Modifique la sesión para definir el valor del parámetro TIME_ZONE en el offset


e

de zona horaria Singapore.


SQ Gu
de Fu de

e. Muestre los valores de CURRENT_DATE, CURRENT_TIMESTAMP y


LOCALTIMESTAMP para esta sesión.
Nota: La salida podría ser diferente, según la fecha en que se ejecute
el comando.
D da Al
at m u
os e m
n

Nota: Observe en la práctica anterior que CURRENT_DATE,


a

CURRENT_TIMESTAMP y LOCALTIMESTAMP son todos sensibles a la zona


horaria de la sesión.
O ta o
ra ls

3. Escriba una consulta para mostrar los valores de DBTIMEZONE y


l

SESSIONTIMEZONE.
cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-36


195
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 5 (continuación)
4. Escriba una consulta para extraer el valor de YEAR de la columna HIRE_DATE de la
tabla EMPLOYEES para los empleados que trabajan en el departamento 80.


B
as L í
e
SQ Gu
de Fu de

5. Modifique la sesión para definir NLS_DATE_FORMAT en DD-MON-YYYY.


D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-37


196
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 5 (continuación)
6. Examine y ejecute el archivo de comandos lab05_06.sql para crear la tabla
SAMPLE_DATES y rellenarla.
a. Seleccione en la tabla y vea los datos.

b. Modifique el tipo de datos de la columna DATE_COL y cámbielo a TIMESTAMP.


Seleccione en la tabla para ver los datos.

c. Intente modificar el tipo de datos de la columna DATE_COL y cámbielo a


TIMESTAMP WITH TIME ZONE. ¿Qué sucede?

7. Cree una consulta para recuperar apellidos de la tabla EMPLOYEES y calcule el


estado de revisión. Si el año de contratación fue 2000, muestre Needs Review para
el estado de revisión; de lo contrario, muestre not this year!. Asigne a la
columna de estado de revisión el nombre Review. Ordene los resultados por la
columna HIRE_DATE.
Indicación: Utilice una expresión CASE con la función EXTRACT para calcular el
B

estado de revisión.
as L í
e
SQ Gu
de Fu de
D da Al
at m u


os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-38


197
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 5 (continuación)
8. Cree una consulta para imprimir los apellidos y el número de años de servicio para
cada empleado. Si el empleado lleva contratado cinco años o más, imprima 5 years
of service. Si el empleado lleva contratado 10 años o más, imprima 10 years
of service. Si el empleado lleva contratado 15 años o más, imprima 15 years
of service. Si no se cumple ninguna de estas condiciones, imprima maybe
next year!. Ordene los resultados por la columna HIRE_DATE. Utilice la
tabla EMPLOYEES.
Indicación: Utilice TO_YMINTERVAL y expresiones CASE.


B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-39


198
Introducción a Oracle 10g: SQL Fundamentals II

B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-40


199
Introducción a Oracle 10g: SQL Fundamentals II

Recuperación de Datos mediante Subconsultas


B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

200
Introducción a Oracle 10g: SQL Fundamentals II

Objetivos

Al finalizar esta lección, debería estar capacitado para:


• Escribir una subconsulta de varias columnas
• Utilizar subconsultas escalares en SQL
• Solucionar problemas con subconsultas
correlacionadas
• Actualizar y suprimir filas mediante subconsultas
correlacionadas
• Utilizar los operadores EXISTS y NOT EXISTS
• Utilizar la cláusula WITH
B
as L í
e
SQ Gu
de Fu de

Objetivos
D da Al

En esta lección, aprenderá a escribir subconsultas de varias columnas, así como subconsultas
en la cláusula FROM de una sentencia SELECT. También aprenderá a solucionar problemas
at m u

mediante subconsultas escalares correlacionadas y la cláusula WITH.


os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-2


201
Introducción a Oracle 10g: SQL Fundamentals II

Subconsultas de Varias Columnas

Consulta principal
WHERE (MANAGER_ID, DEPARTMENT_ID) IN

Subconsulta
100 90
102 60
124 50
B

Cada fila de la consulta principal se compara con los


valores de una subconsulta de varias filas y varias
as L í

columnas.
e
SQ Gu
de Fu de

Subconsultas de Varias Columnas


D da Al

Hasta ahora, ha escrito subconsultas de una sola fila y subconsultas de varias filas en las que
sólo se devuelve una columna mediante la sentencia interna SELECT y esto se utiliza para
at m u

evaluar la expresión de la sentencia SELECT principal. Si desea comparar dos o más


columnas, debe escribir una cláusula WHERE compuesta mediante operadores lógicos.
os e m
n

Mediante subconsultas de varias columnas, puede combinar condiciones WHERE duplicadas


a

en una sola cláusula WHERE.


Sintaxis
O ta o

SELECT column, column, ...


ra ls

FROM table
l

WHERE (column, column, ...) IN


cl I

(SELECT column, column, ...


n

FROM table
e I

WHERE condition);
El gráfico de la diapositiva ilustra que los valores de MANAGER_ID y DEPARTMENT_ID de
10

la consulta principal se están comparando con los valores MANAGER_ID y DEPARTMENT_


ID recuperados por la subconsulta. Como el número de columnas que se están comparando es
n

superior a uno, el ejemplo se califica como subconsulta de varias columnas.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-3


202
Introducción a Oracle 10g: SQL Fundamentals II

Comparaciones de Columnas

Las comparaciones de columnas en una subconsulta


de varias columnas pueden ser:
• Comparaciones entre pares
• Comparaciones entre no pares
B
as L í
e
SQ Gu
de Fu de

Comparaciones entre Pares y entre No Pares


D da Al

Las comparaciones de columnas en una subconsulta de varias columnas pueden ser entre
pares y entre no pares.
at m u

En el ejemplo de la siguiente diapositiva, se ejecuta una comparación entre pares en la


os e m

cláusula WHERE. Cada fila candidata de la sentencia SELECT debe tener las dos mismas
n

columnas MANAGER_ID y DEPARTMENT_ID que los empleados con EMPLOYEE_ID 199


a

ó 174.
O ta o

Una subconsulta de varias columnas también puede ser una comparación entre no pares. En
una comparación entre no pares, cada columna de la cláusula WHERE de la sentencia SELECT
ra ls

principal se compara individualmente con varios valores recuperados por la sentencia


l

SELECT interna. Las columnas individuales se pueden corresponder con cualquier valor
cl I

recuperado por la sentencia SELECT interna. Pero colectivamente, se deben satisfacer todas
n

las condiciones múltiples de la sentencia SELECT principal para que se muestre la fila. El
e I

ejemplo de la página siguiente ilustra una comparación entre pares.


10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-4


203
Introducción a Oracle 10g: SQL Fundamentals II

Subconsulta de Comparación entre Pares

Muestre los detalles de los empleados que están a las


órdenes del mismo supervisor y trabajan en el mismo
departamento que los empleados con EMPLOYEE_ID
199 ó 174.
SELECT employee_id, manager_id, department_id
FROM employees
WHERE (manager_id, department_id) IN
(SELECT manager_id, department_id
FROM employees
WHERE employee_id IN (199,174))
AND employee_id NOT IN (199,174);
B
as L í
e
SQ Gu
de Fu de

Subconsulta de Comparación entre Pares


D da Al

El ejemplo de la diapositiva muestra una subconsulta de varias columnas, ya que la


subconsulta devuelve más de una columna. Compara los valores de la columna MANAGER_
at m u

ID y de la columna DEPARTMENT_ID de cada fila en la tabla EMPLOYEES con los valores


de la columna MANAGER_ID y la columna DEPARTMENT_ID para los empleados con
os e m
n

EMPLOYEE_ID 199 ó 174.


a

Primero, se ejecuta la subconsulta para recuperar los valores de MANAGER_ID y


DEPARTMENT_ID para los empleados con EMPLOYEE_ID 199 ó 174. Estos valores se
O ta o

comparan con la columna MANAGER_ID y la columna DEPARTMENT_ID de cada fila de la


ra ls

tabla EMPLOYEES. Si los valores se corresponden, se muestra la fila. En la salida, no se


l

mostrarán los registros de los empleados con EMPLOYEE_ID 199 ó 174. Ésta es la salida de
cl I

la consulta de la diapositiva:
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-5


204
Introducción a Oracle 10g: SQL Fundamentals II

Subconsulta de Comparación entre No Pares

Muestre los detalles de los empleados que están a las


órdenes del mismo supervisor que los empleados con
EMPLOYEE_ID 174 ó 199 y que trabajan en el mismo
departamento que los empleados con EMPLOYEE_ID
174 ó 199.
SELECT employee_id, manager_id, department_id
FROM employees
WHERE manager_id IN
(SELECT manager_id
FROM employees
WHERE employee_id IN (174,199))
AND department_id IN
(SELECT department_id
B

FROM employees
as L í

WHERE employee_id IN (174,199))

AND employee_id NOT IN(174,199);


e
SQ Gu
de Fu de

Subconsulta de Comparación entre No Pares


D da Al

El ejemplo muestra una comparación entre no pares de las columnas. Muestra los valores de
EMPLOYEE_ID, MANAGER_ID y DEPARTMENT_ID de cualquier empleado cuyo
at m u

identificador de supervisor se corresponda con los identificadores de supervisor de los


empleados cuyos identificadores sean 174 ó 199 y los valores de DEPARTMENT_ID se
os e m

correspondan con los identificadores de departamento cuyo identificador de empleado sea


n
a

174 ó 199.
Primero, se ejecuta la subconsulta para recuperar los valores de MANAGER_ID para los
empleados con el valor de EMPLOYEE_ID 199 ó 174. De forma parecida, se ejecuta la
O ta o

segunda subconsulta para recuperar los valores de DEPARTMENT_ID para los empleados con
ra ls

el valor de EMPLOYEE_ID 199 ó 174. Los valores recuperados de las columnas


l

MANAGER_ID y DEPARTMENT_ID se comparan con las columnas MANAGER_ID y


DEPARTMENT_ID de cada fila de la tabla EMPLOYEES. Si la columna MANAGER_ID de la
cl I
n

fila de la tabla EMPLOYEES se corresponde con cualquiera de los valores de MANAGER_ID


recuperados por la subconsulta interna y si la columna DEPARTMENT_ID de la fila de la
e I

tabla EMPLOYEES se corresponde con cualquiera de los valores de DEPARTMENT_ID


recuperados por la segunda subconsulta, se muestra el registro. Ésta es la salida de la consulta
10

de la diapositiva:
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-6


205
Introducción a Oracle 10g: SQL Fundamentals II

Expresiones de Subconsultas Escalares

• Una expresión de subconsulta escalar es una


subconsulta que devuelve exactamente un valor
de columna de una fila.
• Las subconsultas escalares se pueden utilizar en:
– Parte de expresión y condición de DECODE y CASE
– Todas las cláusulas de SELECT excepto GROUP BY
B
as L í
e
SQ Gu
de Fu de

Subconsultas Escalares en SQL


D da Al

Una subconsulta que devuelve exactamente un valor de columna de una fila se conoce
también como subconsulta escalar. Las subconsultas de varias columnas que se escriben para
at m u

comparar dos o más columnas, mediante una cláusula WHERE compuesta y operadores
lógicos, no se califican como subconsultas escalares.
os e m

El valor de la expresión de subconsulta escalar es el valor del elemento de lista de selección


n
a

de la subconsulta. Si la subconsulta devuelve 0 filas, el valor de la expresión de subconsulta


escalar es NULL. Si la subconsulta devuelve más de una fila, Oracle Server devuelve un error.
Oracle Server siempre ha soportado el uso de una subconsulta escalar en una sentencia
O ta o

SELECT. Puede utilizar subconsultas escalares en:


ra ls

• La parte de expresión y condición de DECODE y CASE


l

• Todas las cláusulas de SELECT excepto GROUP BY


• La cláusula SET y la cláusula WHERE de una sentencia UPDATE
cl I
n

Sin embargo, las subconsultas escalares no son expresiones válidas en los siguientes casos:
• Como valores por defecto para columnas y expresiones de comprobación aleatoria para
e I

agrupamientos
• En la cláusula RETURNING de sentencias DML
10

• Como base de un índice basado en funciones


n

• En cláusulas GROUP BY, restricciones CHECK, condiciones WHEN


g

• En cláusulas CONNECT BY
• En sentencias que no estén relacionadas con consultas como, por ejemplo, CREATE
PROFILE

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-7


206
Introducción a Oracle 10g: SQL Fundamentals II

Subconsultas Escalares: Ejemplos

• Subconsultas escalares en expresiones CASE


SELECT employee_id, last_name,
(CASE
20
WHEN department_id =
(SELECT department_id
FROM departments
WHERE location_id = 1800)
THEN 'Canada' ELSE 'USA' END) location
FROM employees;

• Subconsultas escalares en la cláusula ORDER BY


SELECT employee_id, last_name
FROM employees e
B

ORDER BY (SELECT department_name


FROM departments d
as L í

WHERE e.department_id = d.department_id);


e
SQ Gu
de Fu de

Subconsultas Escalares: Ejemplos


D da Al

El primer ejemplo de la diapositiva demuestra que las subconsultas escalares se pueden utilizar
en expresiones CASE. La consulta interna devuelve el valor 20, que es el identificador de
at m u

departamento del departamento cuyo identificador de ubicación es 1800. La expresión CASE


de la consulta externa utiliza el resultado de la consulta interna para mostrar el identificador de
os e m
n

empleado, los apellidos y un valor de Canadá o EE.UU., dependiendo de si el identificador de


a

departamento del registro recuperado por la consulta externa es 20 o no.


Éste es el resultado del primer ejemplo de la diapositiva:

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-8


207
Introducción a Oracle 10g: SQL Fundamentals II

Subconsultas Escalares: Ejemplos (continuación)


El segundo ejemplo de la diapositiva demuestra que las subconsultas escalares se pueden utilizar
en la cláusula ORDER BY. En el ejemplo, se ordena la salida basándose en DEPARTMENT_
NAME al hacer corresponder el valor de DEPARTMENT_ID de la tabla EMPLOYEES con el valor
de DEPARTMENT_ID de la tabla DEPARTMENTS. Esta comparación se realiza en una
subconsulta escalar en la cláusula ORDER BY. Éste es el resultado del segundo ejemplo:


B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o

El segundo ejemplo utiliza una subconsulta correlacionada. En una consulta correlacionada, la


subconsulta hace referencia a una columna desde una tabla a la que se hace referencia en la
ra ls

sentencia principal. Las subconsultas correlacionadas se explican más adelante en esta lección.
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-9


208
Introducción a Oracle 10g: SQL Fundamentals II

Subconsultas Correlacionadas

Las subconsultas correlacionadas se utilizan para el


procesamiento fila a fila. Cada consulta se ejecuta una
vez para cada fila de la consulta externa.
OBTENGA
fila candidata de consulta externa

EJECUTE
consulta interna mediante valor de fila candidata
B

UTILICE
valores de la consulta interna para calificar o
as L í

descalificar la fila candidata


e
SQ Gu
de Fu de

Subconsultas Correlacionadas
D da Al

Oracle Server realiza una consulta correlacionada cuando la subconsulta hace referencia a una
columna desde una tabla a la que se hace referencia en la sentencia principal. Una subconsulta
at m u

correlacionada se evalúa una vez para cada fila procesada por la sentencia principal. La
sentencia principal puede ser una sentencia SELECT, UPDATE o DELETE.
os e m
n

Subconsultas Anidadas frente a Subconsultas Correlacionadas


a

Con una subconsulta anidada normal, la consulta SELECT interna se ejecuta primero y una
vez, y devuelve valores que serán utilizados por la consulta principal. Sin embargo, una
O ta o

subconsulta correlacionada se ejecuta una vez para cada fila candidata considerada por la
consulta externa. Dicho de otro modo, la consulta interna está controlada por la consulta
ra ls
l

externa.
cl I

Ejecución de Subconsultas Anidadas


n

• La consulta interna se ejecuta primero y encuentra un valor.


e I

• La consulta externa se ejecuta una vez y utiliza el valor de la consulta interna.


Ejecución de Subconsultas Correlacionadas
10

• Obtenga una fila candidata (recuperada por la consulta externa).


• Ejecute la consulta interna mediante el valor de la fila candidata.
n

• Utilice los valores resultantes de la consulta interna para calificar o descalificar la fila
g

candidata.
• Repita el proceso hasta que no queden filas candidatas.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-10


209
Introducción a Oracle 10g: SQL Fundamentals II

Subconsultas Correlacionadas

La subconsulta hace referencia a una columna de una


tabla en la consulta principal.
SELECT column1, column2, ...
FROM table1 outer
WHERE column1 operator
(SELECT column1, column2
FROM table2
WHERE expr1 =
outer.expr2);
B
as L í
e
SQ Gu
de Fu de

Subconsultas Correlacionadas (continuación)


D da Al

Una subconsulta correlacionada es una forma de leer todas las filas de una tabla y comparar
los valores de cada fila con datos relacionados. Se utiliza siempre que una subconsulta deba
at m u

devolver un resultado o un juego de resultados diferente para cada fila candidata considerada
por la consulta principal. Dicho de otro modo, utilice una subconsulta correlacionada para
os e m
n

responder a una pregunta de varias partes cuya respuesta dependa del valor de cada fila
a

procesada por la sentencia principal.


Oracle Server realiza una consulta correlacionada cuando la subconsulta hace referencia a una
O ta o

columna desde una tabla de la consulta principal.


ra ls

Nota: Puede utilizar los operadores ANY y ALL en una subconsulta correlacionada.
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-11


210
Introducción a Oracle 10g: SQL Fundamentals II

Uso de Subconsultas Correlacionadas

Busque todos los empleados que ganen más que el


salario medio de su departamento.
SELECT last_name, salary, department_id
FROM employees outer
WHERE salary >
(SELECT AVG(salary)
FROM employees
WHERE department_id =
outer.department_id);

Cada vez que se procesa


una fila de la consulta
B

externa, se evalúa la
as L í

consulta interna.
e
SQ Gu
de Fu de

Uso de Subconsultas Correlacionadas


D da Al

El ejemplo de la diapositiva determina qué empleados ganan más que el salario medio de su
departamento. En este caso, la subconsulta correlacionada calcula específicamente el salario
at m u

medio de cada departamento.


os e m

Como la consulta externa y la interna utilizan la tabla EMPLOYEES en la cláusula FROM, se


n

asigna un alias a EMPLOYEES en la sentencia SELECT externa por motivos de claridad. El


a

alias no sólo hace que toda la sentencia SELECT resulte más legible, sino que sin él, la
consulta no funcionaría correctamente, ya que la sentencia interna no podría distinguir la
O ta o

columna de la tabla interna de la columna de la tabla externa.


ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-12


211
Introducción a Oracle 10g: SQL Fundamentals II

Uso de Subconsultas Correlacionadas

Muestre los detalles de los empleados que hayan


cambiado de puesto al menos dos veces.
SELECT e.employee_id, last_name,e.job_id
FROM employees e
WHERE 2 <= (SELECT COUNT(*)
FROM job_history
WHERE employee_id = e.employee_id);
B
as L í
e
SQ Gu
de Fu de

Uso de Subconsultas Correlacionadas (continuación)


D da Al

El ejemplo de la diapositiva muestra los detalles de los empleados que han cambiado de puesto
al menos dos veces. Oracle Server evalúa una subconsulta correlacionada de esta manera:
at m u

1. Seleccione una fila de la tabla especificada en la consulta externa. Ésta será la fila
candidata actual.
os e m
n

2. Almacene el valor de la columna a la que se hace referencia en la subconsulta desde esta


a

fila candidata. (En el ejemplo de la diapositiva, la columna a la que se hace referencia en


la subconsulta es E.EMPLOYEE_ID).
O ta o

3. Realice la subconsulta con su condición haciendo referencia al valor de la fila candidata


de la consulta externa. (En el ejemplo de la diapositiva, la función de grupo COUNT(*)
ra ls

se evalúa basándose en el valor de la columna E.EMPLOYEE_ID obtenida en el paso 2).


l

4. Evalúe la cláusula WHERE de la consulta externa basándose en los resultados de la


cl I

subconsulta realizada en el paso 3. Esto determina si se selecciona la fila candidata para


n

la salida. (En el ejemplo, el número de veces que un empleado ha cambiado de puesto,


e I

evaluado por la subconsulta, se compara con 2 en la cláusula WHERE de la consulta


externa. Si se satisface la condición, se muestra el registro de ese empleado).
10

5. Repita el procedimiento para la siguiente fila candidata de la tabla, y así sucesivamente


hasta que se hayan procesado todas las filas de la tabla.
n

La correlación se establece mediante un elemento de la consulta externa en la subconsulta. En


g

este ejemplo, se compara EMPLOYEE_ID de la tabla de la subconsulta con el valor de


EMPLOYEE_ID de la tabla de la consulta externa.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-13


212
Introducción a Oracle 10g: SQL Fundamentals II

Uso del Operador EXISTS

• El operador EXISTS comprueba la existencia de filas


en el juego de resultados de la subconsulta.
• Si se encuentra un valor de fila de subconsulta:
– La búsqueda no continúa en la consulta interna
– La condición se indica como TRUE
• Si no se encuentra un valor de fila de subconsulta:
– La condición se indica como FALSE
– La búsqueda continúa en la consulta interna
B
as L í
e
SQ Gu
de Fu de

Operador EXISTS
D da Al

Con las sentencias SELECT anidadas, son válidos todos los operadores lógicos. Además,
puede utilizar el operador EXISTS. Este operador se utiliza frecuentemente con subconsultas
at m u

correlacionadas para probar si existe un valor recuperado por la consulta externa en el juego
de resultados de los valores recuperados por la consulta interna. Si la subconsulta devuelve al
os e m
n

menos una fila, el operador devuelve TRUE. Si el valor no existe, devuelve FALSE. De forma
a

análoga, NOT EXISTS prueba si un valor recuperado por la consulta externa no forma parte
del juego de resultados de los valores recuperados por la consulta interna.
O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-14


213
Introducción a Oracle 10g: SQL Fundamentals II

Búsqueda de Empleados que Tengan al


Menos una Persona a sus Órdenes
SELECT employee_id, last_name, job_id, department_id
FROM employees outer
WHERE EXISTS ( SELECT 'X'
FROM employees
WHERE manager_id =
outer.employee_id);
B
as L í
e
SQ Gu
de Fu de

Uso del Operador EXISTS


D da Al

El operador EXISTS asegura que la búsqueda en la consulta interna no continúe cuando se


encuentre al menos una correspondencia para el número de empleado y de supervisor
at m u

mediante la condición:
WHERE manager_id = outer.employee_id.
os e m
n

Observe que la consulta SELECT interna no necesita devolver un valor específico, por lo que
a

se puede seleccionar una constante.


O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-15


214
Introducción a Oracle 10g: SQL Fundamentals II

Búsqueda de Todos los Departamentos


que No Tengan Empleados
SELECT department_id, department_name
FROM departments d
WHERE NOT EXISTS (SELECT 'X'
FROM employees
WHERE department_id
= d.department_id);
B
as L í
e
SQ Gu
de Fu de

Uso del Operador NOT EXISTS


D da Al

Solución Alternativa
at m u

Se puede utilizar una construcción NOT IN como alternativa para un operador NOT
EXISTS, como se muestra en el siguiente ejemplo:
os e m

SELECT department_id, department_name


n
a

FROM departments
WHERE department_id NOT IN(SELECT department_id
O ta o

FROM employees);
ra ls
l

cl I

Sin embargo, NOT IN se evalúa como FALSE si cualquier miembro del juego es un valor
n

NULL. Por tanto, la consulta no devolverá ninguna fila incluso aunque haya filas en la tabla
e I

DEPARTMENTS que satisfagan la condición WHERE.


10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-16


215
Introducción a Oracle 10g: SQL Fundamentals II

Consulta Correlacionada: UPDATE

Utilice una subconsulta correlacionada para actualizar


filas de una tabla basada en filas de otra tabla.
UPDATE table1 alias1
SET column = (SELECT expression
FROM table2 alias2
WHERE alias1.column =
alias2.column);
B
as L í
e
SQ Gu
de Fu de

Consulta Correlacionada: UPDATE


D da Al

En el caso de la sentencia UPDATE, puede utilizar una subconsulta correlacionada para


actualizar filas de una tabla basada en filas de otra tabla.
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-17


216
Introducción a Oracle 10g: SQL Fundamentals II

Uso de Consultas Correlacionadas: UPDATE

• Para desnormalizar la tabla EMPL6, agregue una


columna para almacenar el nombre del departamento.
• Rellene la tabla mediante una actualización
correlacionada.
ALTER TABLE empl6
ADD(department_name VARCHAR2(25));

UPDATE empl6 e
SET department_name =
(SELECT department_name
FROM departments d
B

WHERE e.department_id = d.department_id);


as L í
e
SQ Gu
de Fu de

Consulta Correlacionada: UPDATE (continuación)


D da Al

En el ejemplo de la diapositiva, se desnormaliza la tabla EMPL6 al agregar una columna para


almacenar el nombre de departamento y rellena después la tabla mediante una actualización
at m u

correlacionada.
A continuación, se muestra otro ejemplo para una actualización correlacionada.
os e m
n

Sentencia con Problema


a

La tabla REWARDS tiene una lista de empleados que han excedido las expectativas en su
O ta o

rendimiento. Utilice una subconsulta correlacionada para actualizar filas en la tabla EMPL6
basada en filas de la tabla REWARDS.
ra ls

UPDATE empl6
l

SET salary = (SELECT employees.salary + rewards.pay_raise


FROM rewards
cl I
n

WHERE employee_id =
employees.employee_id
e I

AND payraise_date =
(SELECT MAX(payraise_date)
10

FROM rewards
WHERE employee_id = employees.employee_id))
n

WHERE employees.employee_id
g

IN (SELECT employee_id FROM rewards);

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-18


217
Introducción a Oracle 10g: SQL Fundamentals II

Consulta Correlacionada: UPDATE (continuación)


En este ejemplo se utiliza la tabla REWARDS. La tabla REWARDS tiene las columnas
EMPLOYEE_ID, PAY_RAISE y PAYRAISE_DATE. Cada vez que un empleado obtiene un
aumento de salario, se inserta un registro con los detalles de identificador de empleado, la
cantidad del aumento de salario y la fecha de recepción del aumento de salario en la tabla
REWARDS. La tabla REWARDS puede contener más de un registro para un empleado. La
columna PAYRAISE_DATE se utiliza para identificar el aumento de salario más reciente
recibido por un empleado.
En el ejemplo, la columna SALARY de la tabla EMPL6 se actualiza para reflejar el último
aumento de salario recibido por el empleado. Para ello, se agrega el salario actual del
empleado con el aumento de salario correspondiente de la tabla REWARDS.
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-19


218
Introducción a Oracle 10g: SQL Fundamentals II

Consulta Correlacionada: DELETE

Utilice una subconsulta correlacionada para suprimir


filas de una tabla basada en filas de otra tabla.
DELETE FROM table1 alias1
WHERE column operator
(SELECT expression
FROM table2 alias2
WHERE alias1.column = alias2.column);
B
as L í
e
SQ Gu
de Fu de

Consulta Correlacionada: DELETE


D da Al

En el caso de una sentencia DELETE, puede utilizar una subconsulta correlacionada para
suprimir sólo las filas que también existen en otra tabla. Si decide que sólo va a mantener los
at m u

cuatro últimos registros del historial de puestos de la tabla JOB_HISTORY, cuando se


transfiere un empleado a un quinto puesto, suprima la fila JOB_HISTORY más antigua
os e m
n

buscando MIN(START_DATE) en la tabla JOB_HISTORY para el empleado. El siguiente


a

código ilustra cómo se puede realizar la operación anterior mediante una supresión (DELETE)
correlacionada:
O ta o

DELETE FROM emp_history JH


WHERE employee_id =
ra ls

(SELECT employee_id
l

FROM employees E
cl I

WHERE JH.employee_id = E.employee_id


n

AND START_DATE =
e I

(SELECT MIN(start_date)
FROM job_history JH
10

WHERE JH.employee_id = E.employee_id)


AND 5 > (SELECT COUNT(*)
n

FROM job_history JH
g

WHERE JH.employee_id = E.employee_id


GROUP BY EMPLOYEE_ID
HAVING COUNT(*) >= 4));

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-20


219
Introducción a Oracle 10g: SQL Fundamentals II

Uso de Consultas Correlacionadas: DELETE

Utilice una subconsulta correlacionada para suprimir


sólo las filas de la tabla EMPL6 que también existan en
la tabla EMP_HISTORY.
DELETE FROM empl6 E
WHERE employee_id =
(SELECT employee_id
FROM emp_history
WHERE employee_id = E.employee_id);
B
as L í
e
SQ Gu
de Fu de

Consulta Correlacionada: DELETE (continuación)


D da Al

Ejemplo
at m u

En este ejemplo se utilizan dos tablas. Estas tablas son:


• La tabla EMPL6, que proporciona detalles de todos los empleados actuales
os e m

• La tabla EMP_HISTORY, que proporciona detalles de empleados anteriores


n
a

EMP_HISTORY contiene datos relacionados con empleados anteriores, por lo que sería
erróneo que el registro del mismo empleado existiera en las tablas EMPL6 y EMP_HISTORY.
O ta o

Puede suprimir dichos registros erróneos mediante la subconsulta correlacionada que se


muestra en la diapositiva.
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-21


220
Introducción a Oracle 10g: SQL Fundamentals II

Cláusula WITH

• Mediante la cláusula WITH, puede utilizar el mismo


bloque de consulta en una sentencia SELECT cuando
se produce más de una vez dentro de una consulta
compleja.
• La cláusula WITH recupera los resultados de un
bloque de consulta y los almacena en el tablespace
temporal del usuario.
• La cláusula WITH mejora el rendimiento.
B
as L í
e
SQ Gu
de Fu de

Cláusula WITH
D da Al

Mediante la cláusula WITH, puede definir un bloque de consulta antes de utilizarlo en una
consulta. La cláusula WITH (conocida formalmente como subquery_factoring_clause)
at m u

le permite reutilizar el mismo bloque de consulta en una sentencia SELECT cuando se produce
más de una vez dentro de una consulta compleja. Esto resulta particularmente útil cuando una
os e m
n

consulta tiene muchas referencias al mismo bloque de consulta y hay presentes uniones y
a

agregaciones.
Mediante la cláusula WITH, puede reutilizar la misma consulta cuando resulta caro evaluar el
O ta o

bloque de consulta y se produce más de una vez dentro de una consulta compleja. Mediante la
ra ls

cláusula WITH, Oracle Server recupera los resultados de un bloque de consulta y los almacena en
l

el tablespace temporal del usuario. Esto puede mejorar el rendimiento.


cl I

Ventajas de la Cláusula WITH


n

• Hace que la consulta resulte fácil de leer


e I

• Evalúa una cláusula sólo una vez, incluso aunque aparezca varias veces en la consulta
• En la mayoría de los casos puede mejorar el rendimiento para las consultas grandes
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-22


221
Introducción a Oracle 10g: SQL Fundamentals II

Cláusula WITH: Ejemplo

Mediante la cláusula WITH, escriba una consulta para


mostrar el nombre de departamento y los salarios
totales de los departamentos cuyo salario total sea
superior al salario medio de todos los departamentos.
B
as L í
e
SQ Gu
de Fu de

Cláusula WITH: Ejemplo


D da Al

El problema de la diapositiva requeriría los siguientes cálculos intermedios:


1. Calcule el salario total para todos los departamentos y almacene el resultado mediante
at m u

una cláusula WITH.


2. Calcule el salario medio de todos los departamentos y almacene el resultado mediante
os e m
n

una cláusula WITH.


a

3. Compare el salario total calculado en el primer paso con el salario medio calculado en el
segundo paso. Si el salario total de un departamento en particular es mayor que el
O ta o

salario medio de todos los departamentos, muestre el nombre de departamento y el


salario total de ese departamento.
ra ls
l

La solución a este problema se muestra en la página siguiente.


cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-23


222
Introducción a Oracle 10g: SQL Fundamentals II

Cláusula WITH: Ejemplo

WITH
dept_costs AS (
SELECT d.department_name, SUM(e.salary) AS dept_total
FROM employees e, departments d
WHERE e.department_id = d.department_id
GROUP BY d.department_name),
avg_cost AS (
SELECT SUM(dept_total)/COUNT(*) AS dept_avg
FROM dept_costs)
SELECT *
FROM dept_costs
WHERE dept_total >
(SELECT dept_avg
B

FROM avg_cost)
ORDER BY department_name;
as L í
e
SQ Gu
de Fu de

Cláusula WITH: Ejemplo (continuación)


D da Al

El código SQL de la diapositiva es un ejemplo de una situación en la que se puede mejorar el


rendimiento y escribir SQL de forma más sencilla mediante la cláusula WITH. La consulta
at m u

crea los nombres de consulta DEPT_COSTS y AVG_COST y los utiliza en el cuerpo de la


consulta principal. Internamente, la cláusula WITH se resuelve como una vista en línea o una
os e m
n

tabla temporal. El optimizador selecciona la resolución adecuada según el costo o las ventajas
a

de almacenar temporalmente los resultados de la cláusula WITH.


Ésta es la salida generada por el código SQL de la diapositiva:
O ta o
ra ls
l

Notas de Uso de la Cláusula WITH


cl I
n

• Se utiliza sólo con sentencias SELECT.


• Un nombre de consulta es visible para todos los bloques de consulta del elemento WITH
e I

(incluidos los bloques de subconsulta) definidos después de éste y el propio bloque de


consulta (incluidos los bloques de subconsulta).
10

• Cuando el nombre de consulta es igual que un nombre de tabla existente, el analizador


n

busca de dentro a fuera y el nombre de bloque de consulta tiene prioridad sobre el


g

nombre de tabla.
• La cláusula WITH puede contener más de una consulta. Cada consulta se separa
entonces con una coma.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-24


223
Introducción a Oracle 10g: SQL Fundamentals II

Resumen

En esta lección, ha aprendido lo siguiente:


• Una subconsulta de varias columnas devuelve más
de una columna.
• Las comparaciones de varias columnas pueden ser
entre pares y entre no pares.
• Una subconsulta de varias columnas también se
puede utilizar en la cláusula FROM de una sentencia
SELECT.
B
as L í
e
SQ Gu
de Fu de

Resumen
D da Al

Puede utilizar subconsultas de varias columnas para combinar varias condiciones WHERE en
una sola cláusula WHERE. Las comparaciones de columnas en una subconsulta de varias
at m u

columnas pueden ser entre pares y entre no pares.


os e m

Puede utilizar una subconsulta para definir una tabla en la que pueda operar una consulta que
n

la contenga.
a

Las subconsultas escalares se pueden utilizar en:


O ta o

• Parte de expresión y condición de DECODE y CASE


• Todas las cláusulas de SELECT excepto GROUP BY
ra ls

• Una cláusula SET y cláusula WHERE de una sentencia UPDATE


l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-25


224
Introducción a Oracle 10g: SQL Fundamentals II

Resumen

• Las subconsultas correlacionadas son útiles


siempre que una subconsulta deba devolver un
resultado diferente para cada fila candidata.
• El operador EXISTS es un operador booleano que
prueba la presencia de un valor.
• Las subconsultas correlacionadas se pueden
utilizar con sentencias SELECT, UPDATE y DELETE.
• Puede utilizar la cláusula WITH para utilizar el
mismo bloque de consulta en una sentencia
SELECT cuando se produce más de una vez.
B
as L í
e
SQ Gu
de Fu de

Resumen (continuación)
D da Al

Oracle Server realiza una consulta correlacionada cuando la subconsulta hace referencia a una
columna desde una tabla a la que se hace referencia en la sentencia principal. Una subconsulta
at m u

correlacionada se evalúa una vez para cada fila procesada por la sentencia principal. La
sentencia principal puede ser una sentencia SELECT, UPDATE o DELETE. Mediante la
os e m
n

cláusula WITH, puede reutilizar la misma consulta cuando resulta caro volver a evaluar el
a

bloque de consulta y se produce más de una vez dentro de una consulta compleja.
O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-26


225
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 6: Visión General

Esta práctica cubre los siguientes temas:


• Creación de subconsultas de varias columnas
• Escritura de subconsultas correlacionadas
• Uso del operador EXISTS
• Uso de subconsultas escalares
• Uso de la cláusula WITH
B
as L í
e
SQ Gu
de Fu de

Práctica 6: Visión General


D da Al

En esta práctica, escribirá subconsultas de varias columnas, así como subconsultas


correlacionadas y escalares. También solucionará problemas escribiendo la cláusula WITH.
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-27


226
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 6
1. Escriba una consulta para mostrar el apellido, el número de departamento y el salario de
cualquier empleado cuyo número de departamento y salario se correspondan con el
número de departamento y el salario de cualquier empleado que gane una comisión.


2. Muestre el apellido, el nombre de departamento y el salario de cualquier empleado cuyo
salario y comisión se correspondan con el salario y la comisión de cualquier empleado
con el identificador de ubicación 1700.

B
as L í
e
SQ Gu
de Fu de
D da Al
at m u

3. Cree una consulta para mostrar el apellido, la fecha de contratación y el salario de todos
os e m

los empleados que tengan el mismo salario y la misma comisión que Kochhar.
n
a

Nota: No muestre a Kochhar en el juego de resultados.


O ta o
ra ls
l

4. Cree una consulta para mostrar los empleados que ganen un salario que sea más alto que
el salario de todos los supervisores de ventas (JOB_ID = 'SA_MAN'). Ordene los
cl I
n

resultados por salario en orden descendente.


e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-28


227
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 6 (continuación)
5. Muestre los detalles del identificador de empleado, el apellido y el identificador de
departamento de los empleados que vivan en ciudades cuyo nombre empiece por T.

6. Escriba una consulta para buscar todos los empleados que ganen más que el salario
medio de su departamento.
Muestre el apellido, el salario, el identificador de departamento y el salario medio del
departamento. Ordene por salario medio. Utilice alias para las columnas recuperadas por
la consulta como se muestra en el ejemplo de salida.
B
as L í
e
SQ Gu
de Fu de


D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-29


228
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 6 (continuación)
7. Busque todos los empleados que no sean supervisores.
a. Hágalo primero mediante el operador NOT EXISTS.


B

b. ¿Esto se puede conseguir mediante el operador NOT IN? ¿Cómo o por qué no?
as L í

8. Escriba una consulta para mostrar los apellidos de los empleados que ganen menos que
e

el salario medio en sus departamentos.


SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o


ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-30


229
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 6 (continuación)
9. Escriba una consulta para mostrar los apellidos de los empleados que tienen uno o más
colegas en su departamento con fechas de contratación posteriores pero salarios
más altos.


B

10. Escriba una consulta para mostrar los identificadores de empleado, los apellidos, y los
nombres de departamento de todos los empleados.
as L í

Nota: Utilice una subconsulta escalar para recuperar el nombre de departamento en la


sentencia SELECT.
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l


cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-31


230
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 6 (continuación)
11. Escriba una consulta para mostrar los nombres de departamento de los departamentos
cuyo costo de salario total supere un octavo (1/8) del costo de salario total de toda la
compañía. Utilice la cláusula WITH para escribir esta consulta. Asigne a la consulta el
nombre SUMMARY.
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-32


231
Introducción a Oracle 10g: SQL Fundamentals II

Recuperación Jerárquica
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

232
Introducción a Oracle 10g: SQL Fundamentals II

Objetivos

Al finalizar esta lección, debería estar capacitado para:


• Interpretar el concepto de consulta jerárquica
• Crear un informe en estructura de árbol
• Formatear datos jerárquicos
• Excluir ramas de la estructura de árbol
B
as L í
e
SQ Gu
de Fu de

Objetivos
D da Al

En esta lección, aprenderá a utilizar consultas jerárquicas para crear informes en estructura
de árbol.
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 7-2


233
Introducción a Oracle 10g: SQL Fundamentals II

Ejemplo de Datos de la Tabla EMPLOYEES


B
as L í
e
SQ Gu
de Fu de

Ejemplo de Datos de la Tabla EMPLOYEES


D da Al

Mediante consultas jerárquicas, puede recuperar datos basándose en una relación jerárquica
natural entre filas de una tabla. Una base de datos relacional no almacena registros de forma
at m u

jerárquica. Sin embargo, si existe una relación jerárquica entre las filas de una sola tabla, un
proceso denominado desplazamiento por el árbol permite que se construya la jerarquía. Una
os e m
n

consulta jerárquica es un método de informar de las ramas de un árbol en un orden específico.


a

Imagine un árbol genealógico con los miembros mayores de la familia situados cerca de la
base o del tronco del árbol y los más jóvenes representados como ramas del árbol. Las ramas
O ta o

pueden tener más ramas, y así sucesivamente.


ra ls

Una consulta jerárquica es posible cuando existe una relación entre filas en una tabla. Por
l

ejemplo, en la diapositiva, se ve que los empleados con el identificador de puesto AD_VP,


cl I

ST_MAN, SA_MAN y MK_MAN están bajo las órdenes directas del presidente de la compañía.
n

Lo sabemos porque la columna MANAGER_ID de estos registros contiene el identificador de


e I

empleado 100, que pertenece al presidente (AD_PRES).


Nota: Los árboles jerárquicos se utilizan en diversos campos como, por ejemplo, la
10

genealogía humana (árboles genealógicos), la cría de ganado (reproducción), la gerencia


n

empresarial (jerarquías de los supervisores), la manufactura (ensamblaje de productos), la


g

investigación evolutiva (desarrollo de especies) y la investigación científica.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 7-3


234
Introducción a Oracle 10g: SQL Fundamentals II

Estructura de Árbol Natural

EMPLOYEE_ID = 100 (Principal)


King
MANAGER_ID = 100 (Secundario)

Kochhar De Haan Mourgos Zlotkey Hartstein

Whalen Higgins Hunold Rajs Davies Matos Vargas

Fay
B

Gietz Ernst Lorentz Abel Taylor Grant


as L í
e
SQ Gu
de Fu de

Estructura de Árbol Natural


D da Al

La tabla EMPLOYEES tiene una estructura de árbol que representa la línea de supervisores.
Para crear la jerarquía, se puede observar la relación entre valores equivalentes de las
at m u

columnas EMPLOYEE_ID y MANAGER_ID. Para utilizar esta relación, se puede unir la


tabla a sí misma. La columna MANAGER_ID contiene el número de empleado del supervisor
os e m
n

del empleado.
a

La relación principal-secundario de una estructura de árbol le permite controlar:


• La dirección de desplazamiento por la jerarquía
O ta o

• El punto de partida dentro de la jerarquía


ra ls

Nota: La diapositiva muestra una estructura de árbol invertido de la jerarquía de supervisores


l

de los empleados de la tabla EMPLOYEES.


cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 7-4


235
Introducción a Oracle 10g: SQL Fundamentals II

Consultas Jerárquicas

SELECT [LEVEL], column, expr...


FROM table
[WHERE condition(s)]
[START WITH condition(s)]
[CONNECT BY PRIOR condition(s)] ;

Condición WHERE:
expr comparison_operator expr
B
as L í
e
SQ Gu
de Fu de

Palabras Clave y Cláusulas


D da Al

Las consultas jerárquicas se pueden identificar por la presencia de las cláusulas CONNECT BY
y START WITH.
at m u

En la sintaxis:
SELECT Es la cláusula SELECT estándar
os e m
n

LEVEL Para cada fila devuelta por una consulta jerárquica, la


a

pseudocolumna LEVEL devuelve 1 para una fila de raíz, 2 para un


secundario de la raíz y así sucesivamente.
O ta o

FROM table Especifica la tabla, la vista o la instantánea que contiene las columnas.
Puede seleccionar de una sola tabla.
ra ls

WHERE Restringe las filas devueltas por la consulta sin que afecte a otras filas de
l

la jerarquía.
cl I

condition Es una comparación con expresiones


n

START WITH Especifica las filas de raíz de la jerarquía (dónde comenzar). Esta
e I

cláusula es necesaria para una consulta jerárquica verdadera.


CONNECT BY Especifica las columnas en las que existe la relación entre filas
10

PRIOR principales y secundarias. Esta cláusula es necesaria para una


consulta jerárquica.
n

La sentencia SELECT no puede contener una unión ni una consulta de una vista que contenga
una unión.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 7-5


236
Introducción a Oracle 10g: SQL Fundamentals II

Desplazamiento por el Árbol

Punto de Partida
• Especifica la condición que se debe cumplir
• Acepta cualquier condición válida
START WITH column1 = value

Mediante la tabla EMPLOYEES, parta del empleado cuyo


apellido es Kochhar.
...START WITH last_name = 'Kochhar'
B
as L í
e
SQ Gu
de Fu de

Desplazamiento por el Árbol


D da Al

La cláusula START WITH determina la fila o las filas que se deben utilizar como raíz
del árbol. La cláusula START WITH se puede utilizar en conjunción con cualquier
at m u

condición válida.
Ejemplos
os e m
n
a

Mediante la tabla EMPLOYEES, parta de King, el presidente de la compañía.


... START WITH manager_id IS NULL
O ta o

Mediante la tabla EMPLOYEES, parta del empleado Kochhar. Una condición START WITH
puede contener una subconsulta.
ra ls
l

... START WITH employee_id = (SELECT employee_id


FROM employees
cl I

WHERE last_name = 'Kochhar')


n

Si se omite la cláusula START WITH, el desplazamiento por el árbol parte de todas las filas
e I

de la tabla como filas de raíz. Si se utiliza una cláusula WHERE, el desplazamiento parte de
todas las filas que satisfacen la condición WHERE. Esto ya no refleja una jerarquía verdadera.
10

Nota: Las cláusulas CONNECT BY PRIOR y START WITH no son del estándar ANSI SQL.
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 7-6


237
Introducción a Oracle 10g: SQL Fundamentals II

Desplazamiento por el Árbol

CONNECT BY PRIOR column1 = column2

Desplácese de arriba abajo mediante la tabla EMPLOYEES.


... CONNECT BY PRIOR employee_id = manager_id

Dirección

De arriba abajo Columna1 = Clave principal


Columna2 = Clave secundaria
B

De abajo arriba Columna1 = Clave secundaria


as L í

Columna2 = Clave principal


e
SQ Gu
de Fu de

Desplazamiento por el Árbol (continuación)


D da Al

La dirección de la consulta, ya sea de principal a secundario o de secundario a principal, está


determinada por la colocación de la columna CONNECT BY PRIOR. El operador PRIOR se
at m u

refiere a la fila principal. Para encontrar las filas secundarias de una fila principal, Oracle
Server evalúa la expresión PRIOR para la fila principal y las demás expresiones para cada fila
os e m

de la tabla. Las filas para las que la condición es verdadera son las filas secundarias de la
n
a

principal. Oracle Server selecciona siempre las filas secundarias evaluando la condición
CONNECT BY con respecto a una fila principal actual.
O ta o

Ejemplos
Desplácese de arriba abajo mediante la tabla EMPLOYEES. Defina una relación jerárquica en
ra ls

la que el valor EMPLOYEE_ID de la fila principal sea igual al valor MANAGER_ID de la


l

fila secundaria.
cl I
n

... CONNECT BY PRIOR employee_id = manager_id


Desplácese de abajo arriba mediante la tabla EMPLOYEES.
e I

... CONNECT BY PRIOR manager_id = employee_id


10

No es necesario codificar inmediatamente el operador PRIOR después de CONNECT BY.


Así, la siguiente cláusula CONNECT BY PRIOR genera el mismo resultado que la del
n

ejemplo anterior.
g

... CONNECT BY employee_id = PRIOR manager_id


Nota: La cláusula CONNECT BY no puede contener una subconsulta.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 7-7


238
Introducción a Oracle 10g: SQL Fundamentals II

Desplazamiento por el Árbol: De Abajo Arriba

SELECT employee_id, last_name, job_id, manager_id


FROM employees
START WITH employee_id = 101
CONNECT BY PRIOR manager_id = employee_id ;
B
as L í
e
SQ Gu
de Fu de

Desplazamiento por el Árbol: De Abajo Arriba


D da Al

En el ejemplo de la diapositiva se muestra una lista de supervisores que comienza por el


empleado cuyo identificador es 101.
at m u

Ejemplo
os e m

En el ejemplo siguiente, los valores de EMPLOYEE_ID se evalúan para la fila principal y


n
a

MANAGER_ID, y los valores de SALARY son evaluados por las filas secundarias. El operador
PRIOR se aplica sólo al valor de EMPLOYEE_ID.
O ta o

... CONNECT BY PRIOR employee_id = manager_id


AND salary > 15000;
ra ls

Para calificarse como fila secundaria, una fila debe tener un valor de MANAGER_ID igual
l

al valor EMPLOYEE_ID de la fila principal y debe tener un valor SALARY superior a


cl I

15.000 dólares.
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 7-8


239
Introducción a Oracle 10g: SQL Fundamentals II

Desplazamiento por el Árbol: De Arriba Abajo

SELECT last_name||' reports to '||


PRIOR last_name "Walk Top Down"
FROM employees
START WITH last_name = 'King'
CONNECT BY PRIOR employee_id = manager_id ;
B


as L í
e
SQ Gu
de Fu de

Desplazamiento por el Árbol: De Arriba Abajo


D da Al

Desplazándose de arriba abajo, muestre los nombres de los empleados y su supervisor. Utilice
el empleado King como punto de partida. Imprima sólo una columna.
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 7-9


240
Introducción a Oracle 10g: SQL Fundamentals II

Clasificación de Filas con la


Pseudocolumna LEVEL

Nivel 1
raíz/principal
King

Kochhar De Haan Mourgos Zlotkey Hartstein

Nivel 3
Whalen Higgins Hunold Rajs Davies Matos Vargas principal/secundario/hoja

Fay
B

Gietz Ernst Lorentz Abel Taylor Grant


as L í

Nivel 4
hoja
e
SQ Gu
de Fu de

Clasificación de Filas con la Pseudocolumna LEVEL


D da Al

Puede mostrar explícitamente la clasificación o el nivel de una fila en la jerarquía mediante la


pseudocolumna LEVEL. Esto hará que el informe resulte más legible. Las bifurcaciones en las
at m u

que salen una o varias ramas de una rama mayor se denominan nodos y el extremo de una
rama se denomina hoja, o nodo hoja. El diagrama de la diapositiva muestra los nodos del
os e m
n

árbol invertido con sus valores LEVEL. Por ejemplo, el empleado Higgins es principal y
a

secundario, mientras que el empleado Davies es secundario y hoja.


Pseudocolumna LEVEL
O ta o

Valor Nivel
1 Nodo raíz
ra ls
l

2 Secundario de un nodo raíz


3 Secundario de un secundario y así sucesivamente.
cl I
n

En la diapositiva, King es la raíz o el principal (LEVEL = 1). Kochhar, De Haan, Mourgos,


e I

Zlotkey, Hartstein, Higgins y Hunold son secundarios y también principales (LEVEL = 2).
Whalen, Rajs, Davies, Matos, Vargas, Gietz, Ernst, Lorentz, Abel, Taylor, Grant y Fay son
10

secundarios y hojas. (LEVEL = 3 y LEVEL = 4)


Nota: Un nodo raíz es el nodo más alto dentro de un árbol invertido. Un nodo secundario es
n

cualquier nodo no raíz. Un nodo principal es cualquier nodo que tenga secundarios. Un nodo
hoja es cualquier nodo sin secundarios. El número de niveles devuelto por una consulta
jerárquica se puede ver limitado por la memoria de usuario disponible.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 7-10


241
Introducción a Oracle 10g: SQL Fundamentals II

Formato de Informes Jerárquicos


mediante LEVEL y LPAD

Cree un informe que muestre los niveles de


supervisores de la compañía, partiendo del nivel más
alto y sangrando cada uno de los siguientes niveles.

COLUMN org_chart FORMAT A12


SELECT LPAD(last_name, LENGTH(last_name)+(LEVEL*2)-2,'_')
AS org_chart
FROM employees
START WITH last_name='King'
CONNECT BY PRIOR employee_id=manager_id
B
as L í
e
SQ Gu
de Fu de

Formato de Informes Jerárquicos mediante LEVEL


D da Al

A los nodos de un árbol se les asignan números de niveles desde la raíz. Utilice la función
LPAD en conjunción con la pseudocolumna LEVEL para mostrar un informe jerárquico como
at m u

árbol con sangrado.


En el ejemplo de la diapositiva:
os e m
n

• LPAD(char1,n [,char2]) devuelve char1, rellenado a la izquierda hasta la


a

longitud n con la secuencia de caracteres en char2. El argumento n es la longitud total


del valor de retorno como se muestra en la pantalla de su terminal.
O ta o

• LPAD(last_name, LENGTH(last_name)+(LEVEL*2)-2,'_')define el
formato de visualización.
ra ls
l

• char1 es LAST_NAME, n la longitud total del valor de retorno total es la longitud de


LAST_NAME +(LEVEL*2)-2 y char2 es '_'.
cl I
n

Dicho de otro modo, esto indica a SQL que tome LAST_NAME y lo rellene a la izquierda con
e I

el carácter '_' hasta que la longitud de la cadena resultante sea igual a los valores
determinados por LENGTH(last_name)+(LEVEL*2)-2.
10

Para King, LEVEL = 1. Por tanto, (2 * 1) – 2 = 2 – 2 = 0. Así pues, King no se rellena con
ningún carácter '_' y se muestra en la columna 1.
n

Para Kochhar, LEVEL = 2. Por tanto, (2 * 2) – 2 = 4 – 2 = 2 . Así pues, Kochhar se rellena


g

con 2 caracteres '_' y se muestra con sangrado.


El resto de los registros de la tabla EMPLOYEES se muestra de forma parecida.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 7-11


242
Introducción a Oracle 10g: SQL Fundamentals II

Formato de Informes Jerárquicos mediante LEVEL (continuación)


B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 7-12


243
Introducción a Oracle 10g: SQL Fundamentals II

Eliminación de Ramas

Utilice la cláusula WHERE Utilice la cláusula CONNECT BY


para eliminar un nodo. para eliminar una rama.

WHERE last_name != 'Higgins' CONNECT BY PRIOR


employee_id = manager_id
AND last_name != 'Higgins'
Kochhar Kochhar

Whalen Higgins Whalen Higgins


B
as L í

Gietz Gietz
e
SQ Gu
de Fu de

Eliminación de Ramas
D da Al

Puede utilizar las cláusulas WHERE y CONNECT BY para eliminar el árbol; es decir, para
controlar qué nodos o qué filas se muestran. El predicado que utilice funciona como
at m u

condición booleana.
Ejemplos
os e m
n

Partiendo de la raíz, desplácese de arriba abajo y elimine el empleado Higgins del resultado,
a

pero procese las filas secundarias.


SELECT department_id, employee_id,last_name, job_id, salary
O ta o

FROM employees
WHERE last_name != 'Higgins'
ra ls

START WITH manager_id IS NULL


l

CONNECT BY PRIOR employee_id = manager_id;


cl I

Partiendo de la raíz, desplácese de arriba abajo y elimine el empleado Higgins del resultado y
n

todas las filas secundarias.


e I

SELECT department_id, employee_id,last_name, job_id, salary


FROM employees
10

START WITH manager_id IS NULL


CONNECT BY PRIOR employee_id = manager_id
n

AND last_name != 'Higgins';


g

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 7-13


244
Introducción a Oracle 10g: SQL Fundamentals II

Resumen

En esta lección, ha aprendido lo siguiente:


• Puede utilizar consultas jerárquicas para ver una
relación jerárquica entre filas de una tabla.
• Puede especificar la dirección y el punto de
partida de la consulta.
• Puede eliminar nodos o ramas mediante la
eliminación.
B
as L í
e
SQ Gu
de Fu de

Resumen
D da Al

Puede utilizar consultas jerárquicas para recuperar datos basándose en una relación jerárquica
natural entre filas de una tabla. La pseudocolumna LEVEL cuenta lo lejos que se ha
at m u

desplazado hacia abajo en un árbol jerárquico. Puede especificar la dirección de la consulta


mediante la cláusula CONNECT BY PRIOR. Puede especificar el punto de partida mediante
os e m
n

la cláusula START WITH. Puede utilizar las cláusulas WHERE y CONNECT BY para eliminar
a

las ramas del árbol.


O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 7-14


245
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 7: Visión General

Esta práctica cubre los siguientes temas:


• Distinción entre consultas jerárquicas y consultas
no jerárquicas
• Desplazamiento por un árbol
• Generación de un informe con sangrado mediante
la pseudocolumna LEVEL
• Eliminación de la estructura del árbol
• Ordenación de la salida
B
as L í
e
SQ Gu
de Fu de

Práctica 7: Visión General


D da Al

En esta práctica, obtendrá experiencia práctica en la generación de informes jerárquicos.


at m u

Nota: La pregunta 1 se realiza sobre papel.


os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 7-15


246
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 7
1. Observe los siguientes ejemplos de salida. ¿Son resultado de una consulta jerárquica?
Explique por qué o por qué no.
Imagen 1:


B
as L í
e
SQ Gu
de Fu de

Imagen 2:
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 7-16


247
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 7 (continuación)
Imagen 3:

2. Genere un informe que muestre un organigrama del departamento de Mourgos. Imprima


los apellidos, los salarios y los identificadores de departamento.
B
as L í
e
SQ Gu

3. Cree un informe que muestre la jerarquía de los supervisores del empleado Lorentz.
de Fu de

Muestre primero el supervisor inmediato.


D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 7-17


248
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 7 (continuación)
4. Cree un informe con sangrado que muestre la jerarquía de supervisores partiendo del
empleado cuyo LAST_NAME es Kochhar. Imprima el apellido del empleado, el
identificador de supervisor y el identificador de departamento. Asigne nombres de alias
a las columnas como se muestra en la salida de ejemplo.
B
as L í

Si le queda tiempo, realice el siguiente ejercicio:


e

5. Genere un organigrama de la compañía que muestre la jerarquía de los supervisores.


SQ Gu

Parta de la persona de nivel más alto, excluya a todas las personas con el identificador
de Fu de

de puesto IT_PROG, a De Haan y a los empleados que estén a las órdenes de De Haan.
D da Al
at m u
os e m
n
a


O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 7-18


249
Introducción a Oracle 10g: SQL Fundamentals II

Soporte de Expresiones Normales


B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

250
Introducción a Oracle 10g: SQL Fundamentals II

Objetivos

Al final de esta lección, debería estar capacitado para


utilizar el soporte de expresiones normales en SQL
para buscar, hacer corresponder y sustituir cadenas
siempre en términos de expresiones normales.
B
as L í
e
SQ Gu
de Fu de

Copyright © 2004, Oracle. Todos


. los derechos reservados.

Objetivos
D da Al

En esta lección, aprenderá a utilizar la función de soporte de expresiones normales que se ha


introducido en la base de datos Oracle 10g.
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 8-2


251
Introducción a Oracle 10g: SQL Fundamentals II

Visión General de Expresiones Normales


Soporte de
expresiones normales
multilingüe para tipos
de cadena SQL y
PL/SQL

ABC

Método para describir Varias funciones


patrones sencillos y nuevas para soportar
B

complejos de búsqueda expresiones


as L í

y manipulación normales
e
SQ Gu
de Fu de

Copyright © 2004, Oracle. Todos


. los derechos reservados.

Visión General de Expresiones Normales


D da Al

La base de datos Oracle 10g introduce el soporte de expresiones normales. La


implementación cumple con el estándar POSIX (Sistema Operativo Portátil para UNIX),
at m u

controlado por el IEEE (Instituto de Ingenieros en Electricidad y Electrónica), para la


semántica y la sintaxis de correspondencia de datos ASCII. Las capacidades multilingües de
os e m
n

Oracle amplían las capacidades de correspondencia de los operadores más allá del estándar
a

POSIX. Las expresiones normales son un método para describir patrones sencillos y
complejos de búsqueda y manipulación.
O ta o

La manipulación y la búsqueda de cadenas suponen un amplio porcentaje de la lógica de una


ra ls

aplicación basada en la Web. El uso va desde la simple búsqueda de las palabras “San
l

Francisco” en un texto especificado, pasando por la compleja extracción de todas las


cl I

direcciones URL del texto, hasta la búsqueda más compleja de todas las palabras cuyo
n

segundo carácter sea una vocal.


e I

Si se une al SQL nativo, el uso de expresiones normales permite operaciones muy potentes de
búsqueda y de manipulación de cualquier dato almacenado en una base de datos Oracle.
10

Puede utilizar esta función para solucionar fácilmente problemas que de otro modo resultarían
muy complejos de programar.
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 8-3


252
Introducción a Oracle 10g: SQL Fundamentals II

Metacaracteres
Símbolo Descripción
* Se corresponde con cero o más incidencias
| Operador de modificación para especificar correspondencias alternativas
^/$ Se corresponde con el inicio de línea/fin de línea
[] Expresión entre corchetes para una lista de correspondencia que se corresponde
con cualquiera de las expresiones representadas en la lista
{m} Se corresponde exactamente m veces
{m,n} Se corresponde al menos m veces pero no más de n veces
[: :] Especifica una clase de carácter y se corresponde con cualquier carácter de
esa clase
\ Puede tener 4 significados diferentes: 1. Se representa a sí mismo. 2. Presenta el
siguiente carácter. 3. Introduce un operador. 4. No hace nada.
+ Se corresponde con una o más incidencias
? Se corresponde con cero o una incidencia
. Se corresponde con cualquier carácter del juego de caracteres soportado,
excepto NULL
() Expresión de agrupamiento, que se trata como subexpresión única
B

[==] Especifica clases de equivalencia


as L í

\n Referencia a expresión anterior


[..] Especifica un elemento de intercalación como, por ejemplo, un elemento de
varios caracteres
e
SQ Gu
de Fu de

Copyright © 2004, Oracle. Todos


. los derechos reservados.

Metacaracteres
D da Al

Los metacaracteres son caracteres especiales que tienen un significado especial como, por
ejemplo, un comodín, un carácter de repetición, un carácter de no correspondencia o un rango
at m u

de caracteres. Puede utilizar varios símbolos de metacaracteres predefinidos en la


correspondencia de patrones.
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 8-4


253
Introducción a Oracle 10g: SQL Fundamentals II

Uso de Metacaracteres
Problem: Find 'abc' within a string:
Solution: 'abc' 1
Matches: abc
Does not match: 'def'
Problem: To find 'a' followed by any character, followed
by 'c'
Meta Character: any character is defined by '.'
Solution: 'a.c'
Matches: abc
2
Matches: adc
Matches: alc
Matches: a&c
Does not match: abb
Problem: To find one or more occurrences of 'a'
Meta Character: Use'+' sign to match one or more of the
previous characters
3
B

Solution: 'a+'
Matches: a
as L í

Matches: aa
Does not match: bbb
e
SQ Gu
de Fu de

Copyright © 2004, Oracle. Todos


. los derechos reservados.

Uso de Metacaracteres
D da Al

1. En el primer ejemplo, se realiza una correspondencia sencilla.


2. En el segundo ejemplo, el carácter any se define como un '.'. En este ejemplo se busca
at m u

el carácter “a” seguido de cualquier carácter, seguido del carácter “c”.


3. El tercer ejemplo busca una o más incidencias de la letra “a.” El carácter “+” se utiliza
os e m
n

aquí para indicar una correspondencia de uno o más de los caracteres anteriores.
a

Puede buscar también listas de caracteres sin correspondencia. Una lista de caracteres sin
correspondencia le permite definir un juego de caracteres para los que una correspondencia no
O ta o

es válida. Por ejemplo, para buscar cualquier cosa menos los caracteres “a,” “b” o “c”, puede
definir “^” para indicar una no correspondencia.
ra ls
l

Expression: [^abc]
cl I

Matches: abcdef
n

Matches: ghi
e I

Does not match: abc


Para hacer corresponder cualquier letra que no esté entre “a” e “i”, puede utilizar:
10

Expression: [^a-i]
n

Matches: hijk
g

Matches: lmn
Does not match: abcdefghi

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 8-5


254
Introducción a Oracle 10g: SQL Fundamentals II

Uso de Metacaracteres (continuación)

Sintaxis de Nombre de Operador Descripción


Metacarácter

. Cualquier carácter – Punto Se corresponde con cualquier carácter.

+ Una o más – Cuantificador Se corresponde con una o más


de signo más incidencias de la subexpresión anterior.

? Cero o una – Cuantificador Se corresponde con cero o una


de signo de interrogación incidencia de la subexpresión anterior.

* Cero o más – Cuantificador Se corresponde con cero o más


de asterisco incidencias de la subexpresión anterior.

{m} Intervalo – Recuento exacto Se corresponde con


{m,} • m incidencias exactamente
{m,n} • al menos m incidencias
• al menos m, pero no más de n
incidencias de la subexpresión
anterior
B

[…] Lista de caracteres de Se corresponde con cualquier carácter


as L í

correspondencia de la lista ...

[^…] Lista de caracteres sin Se corresponde con cualquier carácter


e

correspondencia que no esté en la lista ...


SQ Gu
de Fu de

| O 'a|b' se corresponde con los caracteres


'a' o 'b'.
(…) Subexpresión o Trata la expresión ... como una unidad.
D da Al

agrupamiento
at m u

\n Referencia a expresión Se corresponde con la enésima


anterior subexpresión anterior, donde n es un
entero del 1 al 9
os e m
n
a

\ Carácter de escape Trata el metacarácter siguiente de la


expresión como un literal.
O ta o

^ Inicio de fijación de línea Se corresponde con la expresión


siguiente cuando se produce al principio
ra ls

de una línea.
l

$ Fin de fijación de línea Se corresponde con la expresión


cl I

anterior sólo cuando se produce al final


n

de una línea.
e I

[:class:] Clase de carácter POSIX Se corresponde con cualquier carácter


que pertenezca a la clase de carácter
10

especificada.
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 8-6


255
Introducción a Oracle 10g: SQL Fundamentals II

Funciones de Expresiones Normales


Nombre de Función Descripción
REGEXP_LIKE Parecido al operador LIKE, pero realiza
una correspondencia de expresiones
normales en lugar de una
correspondencia de patrones sencillos
REGEXP_REPLACE Busca un patrón de expresión normal y
lo sustituye por una cadena de
sustitución
REGEXP_INSTR Busca en una cadena especificada un
patrón de expresión normal y devuelve
la posición en la que se encuentra la
correspondencia
REGEXP_SUBSTR Busca un patrón de expresión normal
B

dentro de una cadena especificada y


devuelve la subcadena con la
as L í

correspondencia
e
SQ Gu
de Fu de

Copyright © 2004, Oracle. Todos


. los derechos reservados.

Funciones de Expresiones Normales


D da Al

La base de datos Oracle 10g proporciona un juego de funciones SQL que se pueden utilizar
para buscar y manipular cadenas mediante expresiones normales. Puede utilizar estas
at m u

funciones en cualquier tipo de datos que contenga datos de caracteres como, por ejemplo,
CHAR, NCHAR, CLOB, NCLOB, NVARCHAR2 y VARCHAR2. Una expresión normal debe ir
os e m
n

entre comillas simples. Esto asegura que toda la expresión sea interpretada por la función
a

SQL y puede mejorar la legibilidad del código.


REGEXP_LIKE: Esta función busca un patrón en una columna de caracteres. Utilice esta
O ta o

función en la cláusula WHERE de una consulta para devolver las filas que se correspondan con
ra ls

la expresión normal que se especifique.


l

REGEXP_REPLACE: Esta función busca un patrón en una columna de caracteres y sustituye


cl I

cada incidencia de ese patrón por el patrón que se especifique.


n

REGEXP_INSTR: Esta función busca en una cadena una incidencia especificada de un


e I

patrón de expresión normal. Hay que especificar qué incidencia se desea buscar y la posición
inicial desde la que buscar. Esta función devuelve un entero que indica la posición en la
10

cadena en la que ha encontrado la correspondencia.


n

REGEXP_SUBSTR: Esta función devuelve la subcadena real que se corresponde con el


g

patrón de expresión normal que se especifique.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 8-7


256
Introducción a Oracle 10g: SQL Fundamentals II

Sintaxis de la Función REGEXP

REGEXP_LIKE (srcstr, pattern [,match_option])

REGEXP_INSTR (srcstr, pattern [, position [, occurrence


[, return_option [, match_option]]]])

REGEXP_SUBSTR (srcstr, pattern [, position


[, occurrence [, match_option]]])

REGEXP_REPLACE(srcstr, pattern [,replacestr [, position


[, occurrence [, match_option]]]])
B
as L í
e
SQ Gu
de Fu de

Sintaxis de la Función REGEXP


D da Al

La siguiente tabla contiene descripciones de los términos mostrados en la sintaxis de la


diapositiva.
at m u

srcstr Valor de búsqueda


os e m
n

pattern Expresión normal


a

occurrence Incidencia que se buscará


O ta o

position Punto de partida de la búsqueda


Posición inicial o final de la incidencia
ra ls

return_option
l

replacestr Cadena de caracteres que sustituye al patrón


cl I
n

Opción para cambiar la correspondencia por defecto; puede


incluir uno o más de los siguientes valores:
e I

“c” —utiliza una correspondencia sensible a


mayúsculas/minúsculas (por defecto)
10

match_option “I” —utiliza una correspondencia no sensible a


mayúsculas/minúsculas
n

“n” —permite el operador de correspondencia con cualquier


g

carácter
“m” —trata la cadena de origen como varias líneas

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 8-8


257
Introducción a Oracle 10g: SQL Fundamentals II

Realización de Búsquedas Básicas

SELECT first_name, last_name


FROM employees
WHERE REGEXP_LIKE (first_name, '^Ste(v|ph)en$');
B
as L í
e
SQ Gu
de Fu de

Ejemplo de REGEXP_LIKE
D da Al

En esta consulta, en la tabla EMPLOYEES, se muestran todos los empleados cuyos nombres
contienen Steven o Stephen. En la expresión utilizada,
at m u

'^Ste(v|ph)en$' :
• ^ indica el inicio de la sentencia
os e m
n

• $ indica el fin de la sentencia


a

• | indica o bien/o
O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 8-9


258
Introducción a Oracle 10g: SQL Fundamentals II

Comprobación de la Presencia de un Patrón

SELECT street_address,
REGEXP_INSTR(street_address,'[^[:alpha:]]')
FROM locations
WHERE
REGEXP_INSTR(street_address,'[^[:alpha:]]')> 1;
B
as L í
e
SQ Gu
de Fu de

Comprobación de la Presencia de un Patrón


D da Al

En este ejemplo, la función REGEXP_INSTR se utiliza para buscar la calle con el fin de
encontrar la ubicación del primer carácter no alfabético, independientemente de si está en
at m u

mayúsculas o minúsculas. La búsqueda se realiza sólo en las calles que no empiecen por un
número. Observe que [:<class>:] implica una clase de carácter y se corresponde con
os e m
n

cualquier carácter de esa clase; [:alpha:] se corresponde con cualquier carácter alfabético.
a

Se muestran los resultados.


En la expresión utilizada en la consulta '[^[:alpha:]]':
O ta o

• [ inicia la expresión
ra ls

• ^ indica NO
l

• [:alpha:] indica la clase de carácter alfabético


cl I

• ] finaliza la expresión
n

Nota: El operador de clase de carácter POSIX le permite buscar una expresión dentro de una
e I

lista de caracteres que sea miembro de una clase de carácter POSIX específica. Puede utilizar
este operador para buscar un formato específico como, por ejemplo, caracteres en mayúscula, o
10

bien puede buscar caracteres especiales como, por ejemplo, dígitos o caracteres de puntuación.
Se soporta todo el juego de clases de carácter POSIX. Utilice la sintaxis [:class:] donde class es
n

el nombre de la clase de carácter POSIX que se debe buscar. Las siguientes expresiones
normales buscan uno o más caracteres consecutivos en mayúsculas: [[:upper:]]+.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 8-10


259
Introducción a Oracle 10g: SQL Fundamentals II

Ejemplo de Extracción de Subcadenas

SELECT REGEXP_SUBSTR(street_address , ' [^ ]+ ')


"Road" FROM locations;


B
as L í
e
SQ Gu
de Fu de

Ejemplo de Extracción de una Subcadena


D da Al

En este ejemplo, los nombres de calle se extraen de la tabla LOCATIONS. Para ello, se
devuelve el contenido de la columna STREET_ADDRESS que está antes del primer espacio
at m u

mediante la función REGEXP_SUBSTR. En la expresión utilizada en la consulta '[^ ]+ ':


• [ inicia la expresión
os e m
n

• ^ indica NO
a

• indica espacio
• ] finaliza la expresión
O ta o

• + indica 1 o más
• indica espacio
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 8-11


260
Introducción a Oracle 10g: SQL Fundamentals II

Sustitución de Patrones

SELECT REGEXP_REPLACE( country_name, '(.)',


'\1 ') "REGEXP_REPLACE"
FROM countries;


B
as L í
e
SQ Gu
de Fu de

Sustitución de Patrones
D da Al

En este ejemplo se examina COUNTRY_NAME. La base de datos Oracle reformatea este


patrón con un espacio después de cada carácter no nulo de la cadena. Se muestran los
at m u

resultados.
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 8-12


261
Introducción a Oracle 10g: SQL Fundamentals II

Expresiones Normales y
Restricciones de Control

ALTER TABLE emp8


ADD CONSTRAINT email_addr 1
CHECK(REGEXP_LIKE(email,'@'))NOVALIDATE ;

INSERT INTO emp8 VALUES


(500,'Christian','Patel', 2
'ChrisP2creme.com', 1234567890,
'12-Jan-2004', 'HR_REP', 2000, null, 102, 40) ;
B
as L í
e
SQ Gu
de Fu de

Expresiones Normales y Restricciones de Control


D da Al

Las expresiones normales también se pueden utilizar en restricciones de control. En este


ejemplo, se agrega una restricción de control en la columna EMAIL de la tabla EMPLOYEES.
at m u

Esto asegurará que sólo se acepten las cadenas que contienen un símbolo “@”. Se prueba la
restricción. La restricción de control se viola porque la dirección de correo electrónico no
os e m
n

contiene el símbolo necesario. La cláusula NOVALIDATE asegura que no se comprueben los


a

datos existentes.
O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 8-13


262
Introducción a Oracle 10g: SQL Fundamentals II

Resumen

En esta lección, ha aprendido a utilizar el soporte de


expresiones normales en SQL y PL/SQL para buscar,
hacer corresponder y sustituir cadenas siempre en
términos de expresiones normales.
B
as L í
e
SQ Gu
de Fu de

Resumen
D da Al

En esta lección, ha aprendido a utilizar las funciones de soporte de expresiones normales que
se han introducido en la base de datos Oracle 10g.
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 8-14


263
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 8: Visión General

Esta práctica cubre el uso de expresiones normales.


B
as L í
e
SQ Gu
de Fu de

Práctica 8: Visión General


D da Al

Esta práctica cubre la búsqueda y la sustitución de datos mediante expresiones normales.


at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 8-15


264
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 8
1. Escriba una consulta para buscar en la tabla EMPLOYEES todos los empleados cuyos
nombres empiecen por “Ne” o “Na”.

2. Cree una consulta que elimine los espacios de la columna STREET_ADDRESS de la


tabla LOCATIONS en la visualización.
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 8-16


265
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 8 (continuación)
3. Cree una consulta que muestre “St” sustituido por “Street” en la columna STREET_
ADDRESS de la tabla LOCATIONS. Procure que no afecte a ninguna fila que ya
contenga “Street”. Muestre sólo las filas que se vean afectadas.
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 8-17


266
Introducción a Oracle 10g: SQL Fundamentals II

B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 8-18


267
Introducción a Oracle 10g: SQL Fundamentals II

____________________________

Apéndice A
Soluciones a la Práctica
____________________________
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

268
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 1: Soluciones
Para contestar a la pregunta 6 y a las posteriores, se deberá conectar a la base de datos
mediante iSQL*Plus. Para ello, inicie el explorador Internet Explorer desde el escritorio
del cliente. Introduzca la dirección URL en formato http://machinename:5561/isqlplus/ y
utilice la cuenta oraxx y la contraseña y el identificador de servicio correspondientes (en
formato Tx) que le proporcione el instructor para conectarse a la base de datos.
1. ¿Qué privilegio se debe otorgar a un usuario para conectarse a Oracle Server? ¿Se
trata de un privilegio de objeto o del sistema?
El privilegio del sistema CREATE SESSION

2. ¿Qué privilegio se debe otorgar a un usuario para crear tablas?


El privilegio CREATE TABLE

3. Si crea una tabla, ¿quién puede transferir privilegios a otros usuarios en su tabla?
Puede hacerlo usted mismo o cualquier usuario a quien haya otorgado dichos
privilegios mediante WITH GRANT OPTION.

4. Usted es el DBA. Está creando muchos usuarios que requieren los mismos privilegios
del sistema.
¿Qué debería utilizar para facilitar el trabajo?
B

Crear un rol que contenga los privilegios del sistema y otorgar el rol a los
usuarios.
as L í

5. ¿Qué comando se utiliza para cambiar la contraseña?


e

La sentencia ALTER USER


SQ Gu
de Fu de

6. Otorgue acceso a su tabla DEPARTMENTS a otro usuario. Haga que el usuario le


otorgue acceso de consulta a su tabla DEPARTMENTS.
D da Al

Team 2 executes the GRANT statement.


GRANT select
at m u

ON departments
TO <user1>;
os e m
n

Team 1 executes the GRANT statement.


a

GRANT select
ON departments
O ta o

TO <user2>;
ra ls
l

Donde user1 es el nombre del equipo 1 y user2 es el nombre del equipo 2.


cl I

7. Consulte todas las filas de la tabla DEPARTMENTS.


n

e I

SELECT *
FROM departments;
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II A-2


269
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 1: Soluciones (continuación)


8. Agregue una nueva fila a su tabla DEPARTMENTS. El equipo 1 debe agregar
Education como departamento número 500. El equipo 2 debe agregar Human
Resources como departamento número 510. Consulte la tabla del otro equipo.
Team 1 executes this INSERT statement.
INSERT INTO departments(department_id, department_name)
VALUES (500, 'Education');
COMMIT;
Team 2 executes this INSERT statement.
INSERT INTO departments(department_id, department_name)
VALUES (510, 'Human Resources');
COMMIT;

9. Cree un sinónimo para la tabla DEPARTMENTS del otro equipo.


Team 1 creates a synonym named team2.
CREATE SYNONYM team2
FOR <oraxx>.DEPARTMENTS;
Team 2 creates a synonym named team1.
B

CREATE SYNONYM team1


FOR <oraxx>. DEPARTMENTS;
as L í

10. Consulte todas las filas de la tabla DEPARTMENTS del otro equipo mediante el
e

sinónimo.
SQ Gu
de Fu de

Team 1 executes this SELECT statement.


SELECT *
FROM team2;
D da Al

Team 2 executes this SELECT statement.


SELECT *
at m u

FROM team1;
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II A-3


270
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 1: Soluciones (continuación)


11. Consulte el diccionario de datos USER_TABLES para ver información sobre las
tablas que son de su propiedad.
SELECT table_name
FROM user_tables;

12. Consulte la vista de diccionario de datos ALL_TABLES para ver información sobre
todas las tablas a las que puede acceder. Excluya las tablas de su propiedad.
SELECT table_name, owner
FROM all_tables
WHERE owner <> 'Oraxx';

13. Revoque el privilegio SELECT del otro equipo.

Team 1 revokes the privilege.


REVOKE select
ON departments
FROM <oraxx>;
B

Team 2 revokes the privilege.


REVOKE select
as L í

ON departments
FROM <oraxx>;
e
SQ Gu
de Fu de

14. Elimine la fila que insertó en la tabla DEPARTMENTS en el paso 8 y guarde los
cambios.
D da Al

Team 1 executes this INSERT statement.


DELETE FROM departments
at m u

WHERE department_id = 500;


COMMIT;
os e m
n

Team 2 executes this INSERT statement.


a

DELETE FROM departments


O ta o

WHERE department_id = 510;


COMMIT;
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II A-4


271
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 2: Soluciones
1. Cree la tabla DEPT2 basada en el siguiente diagrama de instancia de tabla. Guarde la
sintaxis en un archivo de comandos denominado lab_02_01.sql y, a
continuación, ejecute la sentencia en el archivo de comandos para crear la tabla.
Confirme que la tabla se ha creado.

Column Name ID NAME


Key Type
Nulls/Unique
FK Table
FK Column
Data type NUMBER VARCHAR2
Length 7 25

CREATE TABLE dept2


(id NUMBER(7),
B

name VARCHAR2(25));
as L í

DESCRIBE dept2
e

2. Rellene la tabla DEPT2 con datos de la tabla DEPARTMENTS. Incluya sólo las
SQ Gu

columnas que necesite.


de Fu de

INSERT INTO dept2


SELECT department_id, department_name
D da Al

FROM departments;
at m u

3. Cree la tabla EMP2 basada en el siguiente diagrama de instancia de tabla. Guarde la


os e m

sintaxis en un archivo de comandos denominado lab_02_03.sql y, a


n
a

continuación, ejecute la sentencia en el archivo de comandos para crear la tabla.


Confirme que la tabla se ha creado.
O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II A-5


272
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 2: Soluciones (continuación)

CREATE TABLE emp2


(id NUMBER(7),
last_name VARCHAR2(25),
first_name VARCHAR2(25),
dept_id NUMBER(7));

DESCRIBE emp2

4. Modifique la tabla EMP2 para permitir apellidos de empleado más largos. Confirme
la modificación.
ALTER TABLE emp2
MODIFY (last_name VARCHAR2(50));

DESCRIBE emp2

5. Confirme que las tablas DEPT2 y EMP2 se han almacenado en el diccionario de


B

datos. (Indicación: USER_TABLES)


as L í

SELECT table_name
FROM user_tables
e

WHERE table_name IN ('DEPT2', 'EMP2');


SQ Gu
de Fu de

6. Cree la tabla EMPLOYEES2 basándose en la estructura de la tabla EMPLOYEES.


Incluya sólo las columnas EMPLOYEE_ID, FIRST_NAME, LAST_NAME, SALARY
D da Al

y DEPARTMENT_ID. Asigne a las columnas de la nueva tabla los nombres ID,


FIRST_NAME, LAST_NAME, SALARY y DEPT_ID, respectivamente.
at m u
os e m
n

CREATE TABLE employees2 AS


a

SELECT employee_id id, first_name, last_name, salary,


department_id dept_id
O ta o

FROM employees;
ra ls
l

7. Borre la tabla EMP2.


cl I
n

DROP TABLE emp2;


e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II A-6


273
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 2: Soluciones (continuación)


8. Consulte la papelera de reciclaje para comprobar si está la tabla.

SELECT original_name, operation, droptime


FROM recyclebin;

9. Anule el borrado de la tabla EMP2.

FLASHBACK TABLE emp2 TO BEFORE DROP;


DESC emp2;

10. Borre la columna FIRST_NAME de la tabla EMPLOYEES2. Confirme la


modificación comprobando la descripción de la tabla.

ALTER TABLE employees2


DROP COLUMN first_name;

DESCRIBE employees2
B
as L í

11. En la tabla EMPLOYEES2, marque la columna DEPT_ID como UNUSED. Confirme


la modificación comprobando la descripción de la tabla.
e

ALTER TABLE employees2


SQ Gu

SET UNUSED (dept_id);


de Fu de

DESCRIBE employees2
D da Al

12. Borre todas las columnas UNUSED de la tabla EMPLOYEES2. Confirme la


at m u

modificación comprobando la descripción de la tabla.


os e m
n

ALTER TABLE employees2


a

DROP UNUSED COLUMNS;


O ta o

DESCRIBE employees2
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II A-7


274
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 2: Soluciones (continuación)


13. Agregue una restricción PRIMARY KEY de nivel de tabla a la tabla EMP2 en la
columna ID. Se debe asignar un nombre a la restricción en el momento de la
creación. Asigne a la restricción el nombre my_emp_id_pk.

ALTER TABLE emp2


ADD CONSTRAINT my_emp_id_pk PRIMARY KEY (id);

14. Cree una restricción PRIMARY KEY a la tabla DEPT2 mediante la columna ID. Se
debe asignar un nombre a la restricción en el momento de la creación. Asigne a la
restricción el nombre my_dept_id_pk.

ALTER TABLE dept2


ADD CONSTRAINT my_dept_id_pk PRIMARY KEY(id);

15. Agregue una referencia de clave ajena en la tabla EMP2 que asegure que el empleado
no está asignado a un departamento inexistente. Asigne a la restricción el nombre
my_emp_dept_id_fk.

ALTER TABLE emp2


ADD CONSTRAINT my_emp_dept_id_fk
B

FOREIGN KEY (dept_id) REFERENCES dept2(id);


as L í

16. Confirme que las restricciones se han agregado consultando la vista USER_
CONSTRAINTS.
e

Tenga en cuenta los tipos y los nombres de las restricciones.


SQ Gu
de Fu de

SELECT constraint_name, constraint_type


FROM user_constraints
WHERE table_name IN ('EMP2', 'DEPT2');
D da Al

17. Muestre los tipos y los nombres de objeto de la vista del diccionario de datos
at m u

USER_OBJECTS para las tablas EMP2 y DEPT2. Observe que se han creado tablas
nuevas y un nuevo índice.
os e m
n
a

SELECT object_name, object_type


FROM user_objects
O ta o

WHERE object_name LIKE 'EMP%'


OR object_name LIKE 'DEPT%';
ra ls
l

Si le queda tiempo, realice el siguiente ejercicio:


cl I

18. Modifique la tabla EMP2. Agregue una columna COMISSION de tipo de datos
n

NUMBER, precisión 2, escala 2. Agregue una restricción a la columna COMMISSION


e I

que garantice que el valor de comisión es mayor que cero.


10

ALTER TABLE emp2


n

ADD commission NUMBER(2,2)


g

CONSTRAINT my_emp_comm_ck CHECK (commission > 0);

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II A-8


275
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 2: Soluciones (continuación)


19. Borre las tablas EMP2 y DEPT2 de forma que no se puedan restaurar. Verifique la
papelera de reciclaje.

DROP TABLE emp2 PURGE;


DROP TABLE dept2 PURGE;

SELECT original_name, operation, droptime


FROM recyclebin;

20. Cree la tabla DEPT_NAMED_INDEX basada en el siguiente gráfico de instancia de


tabla. Asigne al índice de la columna PRIMARY KEY el nombre DEPT_PK_IDX.

Column Name Deptno Dname

Primary Key Yes


Data Type Number VARCHAR2
Length 4 30
B

CREATE TABLE DEPT_NAMED_INDEX


as L í

(deptno NUMBER(4)
PRIMARY KEY USING INDEX
e

(CREATE INDEX dept_pk_idx ON


DEPT_NAMED_INDEX(deptno)),
SQ Gu
de Fu de

dname VARCHAR2(30));
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II A-9


276
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 3: Soluciones
1. Ejecute el archivo de comandos lab_03_01.sql en la carpeta de prácticas para
crear la tabla SAL_HISTORY.

2. Muestre la estructura de la tabla SAL_HISTORY.

DESC sal_history

3. Ejecute el archivo de comandos lab_03_03.sql en la carpeta de prácticas para


crear la tabla MGR_HISTORY.

4. Muestre la estructura de la tabla MGR_HISTORY.

DESC mgr_history

5. Ejecute el archivo de comandos lab_03_05.sql en la carpeta de prácticas para


crear la tabla SPECIAL_SAL.

6. Muestre la estructura de la tabla SPECIAL_SAL.


B
as L í

DESC special_sal
e

7. a. Escriba una consulta para:


SQ Gu

- Recuperar los detalles de identificador de empleado, fecha de contratación,


de Fu de

salario e identificador de supervisor de los empleados cuyo identificador es


menor que 125 en la tabla EMPLOYEES.
- Si el salario es mayor que 20.000 dólares, insertar los detalles de identificador
D da Al

de empleado y salario en la tabla SPECIAL_SAL.


- Insertar los detalles de identificador de empleado, fecha de contratación y
at m u

salario en la tabla SAL_HISTORY.


os e m

- Insertar los detalles de identificador de empleado, identificador de supervisor y


n

salario en la tabla MGR_HISTORY.


a

O ta o

INSERT ALL
WHEN SAL > 20000 THEN
ra ls

INTO special_sal VALUES (EMPID, SAL)


l

ELSE
cl I

INTO sal_history VALUES(EMPID,HIREDATE,SAL)


n

INTO mgr_history VALUES(EMPID,MGR,SAL)


e I

SELECT employee_id EMPID, hire_date HIREDATE,


10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II A-10


277
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 3: Soluciones (continuación)

salary SAL, manager_id MGR


FROM employees
WHERE employee_id < 125;

b. Muestre los registros de la tabla SPECIAL_SAL.

SELECT * FROM special_sal;

c. Muestre los registros de la tabla SAL_HISTORY.

SELECT * FROM sal_history;

d. Muestre los registros de la tabla MGR_HISTORY.

SELECT * FROM mgr_history;

8. a. Ejecute el archivo de comandos lab_03_08a.sql en la carpeta


B

de prácticas para crear la tabla SALES_SOURCE_DATA.


as L í

b. Ejecute el archivo de comandos lab_03_08b.sql en la carpeta de


e

prácticas para insertar registros en la tabla SALES_SOURCE_DATA.


SQ Gu
de Fu de

c. Muestre la estructura de la tabla SALES_SOURCE_DATA.

DESC sales_source_data
D da Al
at m u

d. Muestre los registros de la tabla SALES_SOURCE_DATA.


os e m
n

SELECT * FROM SALES_SOURCE_DATA;


a

e. Ejecute el archivo de comandos lab_03_08c.sql en la carpeta


O ta o

de prácticas para crear la tabla SALES_INFO.


ra ls
l

f. Muestre la estructura de la tabla SALES_INFO.


cl I
n

DESC sales_info
e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II A-11


278
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 3: Soluciones (continuación)


g. Escriba una consulta para:
- Recuperar los detalles de identificador de empleado, identificador de semana,
ventas el lunes, ventas el martes, ventas el miércoles, ventas el jueves y ventas
el viernes de la tabla SALES_SOURCE_DATA.

- Crear tal transformación que cada registro recuperado de la tabla


SALES_SOURCE_DATA se convierta en varios registros para la tabla
SALES_INFO.

Indicación: Utilice una sentencia INSERT de pivoting.

INSERT ALL
INTO sales_info VALUES (employee_id, week_id, sales_MON)
INTO sales_info VALUES (employee_id, week_id, sales_TUE)
INTO sales_info VALUES (employee_id, week_id, sales_WED)
INTO sales_info VALUES (employee_id, week_id,
sales_THUR)
INTO sales_info VALUES (employee_id, week_id, sales_FRI)
SELECT EMPLOYEE_ID, week_id, sales_MON, sales_TUE,
sales_WED, sales_THUR,sales_FRI FROM sales_source_data;
B

h. Muestre los registros de la tabla SALES_INFO.


as L í

SELECT * FROM sales_info;


e
SQ Gu

9. Tiene almacenados los datos de empleados antiguos en un archivo plano denominado


de Fu de

emp.data. Desea almacenar los nombres y los identificadores de correo electrónico


de todos los empleados antiguos y actuales en una tabla. Para ello, cree primero una
tabla externa denominada EMP_DATA mediante el archivo de origen emp.dat en el
D da Al

directorio emp_dir. Para ello, puede utilizar el archivo de comandos


at m u

lab_03_09.sql.
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II A-12


279
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 3: Soluciones (continuación)

CREATE TABLE emp_data


(first_name VARCHAR2(20)
,last_name VARCHAR2(20)
, email VARCHAR2(30)
)
ORGANIZATION EXTERNAL
(
TYPE oracle_loader
DEFAULT DIRECTORY emp_dir
ACCESS PARAMETERS
(
RECORDS DELIMITED BY NEWLINE CHARACTERSET US7ASCII
NOBADFILE
NOLOGFILE
FIELDS
( first_name POSITION ( 1:20) CHAR
, last_name POSITION (22:41) CHAR
, email POSITION (43:72) CHAR )
)
LOCATION ('emp.dat') ) ;

10. A continuación, ejecute el archivo de comandos lab_03_10.sql para crear la tabla


B

EMP_HIST.
as L í

a. Aumente el tamaño de la columna de correo electrónico a 45.


b. Fusione los datos de la tabla EMP_DATA creada en la última práctica en los datos de
la tabla EMP_HIST. Supongamos que los datos de la tabla externa EMP_DATA son
e

los más actualizados. Si una fila de la tabla EMP_DATA se corresponde con la tabla
SQ Gu

EMP_HIST, actualice la columna de correo electrónico de la tabla EMP_HIST para


de Fu de

hacerla corresponder con la fila de la tabla EMP_DATA. Si una fila de la tabla


EMP_DATA no encuentra correspondencia, insértela en la tabla EMP_HIST. Se
considera que las filas se corresponden cuando el nombre y el apellido del empleado
D da Al

son idénticos.
at m u

MERGE INTO EMP_HIST f USING EMP_DATA h


os e m
n

ON (f.first_name = h.first_name
a

AND f.last_name = h.last_name)


WHEN MATCHED THEN
O ta o

UPDATE SET f.email = h.email


WHEN NOT MATCHED THEN
ra ls

INSERT (f.first_name
l

, f.last_name
, f.email)
cl I
n

VALUES (h.first_name
, h.last_name
e I

, h.email);
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II A-13


280
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 3: Soluciones (continuación)


c. Recupere las filas de EMP_HIST después de la fusión.

SELECT * FROM emp_hist;

11. Cree la tabla EMP3 mediante el archivo de comandos lab_03_11.sql. En la tabla


EMP3, cambie el departamento de Kochhar a 60 y valide el cambio. A continuación,
cambie el departamento de Kochhar a 50 y valide el cambio. Realice un seguimiento
de los cambios efectuados en Kochhar mediante la función de versiones de filas.

SELECT VERSIONS_STARTTIME "START_DATE",


VERSIONS_ENDTIME "END_DATE", DEPARTMENT_ID
FROM EMP3
VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE
WHERE LAST_NAME ='Kochhar';
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II A-14


281
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 4: Soluciones
1. Escriba una consulta para mostrar lo siguiente para los empleados cuyo identificador
de supervisor sea menor que 120:
- Identificador de supervisor
- Identificador de puesto y salario total de todos los identificadores de puesto de
los empleados que estén a las órdenes del mismo supervisor
- Salario total de esos supervisores
- Salario total de esos supervisores, independientemente de los identificadores de
puesto
SELECT manager_id,job_id,sum(salary)
FROM employees
WHERE manager_id < 120
GROUP BY ROLLUP(manager_id,job_id);

2. Observe la salida de la pregunta 1. Escriba una consulta mediante la función


GROUPING para determinar si los valores NULL de las columnas correspondientes a
las expresiones GROUP BY los genera la operación ROLLUP.

SELECT manager_id MGR ,job_id JOB,


B

sum(salary),GROUPING(manager_id),GROUPING(job_id)
FROM employees
as L í

WHERE manager_id < 120


GROUP BY ROLLUP(manager_id,job_id);
e
SQ Gu

3. Escriba una consulta para mostrar lo siguiente para los empleados cuyo identificador
de Fu de

de supervisor sea menor que 120:


- Identificador de supervisor
- Puesto y salarios totales de todos los puestos de empleados que estén a las
D da Al

órdenes del mismo supervisor


at m u

- Salario total de esos supervisores


- Valores desde varias tablas para mostrar el salario total de todos los puestos,
os e m
n

independientemente del supervisor


a

- Salario total independientemente de todos los cargos


O ta o

SELECT manager_id, job_id, sum(salary)


FROM employees
ra ls
l

WHERE manager_id < 120


GROUP BY CUBE(manager_id, job_id);
cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II A-15


282
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 4: Soluciones (continuación)


4. Observe la salida de la pregunta 3. Escriba una consulta mediante la función
GROUPING para determinar si los valores NULL en las columnas correspondientes a
las expresiones GROUP BY los genera la operación CUBE.

SELECT manager_id MGR ,job_id JOB,


sum(salary),GROUPING(manager_id),GROUPING(job_id)
FROM employees
WHERE manager_id < 120
GROUP BY CUBE(manager_id,job_id);

5. Mediante GROUPING SETS, escriba una consulta para mostrar los siguientes
agrupamientos:
- department_id, manager_id, job_id
- department_id, job_id
- manager_id, job_id
La consulta debe calcular la suma de los salarios para cada uno de estos grupos.

SELECT department_id, manager_id, job_id, SUM(salary)


FROM employees
B

GROUP BY
GROUPING SETS ((department_id, manager_id, job_id),
as L í

(department_id, job_id),(manager_id,job_id));
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II A-16


283
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 5: Soluciones
1. Modifique la sesión para definir NLS_DATE_FORMAT en DD-MON-YYYY
HH24:MI:SS.

ALTER SESSION SET NLS_DATE_FORMAT =


'DD-MON-YYYY HH24:MI:SS';

2. a. Escriba consultas para mostrar los offsets de zona horaria (TZ_OFFSET), para
las siguientes zonas horarias.

US/Pacific-New
SELECT TZ_OFFSET ('US/Pacific-New') from dual;
Singapore
SELECT TZ_OFFSET ('Singapore') from dual;
Egypt
SELECT TZ_OFFSET ('Egypt') from dual;

b. Modifique la sesión para definir el valor del parámetro TIME_ZONE en el offset


de zona horaria US/Pacific-New.
B

ALTER SESSION SET TIME_ZONE = '-7:00';


as L í

c. Muestre los valores de CURRENT_DATE, CURRENT_TIMESTAMP y


e

LOCALTIMESTAMP para esta sesión.


Nota: La salida puede ser diferente, según la fecha en que se ejecute el comando.
SQ Gu
de Fu de

SELECT CURRENT_DATE, CURRENT_TIMESTAMP,


LOCALTIMESTAMP FROM DUAL;
D da Al

d. Modifique la sesión para definir el valor del parámetro TIME_ZONE en el offset


at m u

de zona horaria Singapore.


os e m
n

ALTER SESSION SET TIME_ZONE = '+8:00';


a

e. Muestre los valores de CURRENT_DATE, CURRENT_TIMESTAMP y


O ta o

LOCALTIMESTAMP para esta sesión.


Nota: La salida podría ser diferente, según la fecha en que se ejecute el comando.
ra ls
l

SELECT CURRENT_DATE, CURRENT_TIMESTAMP,


cl I

LOCALTIMESTAMP FROM DUAL;


n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II A-17


284
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 5: Soluciones (continuación)


Nota: Observe en la práctica anterior que CURRENT_DATE,
CURRENT_TIMESTAMP y LOCALTIMESTAMP son todos sensibles a la zona
horaria de la sesión.

3. Escriba una consulta para mostrar los valores de DBTIMEZONE y


SESSIONTIMEZONE.

SELECT DBTIMEZONE,SESSIONTIMEZONE
FROM DUAL;

4. Escriba una consulta para extraer el valor de YEAR de la columna HIRE_DATE de la


tabla EMPLOYEES para los empleados que trabajan en el departamento 80.

SELECT last_name, EXTRACT (YEAR FROM HIRE_DATE)


FROM employees
WHERE department_id = 80;

5. Modifique la sesión para definir NLS_DATE_FORMAT en DD-MON-YYYY.


B

ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY';


as L í

6. Examine y ejecute el archivo de comandos lab_05_06.sql para crear la tabla


SAMPLE_DATES y rellenarla.
e
SQ Gu

a. Seleccione en la tabla y vea los datos.


de Fu de

SELECT * FROM sample_dates;


D da Al

b. Modifique el tipo de datos de la columna DATE_COL y cámbielo a


TIMESTAMP. Seleccione en la tabla para ver los datos.
at m u

ALTER TABLE sample_dates MODIFY date_col TIMESTAMP;


os e m

SELECT * FROM sample_dates;


n
a

c. Intente modificar el tipo de datos de la columna DATE_COL y cámbielo a


TIMESTAMP WITH TIME ZONE. ¿Qué sucede?
O ta o
ra ls

ALTER TABLE sample_dates MODIFY date_col


l

TIMESTAMP WITH TIME ZONE;


cl I
n

No se puede cambiar el tipo de datos de la columna DATE_COL, ya que


Oracle Server no le permite convertir de TIMESTAMP a TIMESTAMP
e I

WITH TIMEZONE mediante la sentencia ALTER.


10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II A-18


285
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 5: Soluciones (continuación)


7. Cree una consulta para recuperar apellidos de la tabla EMPLOYEES y calcule el estado
de revisión. Si el año de contratación fue 2000, muestre Needs Review para el
estado de revisión, si no, muestre not this year!. Asigne a la columna de estado
de revisión el nombre Review. Ordene los resultados por la columna HIRE_DATE.
Indicación: Utilice una expresión CASE con la función EXTRACT para calcular el
estado de revisión.

SELECT e.last_name
, (CASE extract(year from e.hire_date)
WHEN 1998 THEN 'Needs Review'
ELSE 'not this year!'
END ) AS "Review "
FROM employees e
ORDER BY e.hire_date;

8. Cree una consulta para imprimir los apellidos y el número de años de servicio para
cada empleado. Si el empleado lleva contratado cinco años o más, imprima 5 years
of service. Si el empleado lleva contratado 10 años o más, imprima 10 years
of service. Si el empleado lleva contratado 15 años o más, imprima 15 years
of service. Si no se cumple ninguna de estas condiciones, imprima maybe
B

next year!. Ordene los resultados por la columna HIRE_DATE. Utilice la tabla
EMPLOYEES.
as L í

Indicación: Utilice TO_YMINTERVAL y expresiones CASE.


e
SQ Gu

SELECT e.last_name, hire_date, sysdate,


de Fu de

(CASE
WHEN (sysdate -TO_YMINTERVAL('15-0'))>=
hire_date THEN '15 years of service'
D da Al

WHEN (sysdate -TO_YMINTERVAL('10-0'))>=


hire_date
at m u

THEN '10 years of service'


WHEN (sysdate - TO_YMINTERVAL('5-0'))>=
os e m
n

hire_date
a

THEN '5 years of service'


ELSE 'maybe next year!'
O ta o

END) AS "Awards"
FROM employees e;
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II A-19


286
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 6: Soluciones
1. Escriba una consulta para mostrar el apellido, el número de departamento y el salario
de cualquier empleado cuyo número de departamento y salario se correspondan con el
número de departamento y el salario de cualquier empleado que gane una comisión.

SELECT last_name, department_id, salary


FROM employees
WHERE (salary, department_id) IN
(SELECT salary, department_id
FROM employees
WHERE commission_pct IS NOT NULL);

2. Muestre el apellido, el número de departamento y el salario de cualquier empleado


cuyo salario y comisión se correspondan con el salario y la comisión de cualquier
empleado con el identificador de ubicación 1700.

SELECT e.last_name, d.department_name, e.salary


FROM employees e, departments d
WHERE e.department_id = d.department_id
AND (salary, NVL(commission_pct,0)) IN
(SELECT salary, NVL(commission_pct,0)
B

FROM employees e, departments d


WHERE e.department_id = d.department_id
as L í

AND d.location_id = 1700);


e

3. Cree una consulta para mostrar el apellido, la fecha de contratación y el salario de


SQ Gu

todos los empleados que tengan el mismo salario y la misma comisión que Kochhar.
de Fu de

Nota: No muestre a Kochhar en el juego de resultados.

SELECT last_name, hire_date, salary


D da Al

FROM employees
WHERE (salary, NVL(commission_pct,0)) IN
at m u

(SELECT salary, NVL(commission_pct,0)


FROM employees
os e m

WHERE last_name = 'Kochhar')


n

AND last_name != 'Kochhar';


a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II A-20


287
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 6: Soluciones (continuación)


4. Cree una consulta para mostrar los empleados que ganen un salario que sea más alto
que el salario de todos los supervisores de ventas (JOB_ID = 'SA_MAN'). Ordene
los resultados por salario en orden descendente.
SELECT last_name, job_id, salary
FROM employees
WHERE salary > ALL
(SELECT salary
FROM employees
WHERE job_id = 'SA_MAN')
ORDER BY salary DESC;

5. Muestre los detalles del identificador de empleado, el apellido y el identificador de


departamento de los empleados que vivan en ciudades cuyo nombre empiece por T.

SELECT employee_id, last_name, department_id


FROM employees
WHERE department_id IN (SELECT department_id
FROM departments
WHERE location_id IN
(SELECT location_id
B

FROM locations
as L í

WHERE city LIKE 'T%'));


e

6. Escriba una consulta para buscar todos los empleados que ganen más que el salario
medio de su departamento. Muestre el apellido, el salario, el identificador de
SQ Gu
de Fu de

departamento y el salario medio del departamento. Ordene por salario medio. Utilice
alias para las columnas recuperadas por la consulta como se muestra en el ejemplo de
salida.
D da Al

SELECT e.last_name ename, e.salary salary,


at m u

e.department_id deptno, AVG(a.salary) dept_avg


FROM employees e, employees a
os e m

WHERE e.department_id = a.department_id


n
a

AND e.salary > (SELECT AVG(salary)


FROM employees
O ta o

WHERE department_id = e.department_id )


GROUP BY e.last_name, e.salary, e.department_id
ra ls
l

ORDER BY AVG(a.salary);
cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II A-21


288
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 6: Soluciones (continuación)


7. Busque todos los empleados que no sean supervisores.
a. Hágalo primero mediante el operador NOT EXISTS.

SELECT outer.last_name
FROM employees outer
WHERE NOT EXISTS (SELECT 'X'
FROM employees inner
WHERE inner.manager_id =
outer.employee_id);

b. ¿Esto se puede conseguir mediante el operador NOT IN? ¿Cómo o por qué no?

SELECT outer.last_name
FROM employees outer
WHERE outer.employee_id
NOT IN (SELECT inner.manager_id
FROM employees inner);
B

Esta solución alternativa no es adecuada. La subconsulta selecciona un valor NULL, así que
as L í

toda la consulta no devuelve ninguna fila. El motivo es que todas las condiciones que
comparan un valor NULL dan como resultado un valor NULL. Siempre que sea probable
e

que haya valores NULL que formen parte del juego de valores, no utilice NOT IN como
sustituto de NOT EXISTS.
SQ Gu
de Fu de

8. Escriba una consulta para mostrar los apellidos de los empleados que ganen menos
que el salario medio en sus departamentos.
D da Al

SELECT last_name
at m u

FROM employees outer


WHERE outer.salary < (SELECT AVG(inner.salary)
os e m
n

FROM employees inner


a

WHERE inner.department_id
= outer.department_id);
O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II A-22


289
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 6: Soluciones (continuación)


9. Escriba una consulta para mostrar los apellidos de los empleados que tienen uno o
más colegas en su departamento con fechas de contratación posteriores pero salarios
más altos.

SELECT last_name
FROM employees outer
WHERE EXISTS (SELECT 'X'
FROM employees inner
WHERE inner.department_id =
outer.department_id
AND inner.hire_date > outer.hire_date
AND inner.salary > outer.salary);

10. Escriba una consulta para mostrar los identificadores de empleado, los apellidos, y los
nombres de departamento de todos los empleados.
Nota: Utilice una subconsulta escalar para recuperar el nombre de departamento en la
sentencia SELECT.

SELECT employee_id, last_name,


B

(SELECT department_name
as L í

FROM departments d
WHERE e.department_id =
e

d.department_id ) department
FROM employees e
SQ Gu
de Fu de

ORDER BY department;

11. Escriba una consulta para mostrar los nombres de departamento de los departamentos
D da Al

cuyo costo de salario total supere un octavo (1/8) del costo de salario total de toda la
compañía. Utilice la cláusula WITH para escribir esta consulta. Asigne a la consulta el
at m u

nombre SUMMARY.
os e m
n

WITH
a

summary AS (
SELECT d.department_name, SUM(e.salary) AS dept_total
O ta o

FROM employees e, departments d


WHERE e.department_id = d.department_id
ra ls
l

GROUP BY d.department_name)
cl I

SELECT department_name, dept_total


n

FROM summary
e I

WHERE dept_total > ( SELECT SUM(dept_total) * 1/8


FROM summary )
10

ORDER BY dept_total DESC;


n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II A-23


290
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 7: Soluciones
1. Observe los siguientes ejemplos de salida. ¿Son resultado de una consulta jerárquica?
Explique por qué o por qué no.
Imagen 1: No es una consulta jerárquica; el informe simplemente se
clasifica en orden descendente por SALARY.

Imagen 2: No es una consulta jerárquica; hay dos tablas implicadas.

Imagen 3: Sí, definitivamente se trata de una consulta jerárquica, ya que


muestra la estructura de árbol que representa la línea de supervisores de
la tabla EMPLOYEES.
2. Genere un informe que muestre un organigrama del departamento de Mourgos.
Imprima los apellidos, los salarios y los identificadores de departamento.

SELECT last_name, salary, department_id


FROM employees
START WITH last_name = 'Mourgos'
CONNECT BY PRIOR employee_id = manager_id;
B

3. Cree un informe que muestre la jerarquía de los supervisores del empleado Lorentz.
Muestre primero el supervisor inmediato.
as L í

SELECT last_name
FROM employees
e

WHERE last_name != 'Lorentz'


SQ Gu
de Fu de

START WITH last_name = 'Lorentz'


CONNECT BY PRIOR manager_id = employee_id;
D da Al

4. Cree un informe con sangrado que muestre la jerarquía de supervisores partiendo del
empleado cuyo LAST_NAME es Kochhar. Imprima el apellido del empleado, el
at m u

identificador de supervisor y el identificador de departamento. Asigne nombres de


alias a las columnas como se muestra en la salida de ejemplo.
os e m
n
a

COLUMN name FORMAT A20


SELECT LPAD(last_name, LENGTH(last_name)+(LEVEL*2)-
O ta o

2,'_')
name,manager_id mgr, department_id deptno
ra ls
l

FROM employees
START WITH last_name = 'Kochhar'
cl I
n

CONNECT BY PRIOR employee_id = manager_id


e I

/
COLUMN name CLEAR
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II A-24


291
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 7: Soluciones (continuación)


Si le queda tiempo, realice los siguientes ejercicios:
5. Genere un organigrama de la compañía que muestre la jerarquía de los supervisores.
Parta de la persona de nivel más alto, excluya a todas las personas con el identificador
de puesto IT_PROG, a De Haan y a los empleados que estén a las órdenes de De Haan.

SELECT last_name,employee_id, manager_id


FROM employees
WHERE job_id != 'IT_PROG'
START WITH manager_id IS NULL
CONNECT BY PRIOR employee_id = manager_id
AND last_name != 'De Haan';
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II A-25


292
Introducción a Oracle 10g: SQL Fundamentals II

Práctica 8: Soluciones
1. Escriba una consulta para buscar en la tabla EMPLOYEES todos los empleados cuyos
nombres empiecen por “Ne” o “Na”.

SELECT first_name, last_name


FROM employees
WHERE REGEXP_LIKE (first_name, '^N(e|a).');

2. Cree una consulta que elimine los espacios de la columna STREET_ADDRESS de la


tabla LOCATIONS en la visualización.

SELECT regexp_replace (street_address, ' ','')


FROM locations;

3. Cree una consulta que muestre “St” sustituido por “Street” en la columna
STREET_ADDRESS de la tabla LOCATIONS.Procure que no afecte a ninguna fila
que ya contenga “Street”. Muestre sólo las filas que se vean afectadas.

SELECT REGEXP_REPLACE (street_address, 'St$',


'Street') FROM locations
WHERE REGEXP_LIKE (street_address, 'St');
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II A-26


293
Introducción a Oracle 10g: SQL Fundamentals II

_____________________
Apéndice B
Descripciones de
Tablas y Datos
_____________________
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

294
Introducción a Oracle 10g: SQL Fundamentals II

DIAGRAMA DE RELACIONES DE ENTIDADES

B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II B-2


295
Introducción a Oracle 10g: SQL Fundamentals II

Tablas del Esquema


SELECT * FROM tab;

B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II B-3


296
Introducción a Oracle 10g: SQL Fundamentals II

Tabla REGIONS
DESCRIBE regions

SELECT * FROM regions;


B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II B-4


297
Introducción a Oracle 10g: SQL Fundamentals II

Tabla COUNTRIES
DESCRIBE countries

SELECT * FROM countries;


B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II B-5


298
Introducción a Oracle 10g: SQL Fundamentals II

Tabla LOCATIONS
DESCRIBE locations;

SELECT * FROM locations;


B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II B-6


299
Introducción a Oracle 10g: SQL Fundamentals II

Tabla DEPARTMENTS
DESCRIBE departments

SELECT * FROM departments;


B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II B-7


300
Introducción a Oracle 10g: SQL Fundamentals II

Tabla JOBS
DESCRIBE jobs

SELECT * FROM jobs;


B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II B-8


301
Introducción a Oracle 10g: SQL Fundamentals II

Tabla EMPLOYEES
DESCRIBE employees

B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II B-9


302
Introducción a Oracle 10g: SQL Fundamentals II

Tabla EMPLOYEES
Las cabeceras de las columnas COMMISSION_PCT, MANAGER_ID y DEPARTMENT_ID
están definidas como COMM, MGRID y DEPTID en la siguiente captura de pantalla para que
se ajusten a los valores de la tabla a lo largo de la página.
SELECT * FROM employees;
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II B-10


303
Introducción a Oracle 10g: SQL Fundamentals II

Tabla EMPLOYEES (continuación)

B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II B-11


304
Introducción a Oracle 10g: SQL Fundamentals II

Tabla EMPLOYEES (continuación)

B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II B-12


305
Introducción a Oracle 10g: SQL Fundamentals II

Tabla JOB_HISTORY
DESCRIBE job_history

SELECT * FROM job_history;


B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II B-13


306
Introducción a Oracle 10g: SQL Fundamentals II

B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II B-14


307
Introducción a Oracle 10g: SQL Fundamentals II

Escritura de Archivos de Comandos Avanzados


B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

308
Introducción a Oracle 10g: SQL Fundamentals II

Objetivos

Al finalizar este apéndice, debería estar capacitado


para:
• Describir el tipo de problemas que se solucionan
mediante SQL para generar SQL
• Escribir un archivo de comandos que genere un
archivo de comandos de sentencias DROP TABLE
• Escribir un archivo de comandos que genere un
archivo de comandos de sentencias INSERT INTO
B
as L í
e
SQ Gu
de Fu de

Objetivos
D da Al

En este apéndice, aprenderá a escribir un archivo de comandos SQL para generar un archivo
de comandos SQL.
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II C-2


309
Introducción a Oracle 10g: SQL Fundamentals II

Uso de SQL para Generar SQL

• SQL se puede utilizar para generar archivos de


comandos en SQL
• El diccionario de datos:
– Es una recopilación de tablas y vistas que
contienen información de base de datos
– Oracle Server lo crea y lo mantiene

SQL Diccionario de datos


B
as L í

Archivo de comandos SQL


e
SQ Gu
de Fu de

Uso de SQL para Generar SQL


SQL puede ser una potente herramienta para generar otras sentencias SQL. En la mayoría de
D da Al

los casos, esto implica la escritura de un archivo de comandos. Puede utilizar SQL desde
SQL para:
at m u

• Evitar codificación repetida


• Acceder a información del diccionario de datos
os e m

• Borrar o volver a crear objetos de base de datos


n
a

• Generar predicados dinámicos que contengan parámetros de tiempo de ejecución


Los ejemplos utilizados en esta lección implican la selección de información del diccionario
de datos. El diccionario de datos es una recopilación de tablas y vistas que contienen
O ta o

información sobre la base de datos. Oracle Server crea y mantiene esta recopilación. Todas las
tablas de diccionario de datos son propiedad del usuario SYS. La información almacenada en
ra ls
l

el diccionario de datos incluye nombres de los usuarios de Oracle Server, privilegios


otorgados a los usuarios, nombres de objetos de base de datos, restricciones de tabla e
cl I

información de auditoría. Hay cuatro categorías de vistas de diccionario de datos. Cada


n

categoría tiene prefijos distintos que reflejan el uso para el que se ha concebido.
e I

Prefijo Descripción
10

USER_ Contiene detalles de objetos propiedad del usuario


ALL_ Contiene detalles de objetos para los que se le han otorgado derechos de acceso al usuario, además de
n

objetos propiedad del usuario


g

DBA_ Contiene detalles de usuarios con privilegios DBA para acceder a cualquier objeto de la base de datos
V$_ Información almacenada sobre rendimiento y bloqueo de servidor de bases de datos; sólo disponible
para el DBA
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II C-3
310
Introducción a Oracle 10g: SQL Fundamentals II

Creación de un Archivo de Comandos Básico

SELECT 'CREATE TABLE ' || table_name ||


'_test ' || 'AS SELECT * FROM '
|| table_name ||' WHERE 1=2;'
AS "Create Table Script"
FROM user_tables;
B
as L í
e
SQ Gu
de Fu de

Archivo de Comandos Básico


D da Al

El ejemplo de la diapositiva genera un informe con sentencias CREATE TABLE a partir de


cada tabla de su propiedad. Cada sentencia CREATE TABLE generada en el informe incluye
at m u

la sintaxis para crear una tabla mediante el nombre de tabla con el sufijo _test y sólo con la
estructura de la tabla existente correspondiente. El nombre de tabla antiguo se obtiene a partir
os e m
n

de la columna TABLE_NAME de la vista de diccionario de datos USER_TABLES.


a

El paso siguiente es mejorar el informe para automatizar el proceso.


O ta o

Nota: Puede consultar las tablas de diccionario de datos para ver varios objetos de base de
datos de su propiedad. Las vistas de diccionario de datos utilizadas con frecuencia son:
ra ls

• USER_TABLES: Muestra la descripción de las tablas propiedad del usuario


l

• USER_OBJECTS: Muestra todos los objetos propiedad del usuario


cl I

• USER_TAB_PRIVS_MADE: Muestra todos los permisos para objetos propiedad del


n

usuario
e I

• USER_COL_PRIVS_MADE: Muestra todos los permisos para columnas de objetos


propiedad del usuario
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II C-4


311
Introducción a Oracle 10g: SQL Fundamentals II

Control del Entorno

SET ECHO OFF


SET FEEDBACK OFF Defina variables del
SET PAGESIZE 0 sistema en los valores
adecuados.

SPOOL dropem.sql
SENTENCIA SQL
SPOOL OFF
SET FEEDBACK ON
SET PAGESIZE 24 Vuelva a definir las
B

SET ECHO ON variables del sistema


en el valor por defecto.
as L í
e
SQ Gu
de Fu de

Control del Entorno


D da Al

Para ejecutar las sentencias SQL que se generan, las debe capturar en un archivo de spool que
se puede ejecutar a continuación. También debe planificar una limpieza de la salida que se
at m u

genera y asegurarse de suprimir elementos como, por ejemplo, cabeceras, mensajes de


feedback, títulos superiores, etc. Para ello, puede utilizar comandos de iSQL*Plus.
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II C-5


312
Introducción a Oracle 10g: SQL Fundamentals II

La Imagen Completa

SET ECHO OFF


SET FEEDBACK OFF
SET PAGESIZE 0

SELECT 'DROP TABLE ' || object_name || ';'


FROM user_objects
WHERE object_type = 'TABLE'
/

SET FEEDBACK ON
SET PAGESIZE 24
B

SET ECHO ON
as L í
e
SQ Gu
de Fu de

La Imagen Completa
D da Al

La salida del comando de la diapositiva se guarda en un archivo denominado dropem.sql


mediante la opción de salida File de iSQL*Plus. El archivo contiene los siguientes datos.
at m u

Este archivo ya se puede iniciar desde iSQL*Plus. Para ello, localice el archivo de comandos,
cárguelo y ejecútelo.
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10

Nota: Por defecto, los archivos se envían a la cola de espera a la carpeta ORACLE_HOME\
ORANT\BIN en Windows NT.
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II C-6


313
Introducción a Oracle 10g: SQL Fundamentals II

Volcado del Contenido de una Tabla en


un Archivo

SET HEADING OFF ECHO OFF FEEDBACK OFF


SET PAGESIZE 0

SELECT
'INSERT INTO departments_test VALUES
(' || department_id || ', ''' || department_name ||
''', ''' || location_id || ''');'
AS "Insert Statements Script"
FROM departments
/
B

SET PAGESIZE 24
as L í

SET HEADING ON ECHO ON FEEDBACK ON


e
SQ Gu
de Fu de

Volcado del Contenido de una Tabla en un Archivo


D da Al

A veces, resulta útil disponer de los valores para las filas de una tabla en un archivo de texto
en el formato de una sentencia INSERT INTO VALUES. Este archivo de comandos se
at m u

puede ejecutar para rellenar la tabla en caso de que se haya borrado dicha tabla por accidente.
os e m

El ejemplo de la diapositiva genera sentencias INSERT para la tabla DEPARTMENTS_TEST,


n

capturadas en el archivo data.sql mediante la opción de salida File de iSQL*Plus.


a

El contenido del archivo de comandos data.sql es el siguiente:


O ta o

INSERT INTO departments_test VALUES


(10, 'Administration', 1700);
ra ls

INSERT INTO departments_test VALUES


l

(20, 'Marketing', 1800);


INSERT INTO departments_test VALUES
cl I
n

(50, 'Shipping', 1500);


INSERT INTO departments_test VALUES
e I

(60, 'IT', 1400);


...
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II C-7


314
Introducción a Oracle 10g: SQL Fundamentals II

Volcado del Contenido de una Tabla en


un Archivo

Origen Resultado
'''X''' 'X'

'''' '

''''||department_name||'''' 'Administration'

''', ''' ','

''');' ');
B
as L í
e
SQ Gu
de Fu de

Volcado del Contenido de una Tabla en un Archivo (continuación)


D da Al

Posiblemente le ha llamado la atención el gran número de comillas simples que hay en la


diapositiva de la página anterior. Un juego de cuatro comillas simples genera una comilla
at m u

simple en la sentencia final. Además, recuerde que los valores de caracteres y de fecha deben
ir entre comillas.
os e m
n

Dentro de una cadena, para mostrar una comilla simple, le debe poner como prefijo otra
a

comilla simple. Por ejemplo, en el quinto ejemplo de la diapositiva, las comillas son para toda
la cadena. La segunda comilla actúa como prefijo para mostrar la tercera comilla. Así, el
O ta o

resultado es una comilla simple seguida del paréntesis y seguido del punto y coma.
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II C-8


315
Introducción a Oracle 10g: SQL Fundamentals II

Generación de un Predicado Dinámico

COLUMN my_col NEW_VALUE dyn_where_clause

SELECT DECODE('&&deptno', null,


DECODE ('&&hiredate', null, ' ',
'WHERE hire_date=TO_DATE('''||'&&hiredate'',''DD-MON-YYYY'')'),
DECODE ('&&hiredate', null,
'WHERE department_id = ' || '&&deptno',
'WHERE department_id = ' || '&&deptno' ||
' AND hire_date = TO_DATE('''||'&&hiredate'',''DD-MON-YYYY'')'))
AS my_col FROM dual;

SELECT last_name FROM employees &dyn_where_clause;


B
as L í
e
SQ Gu
de Fu de

Generación de un Predicado Dinámico


D da Al

El ejemplo de la diapositiva genera una sentencia SELECT que recupera datos de todos los
empleados de un departamento que se contrataron un día específico. El archivo de comandos
at m u

genera la cláusula WHERE dinámicamente.


os e m

Nota: Una vez volcada la variable de usuario, debe utilizar el comando UNDEFINE para
n

suprimirlo.
a

La primera sentencia SELECT le pide que introduzca el número de departamento. Si no


O ta o

introduce ningún número de departamento, la función DECODE lo considera nulo y se pedirá


al usuario la fecha de contratación. Si no introduce ninguna fecha de contratación, la función
ra ls

DECODE la considera nula y la cláusula WHERE dinámica que se genera será también nula, lo
l

que hace que la segunda sentencia SELECT recupere todas las filas de la tabla EMPLOYEES.
cl I

Nota: La variable NEW_V[ALUE] especifica una variable para contener un valor de


n

columna. Puede hacer referencia a la variable en comandos TTITLE. Utilice NEW_VALUE


e I

para mostrar valores de columna o la fecha en el título superior. Debe incluir la columna en
un comando BREAK con la acción SKIP PAGE. El nombre de variable no puede contener
10

una almohadilla (#). NEW_VALUE resulta útil para informes maestro/detalle en los que hay un
n

nuevo registro maestro para cada página.


g

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II C-9


316
Introducción a Oracle 10g: SQL Fundamentals II

Generación de un Predicado Dinámico (continuación)


Nota: Aquí, la fecha de contratación se debe introducir en formato DD-MON-YYYY.
La sentencia SELECT de la diapositiva anterior se puede interpretar así:
IF (<<deptno>> is not entered) THEN
IF (<<hiredate>> is not entered) THEN
return empty string
ELSE
return the string ‘WHERE hire_date =
TO_DATE('<<hiredate>>', 'DD-MON-YYYY')’
ELSE
IF (<<hiredate>> is not entered) THEN
return the string ‘WHERE department_id =
<<deptno>> entered'
ELSE
return the string ‘WHERE department_id =
<<deptno>> entered
AND hire_date =
TO_DATE(' <<hiredate>>', 'DD-MON-YYYY')’
END IF
La cadena devuelta se convierte en el valor de la variable DYN_WHERE_CLAUSE, que se
utilizará en la segunda sentencia SELECT.
Cuando se ejecuta el primer ejemplo de la diapositiva, se pide al usuario los valores para
DEPTNO y HIREDATE:
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m

Se genera el siguiente valor para MY_COL:


n
a

O ta o
ra ls

Cuando se ejecuta el segundo ejemplo de la diapositiva, se genera la siguiente salida:


l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II C-10


317
Introducción a Oracle 10g: SQL Fundamentals II

Resumen

En este apéndice, ha aprendido lo siguiente:


• Puede escribir un archivo de comandos SQL para
generar otro archivo de comandos SQL.
• Los archivos de comandos utilizan a menudo el
diccionario de datos.
• Puede capturar la salida en un archivo.
B
as L í
e
SQ Gu
de Fu de

Resumen
D da Al

SQL se puede utilizar para generar archivos de comandos SQL. Estos archivos de comandos
se pueden utilizar para evitar una codificación repetida, borrar o volver a crear objetos,
at m u

obtener ayuda del diccionario de datos y generar predicados dinámicos que contengan
parámetros de tiempo de ejecución.
os e m
n

Se pueden utilizar comandos de iSQL*Plus para capturar los informes generados por las
a

sentencias SQL y limpiar la salida que se genera como, por ejemplo, mediante la supresión de
cabeceras, mensajes de feedback, etc.
O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II C-11


318
Introducción a Oracle 10g: SQL Fundamentals II

B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II C-12


319
Introducción a Oracle 10g: SQL Fundamentals II

Componentes de la Arquitectura Oracle


B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

320
Introducción a Oracle 10g: SQL Fundamentals II

Objetivos

Al finalizar este apéndice, debería estar capacitado


para:
• Describir la arquitectura de Oracle Server y sus
componentes principales
• Mostrar las estructuras implicadas en la conexión
de un usuario a una instancia Oracle
• Enumerar las etapas de procesamiento:
– Consultas
– Sentencias DML
B

– Validaciones
as L í
e
SQ Gu
de Fu de

Objetivos
D da Al

En este apéndice se presenta la arquitectura de Oracle Server. Para ello, se describen las
estructuras de archivos, procesos y memoria implicados en el establecimiento de una
at m u

conexión a base de datos y en la ejecución de un comando SQL.


os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-2


321
Introducción a Oracle 10g: SQL Fundamentals II

Arquitectura de la Base de Datos Oracle:


Visión General

La base de datos Oracle consta de dos componentes


principales:
• Base de datos o estructuras físicas
• Instancia o estructuras de memoria
B
as L í
e
SQ Gu
de Fu de

Arquitectura de la Base de Datos Oracle: Visión General


D da Al

La base de datos Oracle consta de dos componentes principales: La instancia y la base de


datos propiamente dicha.
at m u

• La base de datos se compone de archivos físicos como, por ejemplo:


- Archivo de control, donde se almacena la configuración de la base de datos
os e m
n

- Archivos redo log que tienen información necesaria para la recuperación de la base
a

de datos
- Archivos de datos, donde se almacenan todos los datos
O ta o

- Archivo de parámetros, que contiene los parámetros que controlan el tamaño y las
propiedades de una instancia
ra ls
l

- Archivo de contraseñas, que contiene la contraseña del superusuario o SYSDBA


• La instancia se compone de la SGA (Área Global del Sistema) y los procesos del
cl I
n

servidor que realizan tareas dentro de la base de datos.


e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-3


322
Introducción a Oracle 10g: SQL Fundamentals II

Arquitectura Física de la Base de Datos

Archivos de control

Archivos de datos Archivos redo log en línea


B
as L í

Archivo de Archivo de Archivos log


parámetros contraseñas archivados
e
SQ Gu
de Fu de

Arquitectura Física de la Base de Datos


D da Al

Los archivos que componen una base de datos Oracle se organizan así:
• Archivos de control: Estos archivos contienen datos sobre la propia base de datos,
at m u

denominados metadatos. Estos archivos son fundamentales para la base de datos. Sin
ellos, no se pueden abrir archivos de datos para acceder a los datos de la base de datos.
os e m
n

• Archivos de datos: Estos archivos contienen los datos de la base de datos.


a

• Archivos redo log en línea: Estos archivos permiten la recuperación de la instancia de


la base datos. Si la base de datos fallase sin perder ningún archivo de datos, la instancia
O ta o

podrá recuperar la base de datos con la información de estos archivos.


ra ls

Hay otros archivos que no forman parte oficialmente de la base de datos pero que son
l

importantes para la correcta ejecución de la base de datos. Éstos son:


cl I

• Archivo de parámetros: Se utiliza para definir cómo se configurará la instancia al


n

iniciarse.
e I

• Archivo de contraseñas: Este archivo permite a los usuarios conectarse a la base de


datos de manera remota y realizar tareas administrativas.
10

• Archivos log archivados: Estos archivos contienen un historial continuado del redo
generado por la instancia. Estos archivos permiten la recuperación de la base de datos.
n

Mediante estos archivos y una copia de seguridad de la base de datos, se puede


g

recuperar un archivo de datos perdido.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-4


323
Introducción a Oracle 10g: SQL Fundamentals II

Archivos de control

• Contienen información de la estructura física de la


base de datos
• Se multiplexan para proteger contra pérdidas
• Se leen en la etapa de montaje

Archivos de control
B
as L í
e
SQ Gu
de Fu de

Archivos de control
D da Al

Al iniciar la instancia y montar la base de datos, se lee el archivo de control. Las entradas del
archivo de control especifican los archivos físicos que componen la base de datos.
at m u

Al agregar archivos adicionales a la base de datos, el archivo de control se actualiza


os e m

automáticamente.
n
a

La ubicación de los archivos de control se especifica en un parámetro de inicialización.


Para protegerse de un fallo de la base de datos debido a la pérdida del archivo de control,
O ta o

debería multiplexar el archivo de control en al menos tres dispositivos físicos distintos. Si


especifica varios archivos a través del parámetro de inicialización, el servidor de bases de
ra ls

datos Oracle puede mantener varias copias del archivo de control.


l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-5


324
Introducción a Oracle 10g: SQL Fundamentals II

Archivos Redo Log

• Registran los cambios realizados en la base de datos


• Se multiplexan para proteger contra pérdidas
Buffer de
redo log

LGWR
(Escritor
de Log)
B

Grupo 1 Grupo 2 Grupo 3


as L í
e
SQ Gu
de Fu de

Archivos Redo Log


D da Al

Los archivos redo log se utilizan para registrar cambios realizados en la base de datos como
resultado de transacciones y acciones internas del servidor de bases de datos Oracle. Protegen
at m u

la base de datos de la pérdida de integridad debida a fallos del sistema provocados por cortes
eléctricos, fallos de disco, etc. Los archivos redo log se deben multiplexar para asegurarse de
os e m
n

que la información almacenada en ellos no se perderá en caso de que se produzca un fallo


a

de disco.
El redo log se compone de grupos de archivos redo log. Un grupo consiste en un archivo redo
O ta o

log y sus copias multiplexadas. Se dice que cada copia idéntica es un miembro de ese grupo y
ra ls

cada grupo se identifica con un número. LGWR (Proceso de escritor de log) escribe registros
l

redo del buffer de redo log en un grupo de redo log hasta que se rellene el archivo o se solicite
cl I

una operación de cambio de log. A continuación, cambia y se escribe en los archivos del
n

grupo siguiente. Los archivos redo log se utilizan de forma circular.


e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-6


325
Introducción a Oracle 10g: SQL Fundamentals II

Tablespaces y Archivos de Datos

• Los tablespaces constan de uno o más archivos


de datos.
• Los archivos de datos pertenecen a un solo
tablespace.

Archivo de Archivo de
datos 1 datos 2
B
as L í

Tablespace USERS
e
SQ Gu
de Fu de

Tablespaces y Archivos de Datos


D da Al

Una base de datos se divide en unidades de almacenamiento lógicas denominadas tablespaces,


que se pueden utilizar para agrupar estructuras lógicas relacionadas. Cada base de datos se
at m u

divide lógicamente en uno o más tablespaces. Se crean uno o más archivos de datos
explícitamente para cada tablespace para almacenar físicamente los datos de todas las
os e m
n

estructuras lógicas de un tablespace.


a

Nota: También puede crear tablespaces bigfile, que son tablespaces con un archivo de
datos único, pero muy grande (de bloques de hasta 4 GB). Los tablespaces tradicionales
O ta o

smallfile (por defecto) pueden contener varios archivos de datos, pero los archivos no
ra ls

pueden ser tan grandes. Para obtener más información sobre tablespaces bigfile, consulte
l

Database Administrator’s Guide.


cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-7


326
Introducción a Oracle 10g: SQL Fundamentals II

Segmentos, Extensiones y Bloques

• Los segmentos existen dentro de un tablespace.


• Los segmentos se componen de una recopilación de
extensiones.
• Las extensiones son una recopilación de bloques de
datos.
• Los bloques de datos se asignan a bloques de sistema
operativo.
B
as L í

Segmento Extensiones Bloques Bloques de


de datos sistema operativo
e
SQ Gu
de Fu de

Segmentos, Extensiones y Bloques


D da Al

Los objetos de base de datos como por ejemplo, tablas e índices, se almacenan en tablespaces
como segmentos. Cada segmento contiene una o más extensiones. Una extensión consiste en
at m u

bloques de datos contiguos, lo que significa que cada extensión sólo puede existir en un
archivo de datos. Los bloques de datos son la unidad más pequeña de E/S de la base de datos.
os e m
n

Cuando la base de datos solicita un juego de bloques de datos del sistema operativo, éste lo
a

asigna al bloque de sistema operativo real del dispositivo de almacenamiento. Por esto, no es
necesario conocer la dirección física de ninguno de los datos de la base de datos. Esto también
O ta o

significa que un archivo de datos se puede segmentar o duplicar en varios discos.


ra ls

El tamaño del bloque de datos se puede definir en el momento de la creación de la base de


l

datos. El tamaño por defecto de 8 K es adecuado para la mayoría de bases de datos. Si la base
cl I

de datos soporta una aplicación de almacén de datos que tiene tablas e índices grandes, puede
n

resultar conveniente un bloque mayor. Si la base de datos soporta una aplicación transaccional
e I

en la que las lecturas y escrituras son muy aleatorias, puede resultar más adecuado especificar
un tamaño de bloque menor. El tamaño máximo de bloque depende del sistema operativo. El
10

tamaño mínimo de bloque es 2 K y se debería utilizar en raras ocasiones (o nunca).


n

Puede tener tablespaces con diferentes tamaños de bloque. Generalmente, esto sólo se debería
g

utilizar para soportar tablespaces transportables. Para obtener detalles, consulte Database
Administrator’s Guide.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-8


327
Introducción a Oracle 10g: SQL Fundamentals II

Gestión de Instancias Oracle


SGA

Pool Pool para


Pool grande
compartido Streams

Caché de
Buffer de
Pool Java buffers de la
redo log
base de datos

SMON PMON DBW0


LGWR
(Monitor (Monitor (Escritor de
(Escritor
del de Base de
de Log)
Sistema) Procesos) Datos)
B

Punto de ARC0
as L í

control (Proceso de
CKPT Archivado)
e
SQ Gu
de Fu de

Gestión de Instancias Oracle


D da Al

Un servidor de bases de datos Oracle está formado por una base de datos Oracle y una
instancia Oracle. Una instancia Oracle se compone de buffers de memoria conocidos como
at m u

SGA (Área Global del Sistema) y procesos en segundo plano.


os e m

La instancia está inactiva (no existente) hasta que se inicia. Cuando se inicia la instancia, se
n

lee un archivo de parámetros de inicialización y la instancia se configura de la manera


a

correspondiente.
O ta o

Una vez iniciada la instancia y abierta la base de datos, los usuarios pueden acceder a la base
de datos.
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-9


328
Introducción a Oracle 10g: SQL Fundamentals II

Estructuras de Memoria Oracle

Proceso Proceso Proceso en


del PGA del PGA segundo PGA
servidor 1 servidor 2 plano

SGA

Pool Pool para


Pool grande
compartido Streams

Caché de
Buffer de
Pool Java buffers de la
redo log
B

base de datos
as L í
e
SQ Gu
de Fu de

Estructuras de Memoria Oracle


D da Al

Las estructuras de memoria básicas asociadas a una instancia Oracle son:


• SGA (Área Global del Sistema): Compartida por el servidor y los procesos en
at m u

segundo plano
• PGA (Área Global de Programas): Privada para cada servidor y cada proceso en
os e m
n

segundo plano; hay una PGA para cada proceso


a

La SGA (Área Global del Sistema) es un área de memoria compartida que contiene datos e
información de control para la instancia.
O ta o

La SGA se compone de las siguientes estructuras de datos:


ra ls

• Caché de buffers de base de datos: Almacena en caché bloques de datos recuperados


l

de la base de datos
cl I

• Buffer de redo log: Almacena en caché la información de redo (utilizada para la


n

recuperación de la instancia) hasta que se pueda escribir en los archivos redo log físicos
e I

almacenados en disco
• Pool compartido: Almacena varias construcciones que se pueden compartir entre
10

usuarios
• Pool grande: Área opcional utilizada para almacenar en buffer solicitudes grandes
n

de E/S
• Pool Java: Utilizado para el código Java específico de sesión y los datos dentro de JVM
(Java Virtual Machine)
• Pool para Streams: Utilizado por Oracle Streams
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-10
329
Introducción a Oracle 10g: SQL Fundamentals II

Estructuras de Memoria Oracle (continuación)


Al iniciar la instancia mediante Enterprise Manager o SQL*Plus, se muestra la memoria
asignada para la SGA.
Con la infraestructura dinámica de SGA, el tamaño de la caché de buffers de la base de datos,
el pool compartido, el pool Java y el pool para Streams se pueden cambiar sin cerrar la
instancia.
La base de datos preconfigurada se ha predefinido con los valores adecuados para los
parámetros de memoria. Sin embargo, a medida que aumenta el uso de la base de datos, puede
resultar necesario modificar los valores de los parámetros de memoria.
Oracle proporciona alertas y asesores para identificar problemas de tamaño de memoria y
para ayudar a determinar los valores adecuados para los parámetros de memoria.
Una PGA (Área Global de Programas) es una región de memoria que contiene datos e
información de control para cada proceso del servidor. Un proceso del servidor atiende las
solicitudes de un cliente. Cada proceso del servidor tiene su propia área PGA privada que se
crea al iniciarse el proceso del servidor. El acceso a ella es exclusivo del proceso del servidor
y sólo la puede leer y escribir el código de Oracle que actúe en su nombre.
La cantidad de memoria de PGA utilizada y su contenido dependen de si la instancia se
configura en modo de servidor compartido. Generalmente, la PGA contiene lo siguiente:
• Área SQL privada: Contiene datos como, por ejemplo, información enlazada y
estructuras de memoria de tiempo de ejecución. Cada sesión que emite una sentencia
B

SQL tiene un área SQL privada.


as L í

• Memoria de sesión: La memoria asignada para retener las variables de sesión y otra
información relacionada con la sesión.
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-11


330
Introducción a Oracle 10g: SQL Fundamentals II

Procesos Oracle
Proceso Proceso Proceso Proceso
del servidor del servidor del servidor del servidor

SGA
Área Global del Sistema

DBW0
SMON PMON CKPT LGWR ARC0
Escritor de
B

Monitor del Monitor de Punto de Escritor Proceso de


base
sistema procesos control de Log Archivado
as L í

de datos
Procesos en segundo plano
e
SQ Gu
de Fu de

Procesos Oracle
D da Al

Al llamar a un programa o una herramienta Oracle como, por ejemplo, Enterprise Manager,
Oracle Server crea un proceso del servidor para ejecutar comandos emitidos por la aplicación.
at m u

Oracle también crea un juego de procesos en segundo plano para una instancia que
interactúan entre sí y con el sistema operativo para gestionar las estructuras de memoria,
os e m
n

realizar E/S asíncronamente para escribir datos en disco y realizar tareas de mantenimiento
a

general.
Los procesos en segundo plano que están presentes dependen de las funciones que se estén
O ta o

utilizando en la base de datos. Los procesos en segundo plano más comunes son los
siguientes:
ra ls
l

• SMON (Monitor del sistema): Realiza una recuperación de fallo cuando se inicia la
instancia después de un fallo
cl I
n

• PMON (Monitor de procesos): Realiza una limpieza de procesos cuando falla un


proceso del usuario
e I

• DBWn (Escritor de base de datos): Escribe bloques modificados de la caché de


buffers de base de datos a los archivos en disco
10

• CKPT (Punto de control): Señala DBWn en puntos de control y actualiza todos los
n

archivos de datos y los archivos de control de la base de datos para indicar el punto de
g

control más reciente


• LGWR (Escritor de log): Escribe entradas de redo en disco
• ARCn (Proceso de archivado): Copia los archivos redo log en el almacenamiento de
archivado cuando los archivos log están llenos o se produce un cambio de log
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-12
331
Introducción a Oracle 10g: SQL Fundamentals II

Otras Estructuras Físicas Clave

Archivo de
parámetros

Archivo de Archivos
contraseñas Base de datos log archivados
B
as L í
e
SQ Gu
de Fu de

Otros Archivos Clave


D da Al

Oracle Server también utiliza otros archivos que no forman parte de la base de datos:
• El archivo de parámetros define las características de una instancia Oracle. Por ejemplo,
at m u

contiene los parámetros que especifican el tamaño de las estructuras de memoria en


la SGA.
os e m
n

• El archivo de contraseñas autentica los usuarios a los que se les permite iniciar y cerrar
a

una instancia Oracle.


• Los archivos redo log archivados son copias offline de los archivos redo log que pueden
O ta o

ser necesarios para recuperarse de los fallos del medio físico.


ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-13


332
Introducción a Oracle 10g: SQL Fundamentals II

Procesamiento de una Sentencia SQL

• Conexión a una instancia mediante:


– El proceso del usuario
– El proceso del servidor
• Los componentes de Oracle Server que se utilicen
dependerán del tipo de sentencia SQL:
– Las consultas devuelven filas
– Cambios de log de sentencias DML
– La validación garantiza la recuperación de la transacción
• Algunos componentes de Oracle Server no participan
en el procesamiento de las sentencias SQL.
B
as L í
e
SQ Gu
de Fu de

Componentes que se Utilizan para Procesar SQL


D da Al

No se utilizan todos los componentes de una instancia Oracle para procesar las sentencias
SQL. Los procesos del usuario y del servidor se utilizan para conectar un usuario a una
at m u

instancia Oracle. Estos procesos no forman parte de la instancia Oracle, aunque son
necesarios para procesar una sentencia SQL.
os e m
n

Algunos de los procesos en segundo plano, las estructuras SGA y los archivos de base de
a

datos se utilizan para procesar sentencias SQL. Dependiendo del tipo de sentencia SQL, se
utilizan diferentes componentes:
O ta o

• Las consultas necesitan un procesamiento adicional para devolver las filas al usuario.
ra ls

• Las sentencias DML (Lenguaje de Manipulación de Datos) necesitan procesamiento


l

adicional para registrar los cambios efectuados en los datos.


cl I

• La validación del procesamiento asegura que se puedan recuperar los datos modificados
n

en una transacción.
e I

Algunos de los procesos en segundo plano necesarios no participan de forma directa en el


procesamiento de una sentencia SQL, aunque se utilizan para mejorar el rendimiento y para
10

recuperar la base de datos.


n

El proceso en segundo plano opcional, ARC0, se utiliza para asegurar la recuperación de una
g

base de datos de producción.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-14


333
Introducción a Oracle 10g: SQL Fundamentals II

Conexión a una Instancia

Usuario Servidor

Oracle Server

Usuario Servidor

Cliente

Servidor de aplicaciones Servidor


B

Usuario Servidor
as L í

Explorador
e
SQ Gu
de Fu de

Procesos que se Utilizan para Conectarse a una Instancia


D da Al

Antes que los usuarios puedan enviar sentencias SQL a Oracle Server, se deben conectar a
una instancia.
at m u

El usuario inicia una herramienta como iSQL*Plus, o bien ejecuta una aplicación que se haya
os e m

desarrollado con una herramienta como Oracle Forms. Esta aplicación o herramienta se
n

ejecutará en un proceso del usuario.


a

En la configuración más básica, cuando un usuario se conecta a Oracle Server, se crea un


O ta o

proceso en el equipo que ejecuta Oracle Server. A este proceso se le llama proceso del
servidor. El proceso del servidor se comunicará con la instancia Oracle en nombre del proceso
ra ls

del usuario en el cliente. El proceso del servidor ejecuta las sentencias SQL en nombre del
l

usuario.
cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-15


334
Introducción a Oracle 10g: SQL Fundamentals II

Procesos que se Utilizan para Conectarse a una Instancia (continuación)


Conexión
Una conexión es una ruta de comunicación entre un proceso del usuario y Oracle Server. Un
usuario de base de datos se puede conectar a Oracle Server de tres formas:
• El usuario se conecta al sistema operativo ejecutando la instancia Oracle e inicia una
aplicación o una herramienta que accede a la base de datos en ese sistema. Se establece
la ruta de comunicación mediante los mecanismos de comunicación entre procesos
disponibles en el sistema operativo del host.
• El usuario inicia la aplicación o la herramienta en un equipo local y se conecta a través
de la red al equipo que ejecuta la instancia Oracle. En esta configuración, conocida
como cliente/servidor, el software de red se utiliza para establecer la comunicación entre
el usuario y Oracle Server.
• En una conexión de tres capas, el equipo del usuario se comunica a través de la red con
un servidor de aplicaciones o de red, que se conecta a través de una red a la máquina que
ejecuta la instancia Oracle. Por ejemplo, el usuario ejecuta un explorador en un equipo
de red para utilizar una aplicación que reside en un servidor NT que recupera los datos
de una base de datos Oracle que se ejecuta en un host UNIX.
Sesiones
Una sesión es una conexión específica de un usuario a Oracle Server. La sesión se inicia
cuando Oracle Server valida al usuario, y finaliza cuando el usuario se desconecta o cuando se
B

produce una terminación anormal. Un usuario de base de datos determinado puede realizar
muchas sesiones simultáneas si dicho usuario se conecta desde distintas herramientas,
as L í

aplicaciones o terminales al mismo tiempo. Excepto en el caso de algunas herramientas de


administración de base de datos especializadas, el inicio de una sesión de base de datos
e

requiere que Oracle Server esté disponible.


SQ Gu

Nota: El tipo de conexión que se explica aquí, donde hay una correspondencia uno a uno
de Fu de

entre un proceso del usuario y del servidor, se denomina conexión de servidor dedicado.
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-16


335
Introducción a Oracle 10g: SQL Fundamentals II

Procesamiento de una Consulta

• Análisis:
– Busca una sentencia idéntica
– Comprueba la sintaxis, los nombres de objetos y
los privilegios
– Bloquea los objetos que se utilizan durante el
análisis
– Crea y almacena el plan de ejecución
• Ejecución: Identifica las filas seleccionadas
• Recuperación: Devuelve filas al proceso del
usuario
B
as L í
e
SQ Gu
de Fu de

Pasos para el Procesamiento de Consultas


D da Al

Las consultas son diferentes a otros tipos de sentencias SQL ya que, si son correctas,
devuelven los datos como resultados. Mientras otras sentencias simplemente devuelven un
at m u

éxito o un fallo, una consulta puede devolver una o miles de filas.


os e m

Las etapas principales en el procesamiento de una consulta son tres:


n

• Análisis
a

• Ejecución
• Recuperación
O ta o

Durante la etapa de análisis, la sentencia SQL se transfiere del proceso del usuario al del
ra ls

servidor, y se carga una representación analizada de la sentencia en un área SQL compartida.


l

Durante el análisis, el proceso del servidor realiza las siguientes funciones:


cl I

• Busca una copia existente de la sentencia SQL en el pool compartido


n

• Valida la sentencia SQL comprobando su sintaxis


e I

• Realiza búsquedas en el diccionario de datos para validar las definiciones de tabla y


columna
10

La ejecución ejecuta la sentencia mediante el mejor enfoque del optimizador y la


n

recuperación vuelve a recuperar las filas para el usuario.


g

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-17


336
Introducción a Oracle 10g: SQL Fundamentals II

Pool Compartido

• La caché de biblioteca contiene el texto de la sentencia


SQL, el código analizado y el plan de ejecución.
• La caché del diccionario de datos contiene las
definiciones y privilegios de tabla, columna y otros
objetos.
• SHARED_POOL_SIZE especifica el tamaño del pool
compartido.
Pool compartido

Caché de
biblioteca
B

Caché de
as L í

diccionario
de datos
e
SQ Gu
de Fu de

Componentes del Pool Compartido


D da Al

Durante la etapa de análisis, el proceso del servidor utiliza el área en la SGA conocida como
el pool compartido para compilar la sentencia SQL. El pool compartido cuenta con dos
at m u

componentes principales:
• Caché de biblioteca
os e m
n

• Caché de diccionario de datos


a

Caché de Biblioteca
O ta o

La caché de biblioteca almacena información acerca de las últimas sentencias SQL que se
hayan utilizado en una estructura de la memoria denominada área SQL compartida. El área
ra ls

SQL compartida contiene:


l

• El texto de la sentencia SQL


cl I

• El árbol de análisis: Versión compilada de la sentencia


n

• El plan de ejecución: Los pasos que se deben seguir al ejecutar la sentencia


e I

El optimizador es la función de Oracle Server que determina el plan de ejecución óptimo.


10

Si se vuelve a ejecutar una sentencia SQL y un área SQL compartida ya dispone del plan de
ejecución de la sentencia, el proceso del servidor no necesitará analizar la sentencia. La caché
n

de biblioteca mejora el rendimiento de las aplicaciones que reutilizan sentencias SQL


g

reduciendo el tiempo de análisis y los requisitos de memoria. Si la sentencia SQL no se


reutiliza, al final caducará en la caché de biblioteca.

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-18


337
Introducción a Oracle 10g: SQL Fundamentals II

Componentes del Pool Compartido (continuación)


Caché del Diccionario de Datos
La caché del diccionario de datos, también conocida como la caché del diccionario o caché de
filas, es una recopilación de las definiciones de uso más reciente de la base de datos. Incluye
información sobre archivos de base de datos, tablas, índices, columnas, usuarios, privilegios y
otros objetos de base de datos.
Durante la fase de análisis, el proceso del servidor busca la información en la caché de
diccionario para resolver los nombres de objeto especificados en la sentencia SQL y validar
los privilegios de acceso. Si es necesario, el proceso del servidor inicia la carga de esta
información en los archivos de datos.
Especificación del Tamaño del Pool Compartido
El parámetro de inicialización SHARED_POOL_SIZE especifica el tamaño del pool
compartido.
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-19


338
Introducción a Oracle 10g: SQL Fundamentals II

Caché de Buffers de Base de Datos

• Almacena los bloques de uso más reciente


• Tamaño de un buffer basado en DB_BLOCK_SIZE
• Número de buffers que define DB_BLOCK_BUFFERS

Caché de
buffers de
base de datos
B
as L í
e
SQ Gu
de Fu de

Función de la Caché de Buffers de Base de Datos


D da Al

Cuando se procesa una consulta, el proceso del servidor busca en la caché de buffers de base
de datos los bloques que necesita. Si no se encuentra el bloque en la caché de buffers de base
at m u

de datos, el proceso del servidor lee el bloque en el archivo de datos y coloca una copia en la
caché de buffers. Dado que las siguientes solicitudes para el mismo bloque ya pueden
os e m
n

encontrar el bloque en la memoria, no necesitarán lecturas físicas. Oracle Server utiliza, como
a

mínimo, un algoritmo de uso menos reciente para hacer caducar los buffers a los que no se ha
accedido recientemente para dejar sitio a los nuevos bloques en la caché de buffers.
O ta o

Especificación del Tamaño de la Caché de Buffers de la Base de Datos


ra ls

El tamaño de cada buffer de la caché de buffers equivale al tamaño de un bloque de Oracle y


l

lo especifica el parámetro DB_BLOCK_SIZE. El número de buffers equivale al valor del


cl I

parámetro DB_BLOCK_BUFFERS.
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-20


339
Introducción a Oracle 10g: SQL Fundamentals II

PGA (Área Global de Programas)

• No compartido
• Sólo puede escribirlo el proceso del servidor
• Contiene:
– Área de ordenación
– Información de sesión
– Estado del cursor
– Espacio de la pila

Proceso del
B

servidor
as L í

PGA
e
SQ Gu
de Fu de

Componentes del Área Global de Programas


D da Al

Una PGA (Área Global de Programas) es una región de la memoria que contiene datos e
información de control para un proceso del servidor. Es una memoria no compartida creada
at m u

por Oracle cuando se inicia un proceso del servidor. El acceso a ella es exclusivo del proceso
del servidor, y sólo puede leerla y escribir en ella el código de Oracle Server que actúe en su
os e m
n

nombre. La memoria PGA asignada por cada proceso del servidor adjunta a una instancia
a

Oracle se conoce como la memoria PGA agregada asignada por la instancia.


En una configuración de servidor dedicado, la PGA del servidor incluye los siguientes
O ta o

componentes:
ra ls

• Área de ordenación: Se utiliza para cualquier ordenación necesaria para procesar la


l

sentencia SQL
cl I

• Información de sesión: Incluye los privilegios de usuario y las estadísticas de


n

rendimiento de la sesión
e I

• Estado del cursor: Indica la etapa en el procesamiento de las sentencias SQL que la
sesión utiliza en ese momento
10

• Espacio de la pila: Contiene otras variables de la sesión


La PGA se asigna cuando se crea un proceso y se libera cuando éste se termina.
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-21


340
Introducción a Oracle 10g: SQL Fundamentals II

Procesamiento de una Sentencia DML


Proceso SGA Pool compartido
del usuario
Caché de
buffers de Buffer de
base de redo log
datos
UPDATE
employees ...
4 1 2 3
Proceso
del servidor
Archivos Archivos Archivos
de datos de control redo log

1
B
as L í

Base de datos
e
SQ Gu
de Fu de

Pasos para el Procesamiento DML


D da Al

Una sentencia DML (Lenguaje de Manipulación de Datos) sólo requiere dos fases de
procesamiento:
at m u

• La etapa de análisis es la misma que la que se utiliza para procesar una consulta.
• La ejecución requiere un procesamiento adicional para efectuar cambios de datos.
os e m
n

Fase de Ejecución DML


a

Para ejecutar una sentencia DML:


O ta o

• Si los bloques de datos y de rollback no están todavía en la caché de buffers, el proceso


del servidor los lee en los archivos de datos para la caché de buffers.
ra ls

• El proceso del servidor coloca bloqueos en las filas que se van a modificar.
l

• En el buffer de redo log, el proceso del servidor registra los cambios que se deben
cl I

efectuar en el rollback y en los datos.


n

• Los cambios del bloque de rollback registran los valores de los datos antes de que se
e I

modifiquen. El bloque de rollback se utiliza para almacenar la imagen anterior de los


datos, de forma que se pueda hacer rollback de las sentencias DML si fuera necesario.
10

• Los cambios de los bloques de datos registran los nuevos valores de los datos.
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-22


341
Introducción a Oracle 10g: SQL Fundamentals II

Pasos para el Procesamiento DML (continuación)


Fase de Ejecución DML (continuación)
El proceso del servidor registra la imagen anterior en el bloque de rollback y actualiza el
bloque de datos. Estos dos cambios se llevan a cabo en la caché de buffers de base de datos.
Cualquier bloque que se cambie en la caché de buffers se marcará como buffer sucio; es decir,
los buffers que no son los mismos que los bloques correspondientes en el disco.
El procesamiento de un comando DELETE o INSERT utiliza pasos similares. La imagen
anterior de DELETE contiene los valores de columna en la fila suprimida, mientras que la
imagen anterior de INSERT contiene la información de ubicación de filas.
Como los cambios realizados en los bloques sólo se registran en las estructuras de la memoria
y no se escriben en el disco inmediatamente, un error en el equipo que ocasione la pérdida de
la SGA puede hacer que se pierdan también estos cambios.
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-23


342
Introducción a Oracle 10g: SQL Fundamentals II

Buffer de Redo Log

• LOG_BUFFER define su tamaño


• Registra los cambios realizados en toda la instancia
• Se utiliza secuencialmente
• Se trata de un buffer circular

Caché de
buffers de
base de datos
B
as L í
e
SQ Gu
de Fu de

Características del Buffer de Redo Log


D da Al

El proceso del servidor registra la mayor parte de los cambios efectuados a los bloques de
archivos de datos en el buffer de redo log , que es una parte de la SGA. El buffer de redo log
at m u

tiene las siguientes características:


• El parámetro LOG_BUFFER define su tamaño en bytes.
os e m
n

• Registra el bloque que se modifica, la ubicación del cambio y el nuevo valor en una
a

entrada de redo. Una entrada de redo no distingue el tipo de bloque que se cambia, sólo
registra los bytes que se cambian en el bloque.
O ta o

• El buffer de redo log se utiliza de forma secuencial, y los cambios que lleve a cabo una
transacción se pueden intercalar con los efectuados por otras transacciones.
ra ls
l

• Se trata de un buffer circular que se reutiliza después de llenarlo, aunque únicamente


cuando las entradas de redo antiguas se hayan registrado en los archivos redo log.
cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-24


343
Introducción a Oracle 10g: SQL Fundamentals II

Segmento de Rollback

Imagen antigua

Segmento de
rollback Imagen
nueva

Tabla
B

Sentencia DML
as L í
e
SQ Gu
de Fu de

Segmento de Rollback
D da Al

Antes de realizar un cambio, el proceso del servidor guarda el valor de los datos antiguo en un
segmento de rollback. Esta imagen anterior se utiliza para:
at m u

• Deshacer los cambios si se hace rollback de la transacción


• Proporcionar consistencia de lectura al asegurarse de que otras transacciones no vean los
os e m
n

cambios no validados realizados por la sentencia DML


a

• Recuperar la consistencia del estado de la base de datos en caso de un fallo


Los segmentos de rollback como, por ejemplo, tablas e índices, existen en los archivos de
O ta o

datos, mientras que los bloques de rollback se introducen en el buffer de base de datos a
ra ls

medida que se necesiten. El DBA crea los segmentos de rollback.


l

Los cambios realizados en los segmentos de rollback se registran en el buffer de redo log.
cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-25


344
Introducción a Oracle 10g: SQL Fundamentals II

Procesamiento COMMIT

1 Instancia
SGA Pool compartido
Proceso
Caché de
del servidor
buffers de Buffer de
4 base de redo log
datos
3
LGWR

Proceso Archivos Archivos Archivos


del usuario de datos de control redo log 2
B
as L í

Base de datos
e
SQ Gu
de Fu de

Validación (COMMIT) Rápida


D da Al

Oracle Server utiliza un mecanismo de validación rápido que garantiza que los cambios
validados se puedan recuperar en caso de fallo de la instancia.
at m u

Número de Cambio del Sistema


os e m

Siempre que se valida una transacción, Oracle Server asigna un SCN (número de cambio del
n
a

sistema) de validación a la transacción. El SCN se incrementa regularmente y es único en la


base de datos. Lo utiliza Oracle Server como un registro de hora interno para sincronizar los
O ta o

datos y proporcionar consistencia de lectura cuando se recuperan datos de los archivos de


datos. El uso del SCN permite que Oracle Server realice comprobaciones de consistencia sin
ra ls

depender de la fecha ni de la hora del sistema operativo.


l

Pasos para el Procesamiento de COMMIT


cl I
n

A continuación, se muestran los pasos que se deben seguir cuando se emite COMMIT:
• El proceso del servidor coloca un registro de validación, junto con el SCN, en el buffer
e I

de redo log.
10

• LGWR realiza una escritura contigua de todas las entradas de buffers de redo log hasta
el registro de validación (incluido) en los archivos redo log. Después, Oracle Server
n

puede garantizar que los cambios no se perderán si falla una instancia.


g

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-26


345
Introducción a Oracle 10g: SQL Fundamentals II

Validación (COMMIT) Rápida (continuación)


Pasos para el Procesamiento de COMMIT (continuación)
• Se informa al usuario de que COMMIT ha finalizado.
• El proceso del servidor registra la información para indicar que la transacción está
completa y que los bloqueos de recursos se pueden liberar.
DBW0 lleva a cabo el vaciado de los buffers sucios en el archivo de datos de manera
independiente y puede tener lugar antes o después de la validación.
Ventajas de la Validación (COMMIT) Rápida
El mecanismo de validación rápida asegura la recuperación de los datos al escribir los
cambios en el buffer de redo log en lugar de en los archivos de datos. Tiene las siguientes
ventajas:
• Las escrituras secuenciales en los archivos log son más rápidas que las escrituras de
bloques en los archivos de datos.
• En los archivos log sólo se escribe la información mínima necesaria para registrar los
cambios, mientras que la escritura en los archivos de datos requeriría la escritura de
bloques completos de datos.
• Si hay múltiples transacciones que solicitan su validación al mismo tiempo, la instancia
transporta registros de redo log en una sola escritura.
• A menos que el buffer de redo log se encuentre especialmente lleno, sólo será necesaria
una escritura síncrona por cada transacción. Si se lleva a cabo el transporte, puede haber
B

menos de una escritura síncrona por transacción.


• Como el buffer de redo log se puede vaciar antes de COMMIT, el tamaño de la
as L í

transacción no afecta a la cantidad de tiempo necesaria para una operación


COMMIT real.
e

Nota: Al hacer rollback de una transacción, no se dispara la escritura en disco de LGWR.


SQ Gu

Oracle Server siempre hace rollback de los cambios no validados cuando se recupera de
de Fu de

fallos. En caso de que se produzca un fallo después de un rollback, antes de registrar las
entradas de rollback en disco, la ausencia de un registro validado será suficiente para asegurar
que se hará rollback de los cambios realizados por la transacción.
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-27


346
Introducción a Oracle 10g: SQL Fundamentals II

Resumen

En este apéndice, ha aprendido a:


• Identificar los archivos de la base de datos:
Archivos de datos, archivos de control y archivos
redo log en línea
• Describir las estructuras de la memoria SGA:
Caché de buffers de base de datos, pool SQL
compartido y buffer de redo log
• Explicar los principales procesos en segundo
plano: DBW0, LGWR, CKPT, PMON, SMON y ARC0
• Mostrar los pasos del procesamiento SQL:
B

Análisis, ejecución, recuperación


as L í
e
SQ Gu
de Fu de

Resumen
D da Al

Archivos de la Base de Datos Oracle


at m u

La base de datos Oracle incluye los siguientes archivos:


• Archivos de control: Poseen la información necesaria para verificar la integridad de la
os e m

base de datos, incluidos los nombres de los demás archivos de la base de datos (Los
n

archivos de control suelen estar duplicados).


a

• Archivos de datos: Poseen los datos de la base de datos, incluidos tablas, índices,
segmentos de rollback y segmentos temporales
O ta o

• Redo logs en línea: Contienen los cambios realizados en los archivos de datos (Los
ra ls

redo logs en línea se utilizan en la recuperación y suelen estar duplicados).


l

Otros archivos que se suelen utilizar con la base de datos son:


cl I

• Archivo de parámetros: Define las características de una instancia Oracle


n

• Archivo de contraseñas: Autentica los usuarios con privilegios de la base de datos


e I

• Redo logs archivados: Son copias de seguridad de los redo logs en línea
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-28


347
Introducción a Oracle 10g: SQL Fundamentals II

Resumen (continuación)
Estructuras de la Memoria SGA
La SGA (Área Global del Sistema) tiene tres estructuras principales:
• Pool compartido: Almacena en el diccionario de datos las sentencias SQL que se han
ejecutado más recientemente y los datos de uso más reciente del diccionario de datos
• Caché de buffers de base de datos: Almacena los datos de uso más reciente
• Buffer de redo log: Registra los cambios realizados en la base de datos mediante la
instancia
Procesos en Segundo Plano
Una instancia Oracle de producción incluye los siguientes procesos:
• DBW0 (Escritor de base de datos): Escribe los datos cambiados en los archivos de
datos
• LGWR (Escritor de log): Registra los cambios realizados en los archivos de datos en los
archivos redo log en línea
• SMON (Monitor del sistema): Comprueba la consistencia e inicia la recuperación de la
base de datos cuando ésta se abre
• PMON (Monitor de procesos): Limpia los recursos si falla uno de los procesos
• CKPT (Proceso de punto de control): Actualiza la información de estado de base de
datos después de un punto de control
• ARC0 (Proceso de archivado): Hace una copia de seguridad del redo log en línea para
B

asegurar la recuperación después de un fallo del medio físico (Este proceso es opcional,
aunque se incluye normalmente en una instancia de producción).
as L í

Dependiendo de la configuración, la instancia puede incluir también otros procesos.


Pasos para el Procesamiento de Sentencias SQL
e

Los pasos que se utilizan para procesar una sentencia SQL son:
SQ Gu
de Fu de

• Análisis: Compila la sentencia SQL


• Ejecución: Identifica las filas seleccionadas o aplica cambios DML a los datos
• Recuperación: Devuelve las filas consultadas por una sentencia SELECT
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-29


348
Introducción a Oracle 10g: SQL Fundamentals II

B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-30


349
Introducción a Oracle 10g: SQL Fundamentals II

_________

Índice
_________
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

350
Introducción a Oracle 10g: SQL Fundamentals II

A
ACCESS PARAMETERS 02-33, 02-35
Activación de Restricciones 02-15, 02-16
Actualización Correlacionada 06-17, 06-18
Adición de una columna 02-05
Agrupamiento Concatenado 04-21, 04-22, 04-23
ALTER 01-12
ALTER SESSION 05-04,…, 05-09, 05-13, 05-17
ALTER TABLE 02-03,…, 02-19, 06-16, 08-13
ALTER USER 01-11, 01-19
ALL INSERT 03-02, 03-16, 03-21, 03-35
Arquitectura de la Base de Datos D-1...D-30

B
Borrado de una Columna 02-07

C
Clasificación de Filas 07-10
Cláusula WITH 06-22, 06-23, 06-24
Columna Compuesta 04-17, 04-19, 04-23
Comparaciones entre No Pares 06-04
B

Comparaciones entre Pares 06-04, 06-25


CONNECT BY 06-07, 07-05…07-14
as L í

CONNECT BY PRIOR 07-05 … 07-14


Consulta de Versiones 03-32
e

Consulta de Versiones de Flashback 02-32


Consulta Externa 03-07, 06-08, 06-10, 06-12, 06-13, 06-14
SQ Gu
de Fu de

Consulta Interna 06-08, 06-10, 06-10, 06-12, 06-14, 06-15


Consultas Jerárquicas 03-05
Correlación 06-13
Crear Base de Datos 05-09, C-03
D da Al

Crear Índice 02-20, 02-21, 02-23, 02-38, 02-39


at m u

CUBE 04-06,…, 04-24


CURRENT_DATE 05-05, 05-06, 05-06, 05-15, 05-34, 05-35
os e m

CURRENT_TIMESTAMP 05-05, 05-07, 05-08, 05-17, 05-34, 05-35


n
a

D
DBTIMEZONE 05-04, 05-09, 05-26, 05-34
O ta o

DEFAULT DIRECTORY 02-33, 02-35


ra ls

Depurar 02-26, 02-28


l

Desactivación de Restricciones 02-15


Desplazamiento por el Árbol 07-07...07-09
cl I
n

DROP TABLE 02-26, 02-28, C-02, C-06


e I

E
10

Eliminación del Árbol 07-13, 07-14


EXIST 06-14,…, 06-16, 06-20, 06-21, 06-24, 06-26, 06-27
n

EXTRACT 05-25
g

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II Índice-2


351
Introducción a Oracle 10g: SQL Fundamentals II

F
Fecha/Hora 05-05…05-35
Filas de Valores Derivados de Varias Tablas 04-06
Filas Superagregadas 04-06, 04-08, 04-09
FIRST INSERT 03-16, 03-22, 03-23
FLASHBACK TABLE 02-26, 02-27, 02-28
FROM_TZ 05-28
Función de Fecha/Hora 05-34, 05-35
Funciones de Conversión 05-28...05-31

G
GROUP BY 03-07, 03-23, 04-03 ,…, 04-23, 06-07, 06-20, 06-24, 06-25
GROUP BY ROLLUP 04-12, 04-17, 04-19
GROUPING 04-03,…, 04-23
GROUPING SET 04-13, 04-15, 04-17, 04-21, 04-23

H
HAVING 03-05, 04-03, 04-05, 04-07, 04-09, 06-20, C-04
Hora del Meridiano de Greenwich 05-03, 05-06, 05-14
Horario de Verano 05-03, 05-28, 05-32,
B

I
Índices Basados en Funciones 02-23, 02-24
as L í

Informe en Estructura de Árbol 07-02


Informes de Datos Derivados de Varias Tablas 04-09
e

INSERT 01-12, 01-15, 01-18, 02-06, 02-31, 03-03,…, 03-06, 03-11,…, 03-30
INSERT ALL Incondicional 02-19
SQ Gu
de Fu de

INSERT Condicional 02-20 ...02-23


INTERVAL 05-18-05-24
INTERVAL DAY TO SECOND 05-22, 05-24
INTERVAL YEAR TO MONTH 05-21...05-22
D da Al
at m u

L
LEVEL 07-05, 07-10, 07-11, 07-14,
os e m

LOCALTIMESTAMP 05-05, 05-08, 05-08, 05-34, 05-35


n
a

LPAD 07-11

M
O ta o

MERGE 03-27...03-30
ra ls

Metacaracteres 08-04...08-06
l

Modificación de una Columna 02-06


cl I
n

N
NLS_Date_Language 05-29
e I

Nodo Raíz 07-10


10

Nodo Secundario 07-10


NOT EXIST 01-16, 06-14, 06-16
n

NOT IN 03-11, 06-05, 06-06, 06-16


g

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II Índice-3


352
Introducción a Oracle 10g: SQL Fundamentals II

O
ON DELETE CASCADE 02-12
ORACLE_LOADER 02-35
ORDER BY 02-23, 04-03, 04-04, 04-05, 04-07, 04-09, 06-08,
ORGANIZATION EXTERNAL 02-33, 02-35

P
PIVOTING 03-16, 03-24, 03-25
Pseudocolumna 07-05, 07-10, 07-14, 07-15

R
REGEXP_INSTR 8-7
REGEXP_LIKE 8-7
REGEXP_REPLACE 8-7
REGEXP_SUBSTR 8-7
REJECT LIMIT 02-33, 02-35
Relación Principal-Secundario 07-04
Restricción 01-17, 02-07, 02-10…02-20, 06-07, 08-1, C-03
Restricciones de Control 08-13
Restricciones Diferidas 02-13
Restricciones en Cascada 02-18, 02-19
B

ROLLUP 04-06 ... 04-23


as L í

S
Seguimiento de Cambios 02-31
e

SESSIONTIMEZONE 05-06 ,…, 05-09, 05-26


SET TIME_ZONE 05-04, 05-06 ,…, 05-09, 05-17
SQ Gu
de Fu de

SET UNUSED 02-08


Soporte de Expresiones Normales 8-1,…, 8-13
START WITH 07-05, 07-06, 07-11, 07-14, 08-10
Subconsulta 03-04... 03-11, 03-14, 03-17, 06-03… 06_26, 07-06, 07-07
D da Al

Subconsulta Correlacionada 06-10 …06-13


at m u

Subconsulta Correlacionada para Actualizar Fila 06-17, 06-18


Subconsulta Correlacionada para Suprimir 06-20, 06-21
os e m

Subconsulta Escalar 06-07...06-09


n
a

Subconsultas de Varias Columnas 06-03, 06-07


Sustitución de Patrones 08-12
O ta o

T
ra ls

Tabla Externa 02-29, 02-31, 02-35, 02-37


l

TIMESTAMP 05-10...05-17
TIMESTAMP WITH LOCAL TIMEZONE 05-16, 05-17
cl I
n

TIMESTAMP WITH TIME ZONE 05-15


TO_DSINTERVAL 05-30
e I

TO_YMINTERVAL 05-31
10

TZ_OFFSET 05-26, 05-34


n

U
g

UNION 04-07, 04-10, 04-13, 04-17, 04-23


UNION ALL 04-07, 04-10, 04-13, 04-13, 04-17, 04-23

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II Índice-4


353
Introducción a Oracle 10g: SQL Fundamentals II

V
V$TIMEZONE_NAME 05-28
Valores Derivados de Varias Tablas 04-09, 04-23
Versiones de Filas 03-36
VERSIONS BETWEEN 03-34

Z
Zona Horaria 05-01... 05-34
B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II Índice-5


354
Introducción a Oracle 10g: SQL Fundamentals II

B
as L í
e
SQ Gu
de Fu de
D da Al
at m u
os e m
n
a

O ta o
ra ls
l

cl I
n

e I
10
n

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II Índice-6


355

S-ar putea să vă placă și