Sunteți pe pagina 1din 355

Introduccin a Oracle 10g: SQL Fundamentals II

Base de Datos Oracle 10g:


Conceptos Fundamentales
de SQL II
Gua del Alumno Volumen 1

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
1

Introduccin a Oracle 10g: SQL Fundamentals II

Contenido
Prefacio
Introduccin
Objetivos I-2
Objetivos del Curso I-3
Visin General del Curso I-4
Aplicacin del Curso 1-5
Resumen I-6

Control de Acceso de Usuarios


Objetivos 1-2
Control de Acceso de Usuarios 1-3
Privilegios 1-4
Privilegios del Sistema 1-5
Creacin de Usuarios 1-6
Privilegios del Sistema de Usuario 1-7
Otorgamiento de Privilegios del Sistema 1-8
Qu es un Rol? 1-9
Creacin y Otorgamiento de Privilegios a un Rol 1-10
Cambio de Contraseas 1-11
Privilegios de Objeto 1-12
Otorgamiento de Privilegios de Objeto 1-14
Transferencia de Privilegios 1-15
Confirmacin de Privilegios Otorgados 1-16
Revocacin de Privilegios de Objeto 1-17
Resumen 1-19
Prctica 1: Visin General 1-20

Gestin de Objetos de Esquema


Objetivos 2-2
Sentencia ALTER TABLE 2-3
Adicin de una Columna 2-5
Modificacin de una Columna 2-6
Borrado de una Columna 2-7
Opcin SET UNUSED 2-8
Adicin de una Sintaxis de Restriccin 2-10
Adicin de una Restriccin 2-11
ON DELETE CASCADE 2-12
Diferir Restricciones 2-13
Borrado de una Restriccin 2-14
Desactivacin de Restricciones 2-15

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
iii

Introduccin a Oracle 10g: SQL Fundamentals II

Activacin de Restricciones 2-16


Restricciones en Cascada 2-18
Visin General de ndices 2-20
CREATE INDEX con Sentencia CREATE TABLE 2-21
ndices Basados en Funciones 2-23
Eliminacin 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
Creacin de una Tabla Externa 2-32
Creacin de una Tabla Externa mediante ORACLE_LOADER 2-34
Consulta de Tablas Externas 2-36
Resumen 2-37
Prctica 2: Visin General 2-38

3 Manipulacin de Grandes Juegos de Datos


Objetivos 3-2
Uso de Subconsultas para Manipular Datos 3-3
Copia de Filas de Otra Tabla 3-4
Insercin mediante una Subconsulta como Destino 3-5
Recuperacin de Datos con una Subconsulta como Origen 3-7
Actualizacin de Dos Columnas con una Subconsulta 3-8
Actualizacin de Filas Basndose en Otra Tabla 3-9
Supresin de Filas Basndose en Otra Tabla 3-10
Uso de las Palabras Clave WITH CHECK OPTION en Sentencias DML 3-11
Visin General de la Funcin de Valor por Defecto Explcito 3-12
Uso de Valores Por Defecto Explcitos 3-13
Visin General de Sentencias INSERT de Varias Tablas 3-14
Tipos de Sentencias INSERT de Varias Tablas 3-16
Sentencias INSERT de Varias Tablas 3-17
INSERT ALL Incondicional 3-19
INSERT ALL Condicional 3-20
INSERT FIRST Condicional 3-22
INSERT de Pivoting 3-24
Sentencia MERGE 3-27
Sintaxis de la Sentencia MERGE 3-28
Fusin de Filas 3-29
Seguimiento de Cambios en los Datos 3-31
Ejemplo de Consulta de Versiones de Flashback 3-32
Clusula VERSIONS BETWEEN 3-34
Resumen 3-35
Prctica 3: Visin General 3-36

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
iv

Introduccin a Oracle 10g: SQL Fundamentals II

Generacin de Informes mediante la Agrupacin de Datos Relacionados


Objetivos 4-2
Revisin de Funciones de Grupo 4-3
Revisin de la Clusula GROUP BY 4-4
Revisin de la Clusula 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
Funcin GROUPING 4-11
Funcin 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
Resumen 4-23
Prctica 4: Visin General 4-24

Gestin de Datos en Zonas Horarias Diferentes


Objetivos 5-2
Zonas Horarias 5-3
Parmetro de Sesin TIME_ZONE 5-4
CURRENT_DATE, CURRENT_TIMESTAMP y LOCALTIMESTAMP 5-5
CURRENT_DATE 5-6
CURRENT_TIMESTAMP 5-7
LOCALTIMESTAMP 5-8
DBTIMEZONE y SESSIONTIMEZONE 5-9
Tipo de Datos TIMESTAMP 5-10
Tipos de Datos TIMESTAMP 5-11
Campos TIMESTAMP 5-12
Diferencia entre DATE y TIMESTAMP 5-13
Tipo de Datos TIMESTAMP WITH TIME ZONE 5-14
TIMESTAMP WITH TIMEZONE: Ejemplo 5-15
TIMESTAMP WITH LOCAL TIMEZONE 5-16
TIMESTAMP WITH LOCAL TIMEZONE: Ejemplo 5-17
Tipos de Datos INTERVAL 5-18
Campos INTERVAL 5-20
Tipo de Datos INTERVAL YEAR TO MONTH 5-21
INTERVAL YEAR TO MONTH: Ejemplo 5-22
Tipo de Datos INTERVAL DAY TO SECOND 5-23

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
v

Introduccin a Oracle 10g: SQL Fundamentals II

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


EXTRACT 5-25
TZ_OFFSET 5-26
Conversin de TIMESTAMP mediante FROM_TZ 5-28
Conversin a TIMESTAMP mediante TO_TIMESTAMP y TO_TIMESTAMP_TZ 5-29
Conversin de Intervalo de Tiempo con TO_YMINTERVAL 5-30
Uso de TO_DSINTERVAL: Ejemplo 5-31
Horario de Verano 5-32
Resumen 5-34
Prctica 5: Visin General 5-35
Recuperacin de Datos mediante Subconsultas
Objetivos 6-2
Subconsultas de Varias Columnas 6-3
Comparaciones de Columnas 6-4
Subconsulta de Comparacin entre Pares 6-5
Subconsulta de Comparacin entre No Pares 6-6
Expresiones de Subconsultas Escalares 6-7
Subconsultas Escalares: Ejemplos 6-8
Subconsultas Correlacionadas 6-10
Uso de Subconsultas Correlacionadas 6-12
Uso del Operador EXISTS 6-14
Bsqueda de Empleados que Tengan al Menos una Persona a sus rdenes 6-15
Bsqueda de Todos los Departamentos que No Tengan Empleados 6-16
Consulta Correlacionada: UPDATE 6-17
Uso de Consultas Correlacionadas: UPDATE 6-18
Consulta Correlacionada: DELETE 6-20
Uso de Consultas Correlacionadas: DELETE 6-21
Clusula WITH 6-22
Clusula WITH: Ejemplo 6-23
Resumen 6-25
Prctica 6: Visin General 6-27

Recuperacin Jerrquica
Objetivos 7-2
Ejemplo de Datos de la Tabla EMPLOYEES 7-3
Estructura de rbol Natural 7-4
Consultas Jerrquicas 7-5
Desplazamiento por el rbol 7-6
Desplazamiento por el rbol: De Abajo Arriba 7-8
Desplazamiento por el rbol: De Arriba Abajo 7-9
Clasificacin de Filas con la Pseudocolumna LEVEL 7-10
Formato de Informes Jerrquicos mediante LEVEL y LPAD 7-11
Eliminacin de Ramas 7-13

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
vi

Introduccin a Oracle 10g: SQL Fundamentals II

Resumen 7-14
Prctica 7: Visin General 7-15
8

Soporte de Expresiones Normales


Objetivos 8-2
Visin General de Expresiones Normales 8-3
Metacaracteres 8-4
Uso de Metacaracteres 8-5
Funciones de Expresiones Normales 8-7
Sintaxis de la Funcin REGEXP 8-8
Realizacin de Bsquedas Bsicas 8-9
Comprobacin de la Presencia de un Patrn 8-10
Ejemplo de Extraccin de Subcadenas 8-11
Sustitucin de Patrones 8-12
Expresiones Normales y Restricciones de Control 8-13
Resumen 8-14
Prctica 8: Visin General 8-15

Apndice A: Soluciones a la Prctica

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Apndice B: Descripciones de Tabla

Apndice C: Escritura de Archivos de Comandos Avanzados


Objetivos C-2
Uso de SQL para Generar SQL C-3
Creacin de un Archivo de Comandos Bsico C-4
Control del Entorno C-5
La Imagen Completa C-6
Volcado del Contenido de una Tabla en un Archivo C-7
Generacin de un Predicado Dinmico C-9
Resumen C-11

Apndice D: Componentes de la Arquitectura Oracle


Objetivos D-2
Arquitectura de la Base de Datos Oracle: Visin General D-3
Arquitectura Fsica de la Base de Datos D-4
Archivos de Control D-5
Archivos Redo Log D-6
Tablespaces y Archivos de Datos D-7
Segmentos, Extensiones y Bloques D-8
Gestin de Instancias Oracle D-9
Estructuras de Memoria Oracle D-10
Procesos Oracle D-12
Otras Estructuras Fsicas Clave D-13
Procesamiento de una Sentencia SQL D-14

vii

Introduccin a Oracle 10g: SQL Fundamentals II

Conexin 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
Prcticas Adicionales
Soluciones a las Prcticas Adicionales

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
viii

Introduccin a Oracle 10g: SQL Fundamentals II

Prefacio

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Introduccin a Oracle 10g: SQL Fundamentals II

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Prefacio - 2

Introduccin a Oracle 10g: SQL Fundamentals II

Perfil
Antes de Empezar Este Curso

Antes de empezar el curso, debe tener experiencia prctica con SQL.

Requisitos

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

Organizacin de Este Curso


Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II es un curso dirigido por un instructor
que ofrece clases tericas y ejercicios prcticos. Las demostraciones en lnea y las sesiones de prcticas
escritas refuerzan los conceptos y los conocimientos introducidos.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Prefacio - 3

10

Introduccin a Oracle 10g: SQL Fundamentals II

Publicaciones Relacionadas
Publicaciones Adicionales

Boletines de versin de sistema

Guas de usuario y de instalacin

Archivos read-me

Artculos de IOUG (International Oracle Users Group)

Oracle Magazine

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Prefacio - 4

11

Introduccin a Oracle 10g: SQL Fundamentals II

Convenciones Tipogrficas
Convenciones Tipogrficas del Texto

Convencin

Elemento

Ejemplo

Negrita

Frases y palabras enfatizadas


slo en el contenido Web

Para navegar dentro de esta aplicacin, no


haga clic en los botones Back y Forward.

Cursiva
negrita

Trminos de glosario (si hay


algn glosario)

El algoritmo inserta la clave nueva.

Corchetes

Nombres de tecla

Pulse [Enter].

Maysculas
y minsculas

Botones,
casillas de control,
disparadores,
ventanas

Haga clic en el botn Executable.


Active la casilla de control Registration
Required.
Asigne un disparador When-Validate-Item.
Abra la ventana Master Schedule.

Rutas de acceso de men

Comas

Secuencias de teclas

Seleccione File > Save.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Corchetes
angulares

Pulse y suelte de una en una las siguientes


teclas:
[Alt], [F], [D]

Prefacio - 5

12

Introduccin a Oracle 10g: SQL Fundamentals II

Convenciones Tipogrficas (continuacin)


Convenciones Tipogrficas del Texto (continuacin)

Objeto o Trmino

Ejemplo

Courier New,
sensible a
maysculas/m
insculas

Salida de cdigo,
elementos de cdigo
SQL y PL/SQL,
elementos de cdigo
Java, nombres de
directorio, nombres
de archivo,
contraseas,
nombres de ruta de
acceso, direcciones
URL,
datos introducidos
por el usuario,
nombres de usuario

Salida de cdigo: debug.seti (I,300);

Convencin

Elementos de cdigo SQL: Utilice el comando SELECT


para visualizar la informacin almacenada en la columna
last_name de la tabla emp.
Elementos de cdigo Java: La programacin Java afecta a
las clases String y StringBuffer.
Nombres de directorio: bin (DOS), $FMHOME (UNIX)
Nombres de archivo: Busque el archivo init.ora.
Contraseas: Utilice la contrasea tiger.
Nombres de ruta de acceso: Abra
c:\my_docs\projects.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

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

Datos introducidos por el usuario: Introduzca 300.


Nombres de usuario: Conctese como scott.

Maysculas
iniciales

Etiquetas de grficos Direccin de cliente (excepto Oracle Payables)


(siempre que el
trmino no sea un
nombre propio)

Cursiva

Frases y palabras
enfatizadas en
publicaciones
impresas, ttulos de
libros y cursos,
variables
Combinaciones de
teclas

Signos ms
Comillas

Ttulos de captulo y
de leccin en
referencias cruzadas,
elementos de
interfaz con
nombres largos que
slo tienen las
iniciales en
maysculas

No guarde los cambios en la base de datos.

Para obtener ms informacin, consulte Oracle7 Server


SQL Language Reference Manual.

Introduzca user_id@us.oracle.com, donde user_id


es el nombre de usuario.
Mantenga pulsadas las teclas siguientes:
[Control] + [Alt] + [Supr]

Este tema se trata en la Unidad II, Leccin 3, Trabajo con


Objetos.

Seleccione el componente Include a reusable module


component y haga clic en Finish.
Utilice la propiedad WHERE clause of query.

Prefacio - 6

13

Introduccin a Oracle 10g: SQL Fundamentals II

Convenciones Tipogrficas (continuacin)


Convenciones Tipogrficas de las Rutas de Acceso de Navegacin
Este curso utiliza rutas de acceso de navegacin simplificadas, como la del siguiente ejemplo, para guiarlo
a travs 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 botn Approve.
Notacin:
(N) = Navegador

(I) = Icono

(M) = Men

(H) = Enlace de hipertexto

(S) = Separador

(B) = Botn

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Prefacio - 7

14

Introduccin a Oracle 10g: SQL Fundamentals II

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

15

Prefacio - 8

Introduccin a Oracle 10g: SQL Fundamentals II

Introduccin

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

16

Introduccin a Oracle 10g: SQL Fundamentals II

Objetivos
Al finalizar esta leccin, debera estar capacitado para:
Mostrar los objetivos del curso
Describir las tablas de ejemplo utilizadas en el curso

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II I-2

17

Introduccin a Oracle 10g: SQL Fundamentals II

Objetivos del Curso


Al finalizar este curso, debera estar capacitado para:
Utilizar tcnicas SQL avanzadas de recuperacin
de datos para recuperar datos de tablas de base
de datos
Aplicar tcnicas avanzadas en una prctica que
simule la vida real

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II I-3

18

Introduccin a Oracle 10g: SQL Fundamentals II

Visin General del Curso

En este curso, utilizar tcnicas avanzadas SQL de


recuperacin de datos como:
Funciones de fecha/hora
GROUPING SETS y operadores ROLLUP y CUBE
Consultas jerrquicas
Subconsultas correlacionadas
Inserciones de varias tablas
Operacin de fusin (merge)
Tablas externas
Uso de expresiones normales

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II I-4

19

Introduccin a Oracle 10g: SQL Fundamentals II

Aplicacin del Curso

EMPLOYEES

DEPARTMENTS

COUNTRIES

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

REGIONS

LOCATIONS

Tablas Utilizadas en el Curso


En el curso, se utilizan las siguientes tablas:
EMPLOYEES: La tabla EMPLOYEES contiene informacin sobre todos los empleados como
nombre y apellido, identificador de puesto, salario, fecha de contratacin, identificador de
departamento e identificador de supervisor. Esta tabla es secundaria de la tabla DEPARTMENTS.
DEPARTMENTS: La tabla DEPARTMENTS contiene informacin como identificador de
departamento, nombre de departamento, identificador de supervisor e identificador de ubicacin.
Esta tabla es la tabla de clave primaria de la tabla EMPLOYEES.
LOCATIONS: Esta tabla contiene informacin de la ubicacin de departamentos. Contiene
informacin de identificador de ubicacin, calle, ciudad, estado o provincia, cdigo postal e
identificador de pas. Es la tabla de clave primaria de la tabla DEPARTMENTS y secundaria de la
tabla COUNTRIES.
COUNTRIES: Esta tabla contiene los nombres de pas, los identificadores de pas y los
identificadores de regin. Es secundaria de la tabla REGIONS. Es la tabla de clave primaria de la
tabla LOCATIONS.
REGIONS: Esta tabla contiene identificadores de regin y nombres de regin de los diferentes
pases. Es la tabla de clave primaria de la tabla COUNTRIES.

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

20

Introduccin a Oracle 10g: SQL Fundamentals II

Resumen
En esta leccin, ha aprendido lo siguiente:
Objetivos del curso
Tablas de ejemplo utilizadas en el curso

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II I-6

21

Introduccin a Oracle 10g: SQL Fundamentals II

Control de Acceso de Usuarios

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
22

Introduccin a Oracle 10g: SQL Fundamentals II

Objetivos
Al finalizar esta leccin, debera 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Objetivos

En esta leccin, aprender a controlar el acceso a base de datos para objetos especficos y a
agregar nuevos usuarios con diferentes niveles de privilegios de acceso.

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

23

Introduccin a Oracle 10g: SQL Fundamentals II

Control de Acceso de Usuarios

Administrador
de la base
de datos

Nombre de usuario y contrasea


Privilegios
Usuarios

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Control de Acceso de Usuarios

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:
Controlar el acceso a la base de datos
Otorgar acceso a objetos especficos de la base de datos
Confirmar los privilegios otorgados y recibidos con el diccionario de datos Oracle
Crear sinnimos para objetos de base de datos

La seguridad de base de datos se puede clasificar en dos categoras: seguridad del sistema y
seguridad de los datos. La seguridad del sistema cubre el acceso y el uso de la base de datos
en el nivel del sistema como, por ejemplo, nombre de usuario y contrasea, el espacio en
disco asignado a los usuarios y las operaciones del sistema que pueden realizar los usuarios.
La seguridad de datos cubre el acceso y el uso de los objetos de base de datos y las acciones
que esos usuarios pueden llevar a cabo en los objetos.

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

24

Introduccin a Oracle 10g: SQL Fundamentals II

Privilegios

Seguridad de base de datos:


Seguridad del sistema
Seguridad de datos

Privilegios del sistema: Obtencin de acceso a la


base de datos
Privilegios de objeto: Manipulacin del contenido
de los objetos de base de datos
Esquemas: Recopilaciones de objetos como, por
ejemplo, tablas, vistas y secuencias

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Privilegios

Los privilegios son el derecho a ejecutar sentencias SQL en particular. El DBA (administrador
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
sistema para obtener acceso a la base de datos y privilegios de objeto para manipular el
contenido de los objetos de la base de datos. A los usuarios tambin se les puede otorgar el
privilegio de otorgar privilegios adicionales a otros usuarios o a roles, que son grupos
especificados de privilegios relacionados.
Esquemas

Un esquema es una recopilacin 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.
Para obtener ms informacin, consulte el manual de referencia Oracle Database 10g
Application Developers Guide Fundamentals.

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

25

Introduccin a Oracle 10g: SQL Fundamentals II

Privilegios del Sistema

Hay ms de 100 privilegios disponibles.


El administrador de la base de datos tiene
privilegios del sistema de alto nivel para tareas
como, por ejemplo:

Creacin de usuarios nuevos


Eliminacin de usuarios
Eliminacin de tablas
Realizacin de copias de seguridad de tablas

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Privilegios del Sistema

Los usuarios y los roles tienen a su disposicin ms de 100 privilegios del sistema distintos.
Los privilegios del sistema suelen ser proporcionados por el administrador de la base de datos.
Privilegios de DBA Tpicos
Privilegio del Sistema

Operaciones Autorizadas

CREATE USER

La persona a la que se otorga el privilegio puede crear otros


usuarios de Oracle
La persona a la que se otorga el privilegio puede borrar otro
usuario.
La persona a la que se otorga el privilegio puede borrar una tabla
de cualquier esquema.
La persona a la que se otorga el privilegio puede realizar copias
de seguridad de cualquier esquema con la utilidad de exportacin.
La persona a la que se otorga el privilegio puede consultar tablas,
vistas o instantneas en cualquier esquema.
La persona a la que se otorga el privilegio puede crear tablas en
cualquier esquema.

DROP USER

DROP ANY TABLE

BACKUP ANY TABLE


SELECT ANY TABLE
CREATE ANY TABLE

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

26

Introduccin a Oracle 10g: SQL Fundamentals II

Creacin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Creacin de un Usuario

Para crear el usuario, el DBA ejecuta la sentencia CREATE USER. El usuario no tiene ningn
privilegio en ese momento. Por tanto, el DBA puede otorgar privilegios a ese usuario. Estos
privilegios determinan lo que el usuario podr hacer en el nivel de base de datos.
La diapositiva muestra la sintaxis resumida para crear un usuario.

En la sintaxis:
user
es el nombre del usuario que se va a crear
Password
especifica que el usuario se debe conectar con esta contrasea
Para obtener ms informacin, consulte Oracle Database 10g SQL Reference, GRANT y
CREATE USER.

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

27

Introduccin a Oracle 10g: SQL Fundamentals II

Privilegios del Sistema de Usuario

Una vez creado el usuario, el DBA le puede otorgar


privilegios del sistema especficos.
GRANT privilege [, privilege...]
TO user [, user| role, PUBLIC...];

Un desarrollador de aplicaciones, por ejemplo,


puede tener los siguientes privilegios del sistema:
CREATE
CREATE
CREATE
CREATE
CREATE

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

SESSION
TABLE
SEQUENCE
VIEW
PROCEDURE

Privilegios de Usuario Tpicos


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

Operaciones Autorizadas

CREATE SESSION

Conectarse a la base de datos

CREATE TABLE

Crear tablas en el esquema del usuario

CREATE SEQUENCE

Crear una secuencia en el esquema del usuario

CREATE VIEW

Crear una vista en el esquema del usuario

CREATE PROCEDURE

Crear un procedimiento, una funcin o un paquete en el esquema


del usuario

En la sintaxis:
privilege
user
|role|PUBLIC

es el privilegio del sistema que se va a otorgar


es el nombre del usuario, el nombre del rol o, en el caso
de PUBLIC, designa que el privilegio se otorga a todos
los usuarios
Nota: Los privilegios del sistema actuales se pueden encontrar en la vista de diccionario
SESSION_PRIVS.

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

28

Introduccin a Oracle 10g: SQL Fundamentals II

Otorgamiento de Privilegios del Sistema


El DBA puede otorgar privilegios del sistema especficos
a un usuario.
GRANT

create session, create table,


create sequence, create view
TO
scott;
Grant succeeded.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Otorgamiento de Privilegios del Sistema

El DBA utiliza la sentencia GRANT para asignar privilegios del sistema al usuario. Una vez
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
sesiones, tablas, secuencias y vistas.

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

29

Introduccin a Oracle 10g: SQL Fundamentals II

Qu es un Rol?

Usuarios

Gestor

Privilegios

Asignacin de privilegios
con un rol

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Asignacin de privilegios
sin un rol

Qu es un Rol?
Un rol es un grupo especificado de privilegios relacionados que se pueden otorgar al usuario.
Este mtodo facilita la revocacin y el mantenimiento de privilegios.
Un usuario puede tener acceso a varios roles y se puede asignar a varios usuarios el mismo
rol. Los roles se suelen crear para una aplicacin de base de datos.

Creacin y Asignacin de un Rol


En primer lugar, el DBA debe crear el rol. Despus, el DBA puede asignar privilegios al rol y
asignar el rol a usuarios.
Sintaxis
CREATE

ROLE role;

En la sintaxis:
role
es el nombre del rol que se va a crear
Una vez creado el rol, el DBA puede utilizar la sentencia GRANT para asignar el rol a
usuarios, del mismo modo que puede asignar privilegios al rol.

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

30

Introduccin a Oracle 10g: SQL Fundamentals II

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


Grant succeeded.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Creacin de un Rol
El ejemplo de la diapositiva crea un rol de gestor y, a continuacin, permite a los gestores
crear tablas y vistas. Otorga despus a De Haan y a Kochhar el rol de gestores. De Haan y
Kochhar ya pueden crear tablas y vistas.
Si se otorga a los usuarios varios roles, reciben todos los privilegios asociados a esos roles.

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

31

Introduccin a Oracle 10g: SQL Fundamentals II

Cambio de Contraseas

El DBA crea la cuenta de usuario e inicializa la


contrasea.
La contrasea se puede cambiar mediante la
sentencia ALTER USER.

ALTER USER HR
IDENTIFIED BY employ;
User altered.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Cambio de Contraseas

El DBA crea una cuenta e inicializa una contrasea para cada usuario. La contrasea se puede
cambiar mediante la sentencia ALTER USER.
Sintaxis

ALTER USER user IDENTIFIED BY password;

En la sintaxis:
user
password

es el nombre del usuario


especifica la nueva contrasea

Aunque esta sentencia se puede utilizar para cambiar la contrasea, hay muchas otras
opciones. Debe tener el privilegio ALTER USER para cambiar cualquier otra opcin.

Para obtener ms informacin, consulte el manual Oracle Database 10g SQL Reference.
Nota: SQL*Plus dispone de un comando PASSWORD (PASSW) que se puede utilizar para
cambiar la contrasea de un usuario cuando ste est conectado. Este comando no est
disponible en iSQL*Plus.

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

32

Introduccin a Oracle 10g: SQL Fundamentals II

Privilegios de Objeto
Privilegios
de Objeto

Tabla

ALTER

DELETE

Vista

Secuencia

Procedimiento

EXECUTE

INSERT

REFERENCES

SELECT

UPDATE

INDEX

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Privilegios de Objeto
Un privilegio de objeto es un privilegio o un derecho a realizar una accin determinada en
una tabla, una vista, una secuencia o un procedimiento especficos. Cada objeto dispone de un
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
secuencia son SELECT y ALTER. UPDATE, REFERENCES e INSERT se pueden restringir
mediante la especificacin 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
otorgar el privilegio SELECT nicamente en la vista. Un privilegio otorgado en un sinnimo
se convierte en un privilegio en la tabla base a la que haga referencia el sinnimo.

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

33

Introduccin a Oracle 10g: SQL Fundamentals II

Privilegios de Objeto

Los privilegios de objeto varan de un objeto a otro.


Un propietario tiene todos los privilegios en el objeto.
Un propietario puede otorgar privilegios especficos
en el objeto del que es propietario.
GRANT
object_priv [(columns)]
ON
object
TO
{user|role|PUBLIC}
[WITH GRANT OPTION];

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Otorgamiento de Privilegios de Objeto


Existen diferentes privilegios de objeto disponibles para diferentes tipos de objetos de
esquema. Un usuario tiene automticamente todos los privilegios de objeto para objetos de
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
usuario o rol. Si el otorgamiento incluye WITH GRANT OPTION, la persona a la que se
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
a otros usuarios.
En la sintaxis:
object_priv
es un privilegio de objeto que se va a otorgar
ALL
especifica todos los privilegios de objeto
columns
especifica la columna de una tabla o de una vista en
la que se otorgan los privilegios
ON object
es el objeto en el que se otorgan privilegios
TO
identifica a quin se otorga el privilegio
PUBLIC
otorga privilegios de objeto a todos los usuarios
WITH GRANT OPTION
permite a la persona a la que se otorga el privilegio
otorgar privilegios de objeto a otros usuarios y roles

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

34

Introduccin 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


especficas para usuarios y roles.

GRANT update (department_name, location_id)


ON
departments
TO
scott, manager;
Grant succeeded.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Instrucciones
Para otorgar privilegios en un objeto, ste debe estar en el esquema o le deben haber
otorgado los privilegios de objeto con la clusula WITH GRANT OPTION.
Un propietario de objeto puede otorgar cualquier privilegio de objeto a cualquier otro
usuario o rol de la base de datos.
El propietario de un objeto adquiere automticamente todos los privilegios de objeto en
ese objeto.
El primer ejemplo de la diapositiva otorga a los usuarios Sue y Rich el privilegio para
consultar la tabla EMPLOYEES. El segundo ejemplo otorga privilegios UPDATE en columnas
especficas de la tabla DEPARTMENTS a Scott y al rol de gestor.
Si Sue o Rich quieren utilizar ahora una sentencia SELECT para obtener datos de la tabla
EMPLOYEES, la sintaxis que deben utilizar es:
SELECT

* FROM HR.employees;

De forma alternativa, pueden crear un sinnimo para la tabla y emitir una sentencia SELECT
desde el sinnimo:
CREATE SYNONYM emp FOR HR.employees;
SELECT * FROM emp;

Nota: Los DBA suelen asignar privilegios del sistema; cualquier usuario propietario de un
objeto puede otorgar privilegios de objeto.

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

35

Introduccin 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
ON
alice.departments
TO
PUBLIC;
Grant succeeded.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Palabras Clave WITH GRANT OPTION


La persona a la que se otorga un privilegio que se otorgue con la clusula WITH GRANT
OPTION lo puede transferir a otros usuarios y roles. Los privilegios de objeto otorgados con
la clusula WITH GRANT OPTION se revocan si se revoca el privilegio del otorgante.
El ejemplo de la diapositiva otorga al usuario Scott acceso a la tabla DEPARTMENTS con los
privilegios para consultar la tabla y agregarle filas. El ejemplo muestra tambin que Scott
puede otorgar a otros estos privilegios.
Palabra Clave PUBLIC

Un propietario de la tabla puede otorgar acceso a todos los usuarios mediante la palabra clave
PUBLIC.
El segundo ejemplo permite a todos los usuarios del sistema consultar datos de la tabla
DEPARTMENTS de Alice.

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

36

Introduccin a Oracle 10g: SQL Fundamentals II

Confirmacin de Privilegios Otorgados


Vista del Diccionario de Datos Descripcin
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


en columnas especficas

ROLE_SYS_PRIVS

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

USER_SYS_PRIVS

Privilegios del sistema otorgados al usuario

Confirmacin de Privilegios Otorgados


Si intenta realizar una operacin no autorizada, como suprimir una fila de una tabla para la
que no tiene el privilegio DELETE, Oracle Server no permite que la operacin se realice.

Si recibe el mensaje de error de Oracle Server table or view does not exist, es porque ha
realizado una de estas acciones:
Ha especificado una tabla o una vista que no existen
Ha intentado realizar una operacin en una tabla o en una vista para la que no tiene el
privilegio adecuado
Puede acceder al diccionario de datos para ver los privilegios de los que dispone. El grfico
de la diapositiva describe varias vistas de diccionario de datos.

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

37

Introduccin a Oracle 10g: SQL Fundamentals II

Revocacin de Privilegios de Objeto

Utilice la sentencia REVOKE para revocar privilegios


otorgados a otros usuarios.
Tambin se revocan los privilegios otorgados a
otros mediante la clusula WITH GRANT OPTION.
REVOKE {privilege [, privilege...]|ALL}
ON
object
FROM
{user[, user...]|role|PUBLIC}
[CASCADE CONSTRAINTS];

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Revocacin de Privilegios de Objeto

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


utilizar la sentencia REVOKE, los privilegios que especifique se revocarn de los usuarios que
especifique y de cualquier otro usuario a quien el usuario revocado hubiera otorgado esos
privilegios.
En la sintaxis:

CASCADE es necesario para eliminar cualquier restriccin de integridad referencial realizada


en el objeto CONSTRAINTS mediante el privilegio REFERENCES
Para obtener ms informacin, consulte Oracle Database 10g SQL Reference.

Nota: Si revoca los privilegios de un usuario que debe dejar la compaa, debe volver a
otorgar cualquier privilegio que este usuario hubiera otorgado a otros usuarios. Si borra la
cuenta de usuario sin revocarle los privilegios, esta accin no afectar a los privilegios del
sistema otorgados por este usuario a otros usuarios.

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

38

Introduccin a Oracle 10g: SQL Fundamentals II

Revocacin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Revocacin de Privilegios de Objeto (continuacin)


El ejemplo de la diapositiva revoca los privilegios SELECT e INSERT otorgados al usuario
Scott en la tabla DEPARTMENTS.
Nota: Si se otorga un privilegio a un usuario con la clusula WITH GRANT OPTION, ese
usuario tambin puede otorgar el privilegio con la clusula WITH GRANT OPTION, de
forma que es posible una larga cadena de personas a las que se otorgan privilegios, aunque no
se permiten otorgamientos circulares. Si el propietario revoca un privilegio de un usuario que
otorg dicho privilegio a otros usuarios, se revocarn en cascada todos los privilegios
otorgados.
Por ejemplo, si el usuario A otorga un privilegio SELECT en una tabla al usuario B con la
clusula WITH GRANT OPTION, el usuario B tambin puede otorgar al usuario C el
privilegio SELECT con la clusula WITH GRANT OPTION y el usuario C puede otorgar al
usuario D el privilegio SELECT. Si el usuario A revoca los privilegios del usuario B, los
privilegios otorgados a los usuarios C y D tambin se revocan.

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

39

Introduccin a Oracle 10g: SQL Fundamentals II

Resumen
En esta leccin, ha obtenido informacin acerca de
sentencias que controlan el acceso a la base de datos
y a objetos de base de datos.
Accin

CREATE USER

Crea un usuario (la suele realizar un DBA)

GRANT

Otorga a otros usuarios privilegios para


acceder a objetos

CREATE ROLE

Crea una recopilacin de privilegios (la suele


realizar un DBA)

Sentencia

Cambia la contrasea de un usuario

REVOKE

Elimina privilegios en un objeto de usuarios

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

ALTER USER

Resumen
Los DBA establecen la seguridad de base de datos inicial para los usuarios asignndoles
privilegios.
El DBA crea usuarios que deben tener una contrasea. El DBA es responsable adems
de establecer los privilegios iniciales del sistema para un usuario.
Cuando el usuario ha creado un objeto, puede transferir cualquiera de los privilegios de
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
recopilacin de privilegios del sistema o de objeto a varios usuarios. Los roles facilitan
el mantenimiento del otorgamiento y de la revocacin de privilegios.
Los usuarios pueden cambiar la contrasea mediante la sentencia ALTER USER.
Puede eliminar privilegios otorgados a otros usuarios mediante la sentencia REVOKE.
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.
Con los enlaces de base de datos, puede acceder a datos en bases de datos remotas. No
se pueden otorgar privilegios en objetos remotos.

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

40

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 1: Visin General


Esta prctica cubre los temas siguientes:
Otorgamiento a otros usuarios de privilegios de
su tabla
Modificacin de la tabla de otro usuario a travs
de los privilegios que se le han otorgado
Creacin de sinnimos
Consulta de las vistas de diccionario de datos
relacionadas con privilegios

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Prctica 1: Visin General

Forme un equipo con otros alumnos para este ejercicio sobre el control del acceso a los objetos
de base de datos.

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

41

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 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 direccin URL en formato http://machinename:5561/isqlplus/ y utilice
la cuenta oraxx y la contrasea 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, quin 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 debera utilizar para facilitar el trabajo?
_____________________________________________________________________

5. Qu comando se utiliza para cambiar la contrasea?


_____________________________________________________________________

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

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


otorgue acceso de consulta a su tabla DEPARTMENTS.
7. Consulte todas las filas de la tabla DEPARTMENTS.

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

42

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 1 (continuacin)
8. Agregue una nueva fila a su tabla DEPARTMENTS. El equipo 1 debe agregar Education
como nmero de departamento 500. El equipo 2 debe agregar Human Resources como
nmero de departamento 510. Consulte la tabla del otro equipo.
9. Cree un sinnimo para la tabla DEPARTMENTS del otro equipo.
10. Consulte todas las filas de la tabla DEPARTMENTS del otro equipo mediante el sinnimo.
Team 1 SELECT statement results:

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Team 2 SELECT statement results:

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

43

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 1 (continuacin)
11. Consulte el diccionario de datos USER_TABLES para ver informacin sobre las tablas
que son de su propiedad.

12. Consulte la vista de diccionario de datos ALL_TABLES para ver informacin 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
continuacin.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

13. Revoque el privilegio SELECT del otro equipo.

14. Elimine la fila que insert en la tabla DEPARTMENTS en el paso 8 y guarde los cambios.

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

44

Introduccin a Oracle 10g: SQL Fundamentals II

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 1-24

45

Introduccin a Oracle 10g: SQL Fundamentals II

Gestin de Objetos de Esquema

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
46

Introduccin a Oracle 10g: SQL Fundamentals II

Objetivos

Al finalizar esta leccin, debera 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

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Objetivos
Esta leccin contiene informacin sobre la creacin de ndices y restricciones, as como sobre
la modificacin de objetos existentes. Tambin recibir informacin sobre tablas externas y la
provisin para asignar un nombre el ndice en el momento de la creacin de una restriccin de
clave primaria.

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

47

Introduccin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Sentencia ALTER TABLE


Despus de crear una tabla, puede que necesite cambiar la estructura de tabla porque ha
omitido una columna, se debe cambiar la definicin de columna o debe eliminar columnas.
Puede hacerlo mediante la sentencia ALTER TABLE.

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

48

Introduccin 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]...);

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

ALTER TABLE table


DROP
(column);

Sentencia ALTER TABLE (continuacin)


Puede agregar columnas a una tabla, modificar columnas y borrar columnas de una tabla
mediante la sentencia ALTER TABLE.
En la sintaxis:
table
es el nombre de la tabla
ADD|MODIFY|DROP es el tipo de modificacin
column
es el nombre de la nueva columna
datatype
es el tipo de datos y la longitud de la nueva columna
DEFAULT expr
especifica el valor por defecto para una nueva columna

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

49

Introduccin a Oracle 10g: SQL Fundamentals II

Adicin de una Columna

Se utiliza la clusula ADD para agregar columnas.


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

La nueva columna se convierte en la ltima.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Instrucciones para Agregar una Columna


Puede agregar o modificar columnas.
No puede especificar dnde aparecer la columna. La nueva columna se convierte en la
ltima.
El ejemplo de la diapositiva agrega una columna denominada JOB_ID a la tabla DEPT80.
La columna JOB_ID se convierte en la ltima columna de la tabla.
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
tabla que contiene datos en otras columnas. Slo puede agregar una columna NOT NULL a
una tabla vaca.

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

50

Introduccin a Oracle 10g: SQL Fundamentals II

Modificacin de una Columna

Puede cambiar el tipo de datos de una columna,


su tamao y el valor por defecto.
ALTER TABLE dept80
MODIFY
(last_name VARCHAR2(30));
Table altered.

Un cambio en el valor por defecto slo afecta a las


siguientes inserciones en la tabla.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Modificacin de una Columna


Puede modificar una definicin de columna mediante la sentencia ALTER TABLE con la
clusula MODIFY. La modificacin de columnas puede incluir cambios en el tipo de datos de
una columna, su tamao y el valor por defecto.
Instrucciones
Puede aumentar el ancho o la precisin de una columna numrica.
Puede aumentar el ancho de las columnas numricas o de caracteres.
Puede reducir el ancho de una columna si:
- La columna contiene slo valores nulos
- La tabla no tiene ninguna fila
- La reduccin en el ancho de columna no es menor que los valores existentes en esa
columna
Puede cambiar el tipo de datos si la columna contiene slo valores nulos. La excepcin
son las conversiones CHAR a VARCHAR2, que se pueden realizar con datos en las
columnas.
Puede convertir una columna CHAR al tipo de datos VARCHAR2 o convertir una
columna VARCHAR2 al tipo de datos CHAR slo si la columna contiene valores nulos o
si no cambia el tamao.
Un cambio en el valor por defecto de una columna slo afecta a las siguientes
inserciones en la tabla.
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-6

51

Introduccin a Oracle 10g: SQL Fundamentals II

Borrado de una Columna


Utilice la clusula DROP COLUMN para borrar las
columnas de la tabla que ya no necesite.
ALTER TABLE dept80
DROP COLUMN job_id;
Table altered.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Borrado de una Columna


Puede borrar una columna de una tabla mediante la sentencia ALTER TABLE con la clusula
DROP COLUMN.
Instrucciones
La columna puede contener o no datos.
Mediante la sentencia ALTER TABLE, slo se puede borrar una columna cada vez.
Debe quedar al menos una columna en la tabla despus de la modificacin.
Una vez borrada una columna, no se puede recuperar.
Una columna no se puede borrar si forma parte de una restriccin o de una clave de
ndice a menos que se agregue la opcin de cascada.
El borrado de una columna puede tardar si la columna tiene muchos valores. En este
caso, es posible que sea mejor definirla como no utilizada y borrarla cuando haya menos
usuarios en el sistema para evitar bloqueos extendidos.
Nota: Hay columnas que no se pueden borrar nunca, como las que forman parte de la clave de
particin de una tabla particionada o las columnas que forman parte de la clave primaria de
una tabla organizada por ndice.

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

52

Introduccin a Oracle 10g: SQL Fundamentals II

Opcin SET UNUSED

Utilice la opcin SET UNUSED para marcar una o ms


columnas como no utilizadas.
Utilice la opcin DROP UNUSED COLUMNS para eliminar
las columnas marcadas como no utilizadas.
ALTER
SET
OR
ALTER
SET

TABLE <table_name>
UNUSED(<column_name>);
TABLE <table_name>
UNUSED COLUMN <column_name>;

ALTER TABLE <table_name>


DROP UNUSED COLUMNS;

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Opcin SET UNUSED


La opcin SET UNUSED marca una o ms columnas como no utilizadas para que se puedan
borrar cuando la demanda de recursos del sistema sea menor. La especificacin de esta
clusula 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
es ms rpido que si ejecuta la clusula DROP. Las columnas no utilizadas se tratan como si
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
consulta SELECT * no recuperar datos de columnas no utilizadas. Adems los nombres y
los tipos de columnas marcadas como no utilizadas no se mostrarn durante una sentencia
DESCRIBE y puede agregar una nueva columna a la tabla con el mismo nombre que una
columna no utilizada. La informacin SET UNUSED se almacena en la vista de diccionario
USER_UNUSED_COL_TABS.
Nota: Las instrucciones para definir una columna como UNUSED son parecidas a las que se
aplican al borrado de una columna.

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

53

Introduccin a Oracle 10g: SQL Fundamentals II

Opcin 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 ningn error.
ALTER TABLE dept80
SET
UNUSED (last_name);
Table altered.
ALTER TABLE dept80
DROP UNUSED COLUMNS;
Table altered.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-9

54

Introduccin a Oracle 10g: SQL Fundamentals II

Adicin de una Sintaxis de Restriccin


Utilice la sentencia ALTER TABLE para:
Agregar o borrar una restriccin, pero sin modificar
su estructura
Activar o desactivar restricciones
Agregar una restriccin NOT NULL mediante la
clusula MODIFY

ALTER TABLE <table_name>


ADD [CONSTRAINT <constraint_name>]
type (<column_name>);

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Adicin de una Restriccin


Puede agregar una restriccin para tablas existentes mediante la sentencia ALTER TABLE
con la clusula ADD.
En la sintaxis:
table
es el nombre de la tabla
constraint es el nombre de la restriccin
type
es el tipo de restriccin
column
es el nombre de la columna a la que afecta la restriccin
La sintaxis de nombre de restriccin es opcional, aunque se recomienda. Si no asigna nombres
a las restricciones, el sistema los generar.
Instrucciones
Puede agregar, borrar, activar o desactivar una restriccin, pero no puede modificar su
estructura.
Puede agregar una restriccin NOT NULL a una columna existente mediante la clusula
MODIFY de la sentencia ALTER TABLE.
Nota: Puede definir una columna NOT NULL slo si la tabla est vaca o si la columna tiene
un valor para todas las filas.

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

55

Introduccin a Oracle 10g: SQL Fundamentals II

Adicin de una Restriccin


Agregue una restriccin FOREIGN KEY a la tabla EMP2
que indique que ya debe existir un supervisor como
empleado vlido 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)
REFERENCES emp2(employee_id);
Table altered.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Adicin de una Restriccin (continuacin)


El primer ejemplo de la diapositiva modifica la tabla EMP2 para agregar una restriccin
PRIMARY KEY en la columna EMPLOYEE_ID. Observe que, como no se proporciona un
nombre de restriccin, Oracle Server lo especifica automticamente. El segundo ejemplo de la
diapositiva crea una restriccin FOREIGN KEY en la tabla EMP2. La restriccin asegura que
existe un supervisor como empleado vlido en la tabla EMP2.

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

56

Introduccin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

ON DELETE CASCADE
La accin 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
suprimen los datos de la clave principal, tambin se suprimen todas las filas de la tabla
secundaria que dependen de los valores de la clave principal suprimida. Para especificar esta
accin referencial, incluya la opcin ON DELETE CASCADE en la definicin de la
restriccin FOREIGN KEY.

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

57

Introduccin a Oracle 10g: SQL Fundamentals II

Diferir Restricciones
Las restricciones pueden tener estos atributos:
DEFERRABLE o NOT DEFERRABLE
INITIALLY DEFERRED o INITIALLY IMMEDIATE
ALTER TABLE dept2
ADD CONSTRAINT dept2_id_pk
PRIMARY KEY (department_id)
DEFERRABLE INITIALLY DEFERRED

Diferir restricciones en el
momento de la creacin

SET CONSTRAINTS dept2_id_pk IMMEDIATE

Cambio de todas las


restricciones para una sesin

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

ALTER SESSION
SET CONSTRAINTS= IMMEDIATE

Cambio de un atributo
especfico de restriccin

Diferir Restricciones
Se puede diferir la comprobacin de validez de las restricciones hasta el final de la transaccin.
Una restriccin es diferida si el sistema comprueba que se satisface nicamente en el momento
de la validacin. Si se viola una restriccin diferida, la validacin provoca que se haga rollback
de la transaccin. Si una restriccin es inmediata (no diferida), se comprueba al final de cada
sentencia. Si se viola, se hace rollback de la sentencia de forma inmediata. Si una restriccin
provoca una accin (por ejemplo, DELETE CASCADE), esa accin se toma siempre como
parte de la sentencia que la provoc, independientemente de que la restriccin sea diferida o
inmediata. Utilice la restriccin SET CONSTRAINTS para especificar, para una transaccin en
particular, si se comprueban las restricciones diferibles despus de cada sentencia DML o en el
momento de la validacin de la transaccin. Para crear restricciones diferibles, debe crear un
ndice no nico para esa restriccin.
Puede definir restricciones como diferibles o no diferibles y como inicialmente diferidas o
inicialmente inmediatas. Estos atributos pueden ser diferentes para cada restriccin.
Supuesto de uso: La poltica de la compaa dicta que el nmero de departamento 40 se
debera 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
diferibles e inicialmente diferidas. Actualice la informacin de departamentos y empleados, y
todas las filas se validarn en el momento de la validacin.

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

58

Introduccin a Oracle 10g: SQL Fundamentals II

Borrado de una Restriccin

Elimine la restriccin de supervisor de la tabla EMP2.


ALTER TABLE emp2
DROP CONSTRAINT emp_mgr_fk;
Table altered.

Elimine la restriccin PRIMARY KEY en la tabla DEPT2


y borre la restriccin FOREIGN KEY asociada en la
columna EMP2.DEPARTMENT_ID.

ALTER TABLE dept2


DROP PRIMARY KEY CASCADE;
Table altered.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Borrado de una Restriccin


Para borrar una restriccin, puede identificar el nombre de restriccin desde las vistas de
diccionario de datos USER_CONSTRAINTS y USER_CONS_COLUMNS. Utilice a
continuacin la sentencia ALTER TABLE con la clusula DROP. La opcin CASCADE de la
clusula DROP provoca que se borre tambin cualquier restriccin dependiente.
Sintaxis

ALTER TABLE table


DROP PRIMARY KEY | UNIQUE (column) |
CONSTRAINT
constraint [CASCADE];
En la sintaxis:
table
es el nombre de la tabla
column
es el nombre de la columna a la que afecta la restriccin
constraint
es el nombre de la restriccin
Al borrar una restriccin de integridad, Oracle Server ya no fuerza esa restriccin y ya no est
disponible en el diccionario de datos.

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

59

Introduccin a Oracle 10g: SQL Fundamentals II

Desactivacin de Restricciones

Ejecute la clusula DISABLE de la sentencia ALTER


TABLE para desactivar una restriccin de integridad.
Aplique la opcin CASCADE para desactivar las
restricciones de integridad dependientes.
ALTER TABLE emp2
DISABLE CONSTRAINT emp_dt_fk;
Table altered.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Desactivacin de una Restriccin


Puede desactivar una restriccin sin borrarla ni volverla a crear mediante la sentencia ALTER
TABLE con la clusula DISABLE.
Sintaxis
ALTER
TABLE
table
DISABLE CONSTRAINT constraint [CASCADE];
En la sintaxis:
table
es el nombre de la tabla
constraint es el nombre de la restriccin
Instrucciones
Puede utilizar la clusula DISABLE en las sentencias CREATE TABLE y
ALTER TABLE.
La clusula CASCADE desactiva las restricciones de integridad dependientes.
La desactivacin de una restriccin de clave primaria o nica elimina el ndice nico.

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

60

Introduccin a Oracle 10g: SQL Fundamentals II

Activacin de Restricciones

Active una restriccin de integridad actualmente


desactivada en la definicin de tabla mediante la
clusula ENABLE.
ALTER TABLE
emp2
ENABLE CONSTRAINT emp_dt_fk;
Table altered.

Se crea automticamente un ndice UNIQUE si


activa una restriccin UNIQUE o PRIMARY KEY.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Activacin de una Restriccin


Puede activar una restriccin sin borrarla ni volverla a crear mediante la sentencia ALTER
TABLE con la clusula ENABLE.
Sintaxis
ALTER
TABLE
table
ENABLE CONSTRAINT constraint;
En la sintaxis:
table
es el nombre de la tabla
constraint es el nombre de la restriccin
Instrucciones
Si activa una restriccin, esa restriccin se aplica a todos los datos de la tabla. Todos los
datos de la tabla deben cumplir con la restriccin.
Si activa una restriccin UNIQUE o PRIMARY KEY, se crea automticamente un ndice
UNIQUE o PRIMARY KEY. Si ya existe un ndice, lo pueden utilizar estas claves.
Puede utilizar la clusula ENABLE en las sentencias CREATE TABLE y ALTER TABLE.

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

61

Introduccin a Oracle 10g: SQL Fundamentals II

Activacin de una Restriccin (continuacin)


Instrucciones (continuacin)
La activacin de una restriccin de clave primaria que se hubiese desactivado con la
opcin CASCADE no activa las claves ajenas que sean dependientes de la clave
primaria.
Para activar una restriccin UNIQUE o PRIMARY KEY, debe disponer de los
privilegios necesarios para crear un ndice en la tabla.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-17

62

Introduccin a Oracle 10g: SQL Fundamentals II

Restricciones en Cascada

La clusula CASCADE CONSTRAINTS se utiliza


junto con la clusula DROP COLUMN.
La clusula CASCADE CONSTRAINTS borra todas
las restricciones de integridad referencial que
hacen referencia a las claves nica y primaria
definidas en las columnas borradas.
La clusula CASCADE CONSTRAINTS tambin borra
todas las restricciones de varias columnas
definidas en las columnas borradas.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Restricciones en Cascada
Esta sentencia ilustra el uso de la clusula CASCADE CONSTRAINTS. Suponga que se crea la
tabla TEST1 de este modo:
CREATE TABLE test1 (
pk NUMBER PRIMARY KEY,
fk NUMBER,
col1 NUMBER,
col2 NUMBER,
CONSTRAINT fk_constraint FOREIGN KEY (fk) REFERENCES test1,
CONSTRAINT ck1 CHECK (pk > 0 and col1 > 0),
CONSTRAINT ck2 CHECK (col2 > 0));

Se devuelve un error para las siguientes sentencias:


ALTER TABLE test1 DROP (pk);
pk es una clave principal.
ALTER TABLE test1 DROP (col1); la restriccin de varias columnas ck1
hace referencia a col1.

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

63

Introduccin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Restricciones en Cascada (continuacin)


Al ejecutar la siguiente sentencia, se borra la columna EMPLOYEE_ID, la restriccin de clave
primaria y las restricciones de clave ajena que hacen referencia a la restriccin de clave
primaria para la tabla EMP2:
ALTER TABLE emp2 DROP COLUMN employee_id CASCADE CONSTRAINTS;

Si se borran tambin todas las columnas a las que hacen referencia las restricciones definidas en
las columnas borradas, CASCADE CONSTRAINTS no es necesario. Por ejemplo, suponiendo
que ninguna otra restriccin referencial de otras tablas hace referencia a la columna PK, es
vlido ejecutar la siguiente sentencia sin la clusula CASCADE CONSTRAINTS para la tabla
TEST1 creada en la pgina anterior:
ALTER TABLE test1 DROP (pk, fk, col1);

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

64

Introduccin a Oracle 10g: SQL Fundamentals II

Visin General de ndices


Los ndices se crean:
Automticamente
Creacin de PRIMARY KEY
Creacin de UNIQUE KEY

Manualmente
Sentencia CREATE INDEX
Sentencia CREATE TABLE

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Visin General de ndices


Se pueden crear dos tipos de ndices. Un tipo es el ndice nico. Oracle Server crea
automticamente un ndice nico si se define una columna o un grupo de columnas en una
tabla para tener una restriccin PRIMARY KEY o UNIQUE. El nombre del ndice es el
nombre que se asigna a la restriccin.
El otro tipo de ndice es el no nico y lo puede crear un usuario. Por ejemplo, puede crear un
ndice de columna FOREIGN KEY que se utilizar en uniones para mejorar la velocidad de
recuperacin.
Puede crear un ndice en una o ms columnas mediante la emisin de la sentencia
CREATE INDEX.
Para obtener ms informacin, consulte Oracle Database 10g SQL Reference.

Nota: Puede crear manualmente un ndice nico, pero se recomienda que cree una restriccin
nica, lo que crea implcitamente un ndice nico.

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

65

Introduccin 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
WHERE TABLE_NAME = 'NEW_EMP';

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
.

CREATE INDEX con Sentencia CREATE TABLE


En el ejemplo de la diapositiva, se utiliza la clusula CREATE INDEX con la sentencia
CREATE TABLE para crear un ndice de clave primaria explcitamente. Puede asignar
nombres a los ndices en el momento de la creacin de la clave primaria para que sean
diferentes al nombre de la restriccin PRIMARY KEY. El siguiente ejemplo muestra el
comportamiento de la base de datos si no se asigna un nombre al ndice explcitamente
CREATE TABLE EMP_UNNAMED_INDEX
(employee_id NUMBER(6) PRIMARY KEY ,
first_name VARCHAR2(20),
last_name VARCHAR2(25));
Table created.
SELECT INDEX_NAME, TABLE_NAME
FROM
USER_INDEXES
WHERE TABLE_NAME = 'EMP_UNNAMED_INDEX';

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

66

Introduccin a Oracle 10g: SQL Fundamentals II

CREATE INDEX con Sentencia CREATE TABLE (continuacin)


Observe que Oracle Server asigna un nombre genrico al ndice que se crea para la columna
PRIMARY KEY.
Tambin puede utilizar un ndice existente para la columna PRIMARY KEY, por ejemplo
cuando espera una carga grande de datos y desea acelerar la operacin. Le conviene
desactivar las restricciones durante la carga y activarlas despus, 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 continuacin la columna PRIMARY KEY y especificar que debera
utilizar el ndice existente. Los siguientes ejemplos ilustran el proceso:
Paso 1: Creacin de la Tabla
CREATE TABLE NEW_EMP2
( employee_id NUMBER(6)
first_name VARCHAR2(20),
last_name
VARCHAR2(25)
);

Paso 2: Creacin del ndice


CREATE INDEX emp_id_idx2 ON
new_emp2(employee_id);

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Paso 3: Creacin de la Clave Primaria


ALTER TABLE new_emp2 ADD PRIMARY KEY
emp_id_idx2;

(employee_id) USING INDEX

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

67

Introduccin a Oracle 10g: SQL Fundamentals II

ndices Basados en Funciones

Un ndice basado en funciones se basa en


expresiones.
La expresin 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.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

SELECT *
FROM
dept2
WHERE UPPER(department_name) = 'SALES';

ndices Basados en Funciones


Los ndices basados en funciones definidos con las palabras clave UPPER(column_name)
o LOWER(column_name) permiten bsquedas no sensibles a maysculas/minsculas. Por
ejemplo, el siguiente ndice:
CREATE INDEX upper_last_name_idx ON emp2 (UPPER(last_name));
facilita el procesamiento de consultas como:

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


Oracle Server utiliza el ndice nicamente si esa funcin en particular se utiliza en una
consulta. Por ejemplo, la siguiente sentencia puede utilizar el ndice, pero sin la clusula
WHERE Oracle Server puede realizar una exploracin de tablas completas:
SELECT
*
FROM
employees
WHERE
UPPER (last_name) IS NOT NULL
ORDER BY UPPER (last_name);
Nota: Se debe definir el parmetro de inicializacin QUERY_REWRITE_ENABLED en TRUE
para que se utilice un ndice basado en funciones.
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

Introduccin a Oracle 10g: SQL Fundamentals II

Eliminacin 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


ndice o tener el privilegio DROP ANY INDEX.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Eliminacin de un ndice
Los ndices no se pueden modificar. Para cambiar un ndice, debe borrarlo y volverlo a crear.
Para eliminar una definicin de ndice del diccionario de datos, emita la sentencia DROP
INDEX. Para borrar un ndice, debe ser el propietario del ndice o tener el privilegio DROP
ANY INDEX.
En la sintaxis:
index
es el nombre del ndice
Nota: Si borra una tabla, los ndices y las restricciones se borran automticamente, pero las
vistas y las secuencias permanecen.

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

69

Introduccin a Oracle 10g: SQL Fundamentals II

DROP TABLE PURGE

DROP TABLE dept80 PURGE;

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

DROP TABLE PURGE


La base de datos Oracle 10g presenta una nueva funcin para borrar tablas. Al borrar una
tabla, la base de datos no libera inmediatamente el espacio asociado a la tabla. En su lugar, la
base de datos cambia el nombre de la tabla y la coloca en una papelera de reciclaje, de donde
se podr recuperar despus con la sentencia FLASHBACK TABLE si se da cuenta de que
borr la tabla por error. Si desea liberar de forma inmediata el espacio asociado a la tabla en
el momento de emitir la sentencia DROP TABLE, incluya la clusula PURGE como se
muestra en la sentencia de la diapositiva.
Especifique PURGE slo si desea borrar la tabla y liberar el espacio asociado a ella en un solo
paso. Si especifica PURGE, la base de datos no coloca la tabla y sus objetos dependientes en
la papelera de reciclaje.
La utilizacin de esta clusula es equivalente a borrar primero la tabla y purgarla despus de
la papelera de reciclaje. Esta clusula le ahorra un paso en el proceso. Proporciona tambin
una seguridad mejorada si desea evitar que aparezca material sensible en la papelera de
reciclaje.
Nota: No puede hacer rollback de una sentencia DROP TABLE con la clusula PURGE, ni
tampoco puede recuperar la tabla si la ha borrado con la clusula PURGE. Esta funcin no
estaba disponible en versiones anteriores.

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

70

Introduccin a Oracle 10g: SQL Fundamentals II

Sentencia FLASHBACK TABLE

Herramienta de reparacin para modificaciones


accidentales de tabla
Restaura una tabla a un punto anterior en el tiempo
Ventajas: Facilidad de uso, disponibilidad y
ejecucin rpida
Se realiza in situ

Sintaxis:

FLASHBACK TABLE[schema.]table[,
[ schema.]table ]...
TO { TIMESTAMP | SCN } expr
[ { ENABLE | DISABLE } TRIGGERS ];

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Sentencia FLASHBACK TABLE


Utilidad de Reparacin de Autoservicio
La base de datos Oracle 10g proporciona un nuevo comando DDL de SQL, FLASHBACK
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
es una herramienta de reparacin de autoservicio para restaurar datos de una tabla junto con
los atributos asociados como, por ejemplo, ndices o vistas. Esto se consigue cuando la base
de datos est online haciendo rollback slo de los cambios posteriores en la tabla en cuestin.
Si se compara con mecanismos de recuperacin tradicionales, esta funcin ofrece ventajas
significativas, como la facilidad de uso, la disponibilidad y una recuperacin ms rpida.
Tambin libera al DBA del trabajo de encontrar y restaurar propiedades especficas de
aplicacin. La funcin de flashback en tabla no se ocupa de la corrupcin fsica provocada por
un disco en mal estado.
Sintaxis
Puede llamar a una operacin de flashback en tabla en una o ms tablas, incluso en tablas de
diferentes esquemas. Para especificar el punto en el tiempo al que desea revertir, proporcione
un registro de hora vlido. Por defecto, los disparadores de base de datos estn desactivados
para todas las tablas implicadas. Para sustituir este comportamiento por defecto, especifique
la clusula ENABLE TRIGGERS.
Nota: Para obtener ms informacin sobre la semntica de flashback y de papelera de
reciclaje, consulte Oracle Database Administrators Reference 10g Release 1 (10.1).
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-26

71

Introduccin 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

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Sentencia FLASHBACK TABLE (continuacin)


Sintaxis y Ejemplos (continuacin)
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
informacin sobre objetos borrados. Las tablas borradas y los objetos asociados, como
ndices, restricciones, tablas anidadas, etc., no se eliminan y siguen ocupando espacio. Siguen
ocupando las cuotas de espacio de usuario, hasta que se purgan especficamente de la papelera
de reciclaje o hasta que se produce una situacin poco probable en la que las deba purgar la
base de datos debido a restricciones de espacio de tablespace.
Se puede considerar a cada usuario propietario de una papelera de reciclaje, ya que, a menos
que un usuario tenga el privilegio SYSDBA, los nicos objetos a los que puede acceder en la
papelera de reciclaje son los de su propiedad. Un usuario puede ver sus objetos en la papelera
de reciclaje mediante la siguiente sentencia:
SELECT * FROM RECYCLEBIN;

Al borrar un usuario, los objetos que pertenecen a ese usuario no se colocarn en la papelera
de reciclaje y se purgarn todos los objetos de la papelera de reciclaje.
Puede purgar la papelera de reciclaje con la siguiente sentencia:
PURGE RECYCLEBIN;

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

72

Introduccin a Oracle 10g: SQL Fundamentals II

Tablas Externas

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Tablas Externas
Una tabla externa es una tabla de slo lectura cuyos metadatos se almacenan en la base de
datos pero cuyos datos se almacenan fuera de la base de datos. Esta definicin de tabla
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.
Los datos de tabla externa se pueden consultar y unir directamente y en paralelo sin necesidad
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.
La diferencia principal entre las tablas externas y las normales es que las tablas organizadas
externamente son de slo lectura. No son posibles las operaciones DML y no se pueden crear
ndices en ellas. Sin embargo, se puede crear una tabla externa (y, por tanto, descargar datos)
mediante el comando CREATE TABLE AS SELECT.

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

73

Introduccin a Oracle 10g: SQL Fundamentals II

Tablas Externas (continuacin)


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 cargarn 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. Tambin puede crear una definicin de tabla externa en otro sistema y utilizar ese
archivo de datos. Esto permite que se muevan datos entre bases de datos Oracle.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-29

74

Introduccin a Oracle 10g: SQL Fundamentals II

Creacin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Ejemplo de Creacin de una Tabla Externa


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
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
operativo, para obtener una mayor flexibilidad en la gestin de archivos.
Debe tener privilegios del sistema CREATE ANY DIRECTORY para crear directorios. Al
crear un directorio, se le otorgan automticamente los privilegios de objeto READ y WRITE, y
puede otorgar privilegios READ y WRITE a otros usuarios y roles. El DBA tambin puede
otorgar estos privilegios a otros usuarios y roles.
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
log, de errores y de desechos que se estn utilizando.
Adems, es necesario un privilegio WRITE cuando el marco de tablas externas se utilice para
descargar datos.
Oracle proporciona adems 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
recargarlos despus en una base de datos Oracle. Se trata de una operacin que slo se realiza
una vez y que se puede hacer al crear la tabla. Despus de la creacin 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

Introduccin a Oracle 10g: SQL Fundamentals II

Ejemplo de Creacin de una Tabla Externa (continuacin)


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
clusula para cambiar la definicin 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 mxima 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
nombre de ruta de acceso es sensible a maysculas/minsculas.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

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


CREATE TABLE extract_emps
ORGANIZATION EXTERNAL (TYPE ORACLE_DATAPUMP
DEFAULT DIRECTORY
ACCESS PARAMETERS ( )
LOCATION ()
PARALLEL 4
REJECT LIMIT UNLIMITED
AS
SELECT * FROM ;

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

76

Introduccin a Oracle 10g: SQL Fundamentals II

Creacin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Creacin de una Tabla Externa


Cree tablas externas mediante la clusula ORGANIZATION EXTERNAL de la sentencia
CREATE TABLE. De hecho, no est creando una tabla. En realidad, est creando metadatos
en el diccionario de datos que se pueden utilizar para acceder a datos externos. Utilice la
clusula ORGANIZATION para especificar el orden en que se almacenarn las filas de datos
de la tabla. Al especificar EXTERNAL en la clusula ORGANIZATION, indica que la tabla es
de slo 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.
TYPE <access_driver_type> indica el controlador de acceso de la tabla externa. El
controlador de acceso es la API (interfaz de programacin de aplicaciones) que interpreta los
datos externos para la base de datos. Si no especifica TYPE, Oracle utiliza el controlador de
acceso por defecto, ORACLE_LOADER. La otra opcin es ORACLE_DATAPUMP.
Utilice la clusula DEFAULT DIRECTORY para especificar uno o ms objetos de directorio
de base de datos Oracle que se correspondan con directorios del sistema de archivos en los
que puedan residir orgenes de datos externos.
La clusula opcional ACCESS PARAMETERS le permite asignar valores a los parmetros del
controlador de acceso especfico para esta tabla externa.

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

77

Introduccin a Oracle 10g: SQL Fundamentals II

Creacin de una Tabla Externa (continuacin)


Utilice la clusula LOCATION para especificar un localizador externo para cada origen de
datos externo. Normalmente, <location_specifier> es un archivo, pero no
necesariamente.
La clusula REJECT LIMIT le permite especificar cuntos errores de conversin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-33

78

Introduccin a Oracle 10g: SQL Fundamentals II

Creacin 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'))
PARALLEL 5
REJECT LIMIT 200;
Table created.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Ejemplo de Creacin de una Tabla Externa mediante el Controlador de Acceso


ORACLE_LOADER
Suponga que hay un archivo plano que tiene registros en el siguiente formato:
10,jones,11-Dec-1934
20,smith,12-Jun-1972

Los registros se delimitan con nuevas lneas y todos los campos llevan una coma ( , ) al final.
El nombre del archivo es: /emp_dir/emp.dat
Para convertir este archivo en el origen de datos para una tabla externa cuyos metadatos
residirn en la base de datos, debe seguir estos pasos:
1. Cree un objeto de directorio emp_dir como se indica a continuacin:
CREATE DIRECTORY emp_dir AS '/emp_dir' ;

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


El ejemplo de la diapositiva ilustra la especificacin de tabla para crear una tabla externa para
el archivo:
/emp_dir/emp.dat

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

79

Introduccin a Oracle 10g: SQL Fundamentals II

Ejemplo de Creacin de una Tabla Externa mediante el Controlador de Acceso


ORACLE_LOADER (continuacin)
En el ejemplo, se ofrece la especificacin TYPE slo para ilustrar su uso. ORACLE_LOADER
es el controlador de acceso por defecto si no se especifica. La opcin ACCESS PARAMETERS
proporciona valores a los parmetros del controlador de acceso especificado. Estos valores los
interpreta el controlador de acceso, no Oracle Server.
La clusula PARALLEL permite que cinco servidores de ejecucin en paralelo exploren
simultneamente los orgenes (archivos) de datos externos cuando se ejecuta la sentencia
INSERT INTO TABLE. Por ejemplo, si se especifica PARALLEL=5, puede haber ms de un
servidor de ejecucin en paralelo trabajando en un origen de datos. Como las tablas externas
pueden ser muy grandes, por motivos de rendimiento, es recomendable especificar la clusula
PARALLEL o una indicacin paralela para la consulta.
La clusula REJECT LIMIT especifica que si se producen ms de 200 errores de conversin
durante una consulta de los datos externos, se aborta la consulta y se devuelve un error. Estos
errores de conversin pueden surgir cuando el controlador de acceso intenta transformar los
datos del archivo de datos para que coincidan con la definicin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-35

80

Introduccin a Oracle 10g: SQL Fundamentals II

Consulta de Tablas Externas

SELECT *
FROM oldemp

OLDEMP

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
emp.dat

Consulta de Tablas Externas


Una tabla externa no describe ningn dato que est almacenado en la base de datos. Tampoco
describe cmo se almacenan los datos en el origen externo. En realidad, describe cmo debe
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
datos para que coincidan con la definicin de tabla externa.
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
espera el servidor de bases de datos.
Es importante recordar que la descripcin de los datos del origen de datos est separada de la
definicin de la tabla externa. El archivo de origen puede contener ms o menos campos que
el nmero de columnas de la tabla. Adems, los tipos de datos del origen de datos pueden ser
diferentes a las columnas de la tabla. El controlador de acceso se asegura de que los datos del
origen de datos se procesen para que coincidan con la definicin de la tabla externa.

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

81

Introduccin a Oracle 10g: SQL Fundamentals II

Resumen

En esta leccin ha aprendido a:


Agregar restricciones
Crear ndices
Crear una restriccin 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
Crear y utilizar tablas externas

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Resumen
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
utilizan. Utilice la mecnica FLASHBACK para restaurar tablas. Utilice la clusula
external_table para crear una tabla externa, que es una tabla de slo lectura cuyos
metadatos se almacenan en la base de datos, pero cuyos datos se almacenan fuera de la base
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
CREATE TABLE.

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

82

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 2: Visin General


Esta prctica cubre los temas siguientes:
Modificacin de tablas
Adicin de columnas
Borrado de columnas
Creacin de ndices
Creacin de tablas externas

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Prctica 2: Visin General


En esta prctica, utilizar el comando ALTER TABLE para modificar columnas y agregar
restricciones. Utilizar el comando CREATE INDEX para crear ndices al crear una tabla,
junto con el comando CREATE TABLE. Crear tablas externas. Borrar columnas y utilizar
la operacin FLASHBACK.

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

83

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 2
1. Cree la tabla DEPT2 basada en el siguiente grfico de instancia de tabla. Guarde la
sintaxis en un archivo de comandos denominado lab02_01.sql y, a continuacin,
ejecute la sentencia en el archivo de comandos para crear la tabla. Confirme que la tabla
se ha creado.
ID

NAME

Data type

NUMBER

VARCHAR2

Length

25

Column Name
Key Type
Nulls/Unique
FK Table
FK Column

2. Rellene la tabla DEPT2 con datos de la tabla DEPARTMENTS. Incluya slo las
columnas que necesite.
3. Cree la tabla EMP2 basada en el siguiente grfico de instancia de tabla. Guarde la
sintaxis en un archivo de comandos denominado lab02_03.sql y, a continuacin,
ejecute la sentencia en el archivo de comandos para crear la tabla. Confirme que la tabla
se ha creado.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
ID

LAST_NAME

FIRST_NAME

DEPT_ID

Data type

NUMBER

VARCHAR2

VARCHAR2

NUMBER

Length

25

25

Column Name
Key Type

Nulls/Unique
FK Table

FK Column

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

84

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 2 (continuacin)
4. Modifique la tabla EMP2 para permitir apellidos de empleado ms largos. Confirme la
modificacin.

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

6. Cree la tabla EMPLOYEES2 basndose en la estructura de la tabla EMPLOYEES.


Incluya slo 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.
7. Borre la tabla EMP2.
8. Consulte la papelera de reciclaje para comprobar si est la tabla.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

9. Anule el borrado de la tabla EMP2.

10. Borre la columna FIRST_NAME de la tabla EMPLOYEES2. Confirme la modificacin


comprobando la descripcin de la tabla.
11. En la tabla EMPLOYEES2, marque la columna DEPT_ID como UNUSED. Confirme la
modificacin comprobando la descripcin de la tabla.
12. Borre todas las columnas UNUSED de la tabla EMPLOYEES2. Confirme la modificacin
comprobando la descripcin de la tabla.
13. Agregue una restriccin PRIMARY KEY de nivel de tabla a la tabla EMP2 en la
columna ID. Se debe asignar un nombre a la restriccin en el momento de la creacin.
Asigne a la restriccin el nombre my_emp_id_pk.

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

85

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 2 (continuacin)
14. Cree una restriccin PRIMARY KEY a la tabla DEPT2 mediante la columna ID. Se
debe asignar un nombre a la restriccin en el momento de la creacin. Asigne a la
restriccin 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 restriccin 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
NUMBER, precisin 2, escala 2. Agregue una restriccin a la columna COMMISSION
que garantice que el valor de comisin es mayor que cero.
19. Borre las tablas EMP2 y DEPT2 de forma que no se puedan restaurar. Verifique la
papelera de reciclaje.
20. Cree la tabla DEPT_NAMED_INDEX basada en el siguiente grfico de instancia de
tabla. Asigne al ndice de la columna PRIMARY KEY el nombre DEPT_PK_IDX.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Column Name

Deptno

Dname

Primary Key

Yes

Data Type

Number

VARCHAR2

Length

30

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

86

Introduccin a Oracle 10g: SQL Fundamentals II

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 2-42

87

Introduccin a Oracle 10g: SQL Fundamentals II

Manipulacin de Grandes Juegos de Datos

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
88

Introduccin a Oracle 10g: SQL Fundamentals II

Objetivos
Al finalizar esta leccin, debera 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

Fusionar filas en una tabla


Hacer un seguimiento de los cambios en datos
durante un perodo de tiempo

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

INSERT incondicional
INSERT de pivoting
ALL INSERT condicional
FIRST INSERT condicional

Objetivos
En esta leccin aprender a manipular datos en la base de datos Oracle mediante subconsultas.
Tambin recibir informacin sobre sentencias de inserciones de varias tablas, la sentencia
MERGE y el seguimiento de los cambios en la base de datos.

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

89

Introduccin 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 lnea
Actualizar datos en una tabla basndose en los
valores de otra tabla
Suprimir filas de una tabla basndose en filas de
otra tabla

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Uso de Subconsultas para Manipular Datos


Las subconsultas se pueden utilizar para recuperar datos de una tabla que podr utilizar como
entrada en una insercin (INSERT) en una tabla diferente. As, le resultar fcil copiar
grandes volmenes 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
clusula WHERE de las sentencias UPDATE y DELETE. Tambin puede utilizar subconsultas
en la clusula FROM de una sentencia SELECT. Esto se conoce como vista en lnea.

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

90

Introduccin 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 clusula VALUES.


Haga corresponder el nmero de columnas de la
clusula INSERT con el de la subconsulta.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Copia de Filas de Otra Tabla


Puede utilizar sentencias INSERT para agregar filas a una tabla en la que los valores se
deriven de tablas existentes. En lugar de la clusula VALUES, utilice una subconsulta.
Sintaxis

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

En la sintaxis:
table
es el nombre de la tabla
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
El nmero de columnas y los tipos de datos de la lista de columnas de la clusula INSERT se
deben corresponder con el nmero de valores y los tipos de datos de la subconsulta. Para crear
una copia de las filas de una tabla, utilice SELECT * en la subconsulta.
INSERT INTO EMPL3
SELECT *
FROM
employees;

Para obtener ms informacin, consulte Oracle Database 10g SQL Reference.

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

91

Introduccin a Oracle 10g: SQL Fundamentals II

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

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Insercin mediante una Subconsulta como Destino


Puede utilizar una subconsulta en lugar del nombre de tabla en la clusula INTO de la
sentencia INSERT.

La lista de seleccin de esta subconsulta debe tener el mismo nmero de columnas que la lista
de columnas de la clusula VALUES. Para que la sentencia INSERT funcione correctamente,
se deben seguir las reglas de las columnas de la tabla base. Por ejemplo, no se puede agregar
un identificador de empleado duplicado ni omitir un valor para una columna obligatoria
NOT NULL.
Esta aplicacin de las subconsultas evita tener que crear una vista nicamente para realizar
una insercin (INSERT).

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

92

Introduccin a Oracle 10g: SQL Fundamentals II

Insercin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Insercin mediante una Subconsulta como Destino (continuacin)


El ejemplo muestra los resultados de la subconsulta que se utiliz para identificar la tabla para
la sentencia INSERT.

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

93

Introduccin a Oracle 10g: SQL Fundamentals II

Recuperacin de Datos con una


Subconsulta como Origen
SELECT
FROM

WHERE
AND

a.last_name, a.salary,
a.department_id, b.salavg
employees a, (SELECT
department_id,
AVG(salary) salavg
FROM
employees
GROUP BY department_id) b
a.department_id = b.department_id
a.salary > b.salavg;

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Recuperacin de Datos con una Subconsulta como Origen


Puede utilizar una subconsulta en la clusula FROM de una sentencia SELECT, lo cual es muy
parecido al uso de las vistas. Una subconsulta en la clusula FROM de una sentencia SELECT
se denomina tambin vista en lnea. Una subconsulta en la clusula FROM de una sentencia
SELECT define un origen de datos para una sentencia SELECT en particular y slo para esa
sentencia SELECT. El ejemplo de la diapositiva muestra los apellidos de los empleados, los
salarios, los nmeros de departamento y los salarios medios de todos los empleados que ganan
ms que el salario medio en su departamento. La subconsulta de la clusula FROM se
denomina b y la consulta externa hace referencia a la columna SALAVG con este alias.

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

94

Introduccin a Oracle 10g: SQL Fundamentals II

Actualizacin de Dos Columnas con


una Subconsulta
Actualice el puesto y el salario del empleado 114 para
hacerlos corresponder con los del empleado 205.
UPDATE
SET

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

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Actualizacin de Dos Columnas con una Subconsulta


Para actualizar varias columnas en la clusula SET de una sentencia UPDATE, puede escribir
varias subconsultas.
Sintaxis
UPDATE table
SET
column

(SELECT
column
FROM table
WHERE condition)

[ ,
column

[WHERE

condition ]

(SELECT
column
FROM table
WHERE condition)]
;

Nota: Si no se actualiza ninguna fila, se devuelve el mensaje 0 rows updated.

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

95

Introduccin a Oracle 10g: SQL Fundamentals II

Actualizacin de Filas Basndose


en Otra Tabla
Utilice subconsultas en sentencias UPDATE para
actualizar las filas de una tabla basndose en los
valores de otra tabla.
UPDATE
SET

empl3
department_id

WHERE

job_id

= (SELECT department_id
FROM employees
WHERE employee_id = 100)
= (SELECT job_id
FROM employees
WHERE employee_id = 200);

1 row updated.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Actualizacin de Filas Basndose en Otra Tabla


Puede utilizar subconsultas en sentencias UPDATE para actualizar las filas de una tabla. El
ejemplo de la diapositiva actualiza la tabla EMPL3 basndose en los valores de la tabla
EMPLOYEES. Cambia el nmero de departamento de todos los empleados con el
identificador de puesto del empleado 200 al nmero de departamento actual del
empleado 100.

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

96

Introduccin a Oracle 10g: SQL Fundamentals II

Supresin de Filas Basndose en Otra Tabla


Utilice subconsultas en sentencias DELETE para
eliminar filas de una tabla basndose en valores de
otra tabla.

DELETE FROM empl3


WHERE department_id =
(SELECT department_id
FROM
departments
WHERE department_name
LIKE '%Public%');
1 row deleted.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Supresin de Filas Basndose en Otra Tabla


Puede utilizar subconsultas para suprimir filas de una tabla basndose en valores de otra tabla.
En el ejemplo de la diapositiva se suprimen todos los empleados que estn en el departamento
cuyo nombre contiene la cadena Public. La subconsulta busca en la tabla DEPARTMENTS
el nmero de departamento basndose en el nombre de departamento que contiene la cadena
Public. La subconsulta proporciona a continuacin el nmero de departamento a la consulta
principal, que suprime filas de datos de la tabla EMPLOYEES basndose en este nmero de
departamento.

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

97

Introduccin 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 prohben
cambiar las filas que no estn 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);
INSERT INTO
*
ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clause violation

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Palabras Clave WITH CHECK OPTION


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
cambios que produzcan filas que no estn incluidas en la subconsulta.
En el ejemplo, se utilizan las palabras clave WITH CHECK OPTION. La subconsulta
identifica filas que estn en el departamento 50, pero el identificador de departamento no est
en la lista SELECT y no se proporciona un valor para dicho identificador en la lista VALUES.
La insercin de esta fila da como resultado un identificador de departamento nulo, que no est
en la subconsulta.

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

98

Introduccin a Oracle 10g: SQL Fundamentals II

Visin General de la Funcin de Valor por


Defecto Explcito

La funcin de valor por defecto explcito le


permite utilizar la palabra clave DEFAULT como
valor de columna donde se desea el valor por
defecto de columna.
Esta funcin se ha agregado por compatibilidad
con el estndar SQL:1999.
Esto permite al usuario controlar dnde y cundo
se debe aplicar el valor por defecto a los datos.
Los valores por defecto explcitos se pueden
utilizar en las sentencias INSERT y UPDATE.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Valores por Defecto Explcitos


La palabra clave DEFAULT se puede utilizar en sentencias INSERT y UPDATE para
identificar un valor de columna por defecto. Si no existe ningn valor por defecto, se utiliza
un valor nulo.
La opcin DEFAULT le ahorra tener que codificar el valor por defecto en los programas o
consultar el diccionario para encontrarlo, que es lo que se deba hacer antes de que se
introdujese esta funcin. Es problemtico codificar el valor por defecto si ste cambia, porque
tambin habra que cambiar el cdigo de forma consecuente. No se suele acceder al
diccionario en un programa de aplicacin, por lo que esta funcin es muy importante.

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

99

Introduccin a Oracle 10g: SQL Fundamentals II

Uso de Valores Por Defecto Explcitos

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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Uso de Valores Por Defecto Explcitos


Especifique DEFAULT para definir la columna en el valor especificado anteriormente como
valor por defecto para la columna. Si no se ha especificado ningn valor por defecto para la
columna correspondiente, Oracle Server define la columna como nula.
En el primer ejemplo de la diapositiva, la sentencia INSERT utiliza un valor por defecto para
la columna MANAGER_ID. Si no hay ningn valor por defecto definido para la columna, se
insertar un valor nulo.
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 ningn valor por defecto
para la columna, cambiar el valor a nulo.
Nota: Al crear una tabla, puede especificar un valor por defecto para una columna. Esto se
analiza en la leccin titulada Creating and Managing Tables.

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

100

Introduccin a Oracle 10g: SQL Fundamentals II

Visin General de Sentencias INSERT de


Varias Tablas

INSERT ALL
INTO table_a VALUES(,,)
INTO table_b VALUES(,,)
INTO table_c VALUES(,,)
SELECT
FROM sourcetab
WHERE ;

Table_a

Table_b

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Table_c

Visin General de Sentencias INSERT de Varias Tablas


En una sentencia INSERT de varias tablas, se insertan filas calculadas derivadas de las filas
devueltas de la evaluacin de una subconsulta en una o ms tablas.
Las sentencias INSERT de varias tablas pueden desempear un papel muy til en el supuesto
de un almacn de datos. Debe cargar el almacn de datos con regularidad para que pueda
cumplir su propsito de facilitar el anlisis de negocio. Para ello, se deben extraer y copiar
datos de uno o ms sistemas operativos al almacn de datos. El proceso de extraccin de datos
del sistema de origen y su transferencia al almacn de datos se suele denominar ETL (siglas
de extraction, transformation, and loading, o extraccin, transformacin y carga).
Durante la extraccin, se deben identificar y extraer los datos deseados de diferentes orgenes
como, por ejemplo, aplicaciones y sistemas de bases de datos. Despus de la extraccin, los
datos se deben transportar fsicamente al sistema de destino o a un sistema intermedio para
continuar su procesamiento. Dependiendo del medio de transporte seleccionado, algunas
transformaciones se pueden realizar durante este proceso. Por ejemplo, una sentencia SQL
que acceda directamente a un destino remoto a travs de un gateway puede concatenar dos
columnas como parte de la sentencia SELECT.

Una vez cargados los datos en la base de datos Oracle, las transformaciones de datos se
pueden ejecutar mediante operaciones SQL. Una sentencia INSERT de varias tablas es una de
las tcnicas para implementar transformaciones de datos SQL.

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

101

Introduccin a Oracle 10g: SQL Fundamentals II

Visin General de Sentencias INSERT de


Varias Tablas

La sentencia INSERTSELECT 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 ms orgenes operativos a
un juego de tablas destino.
Proporcionan una mejora significativa del
rendimiento en:

DML nico frente a varias sentencias INSERTSELECT


DML nico frente a un procedimiento para realizar
varias inserciones mediante la sintaxis IF...THEN

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Visin General de Sentencias INSERT de Varias Tablas (continuacin)


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
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
trabajo de transformacin n veces.
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 ms
rpido.
Cada registro de cualquier flujo de entrada como, por ejemplo, una tabla de base de datos no
relacional, se puede convertir ahora en varios registros para un entorno de tabla de base de
datos ms relacional. Para implementar esta funcionalidad de forma alternativa, haba que
escribir varias sentencias INSERT.

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

102

Introduccin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Tipos de Sentencias INSERT de Varias Tablas


Los tipos de sentencias INSERT de varias tablas son:
INSERT incondicional
ALL INSERT condicional
FIRST INSERT condicional
INSERT de pivoting
Se utilizan diferentes clusulas para indicar el tipo de insercin (INSERT) que se ejecutar.

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

103

Introduccin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Sentencias INSERT de Varias Tablas


La diapositiva muestra el formato genrico para las sentencias INSERT de varias tablas.
INSERT Incondicional: ALL into_clause
Especifique ALL seguido de varias clusulas insert_into_clauses para realizar una
insercin incondicional de varias tablas. Oracle Server ejecuta cada insert_into_
clause una vez para cada fila devuelta por la subconsulta.
INSERT Condicional: conditional_insert_clause
Especifique la clusula conditional_insert_clause para realizar una insercin
(INSERT) condicional de varias tablas. Oracle Server filtra cada clusula insert_into_
clause a travs de la condicin WHEN correspondiente, lo que determina si se ejecutar
insert_into_clause. Una nica sentencia INSERT de varias tablas puede contener
hasta 127 clusulas WHEN.
INSERT Condicional: ALL
Si especifica ALL, Oracle Server evala cada clusula WHEN independientemente de los
resultados de la evaluacin de cualquier otra clusula WHEN. Para cada clusula WHEN cuya
condicin se evale como verdadera, Oracle Server ejecuta la lista correspondiente de
clusulas INTO.

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

104

Introduccin a Oracle 10g: SQL Fundamentals II

Sentencias INSERT de Varias Tablas (continuacin)


INSERT Condicional: FIRST
Si especifica FIRST, Oracle Server evala cada clusula WHEN en el orden en que aparece
en la sentencia. Si la primera clusula WHEN se evala como verdadera, Oracle Server
ejecuta la clusula INTO correspondiente y salta las clusulas WHEN siguientes para la fila
especificada.
INSERT Condicional: Clusula ELSE
Para una fila especificada, si no se evala ninguna clusula WHEN como verdadera:
Si ha especificado una clusula ELSE, Oracle Server ejecuta la lista de clusulas
INTO asociadas a la clusula ELSE.
Si no ha especificado una clusula ELSE, Oracle Server no realiza ninguna accin
para esa fila.
Restricciones en Sentencias INSERT de Varias Tablas
Se pueden realizar sentencias INSERT de varias tablas slo en tablas, no en vistas ni
en vistas materializadas.
No se puede realizar una insercin (INSERT) de varias tablas en una tabla remota.
No se puede especificar una expresin de recopilacin de tablas al realizar una
insercin (INSERT) de varias tablas.
En una insercin (INSERT) de varias tablas, no se pueden combinar todas las
clusulas insert_into_clauses para especificar ms de 999 columnas de
destino.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-18

105

Introduccin 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
FROM employees
WHERE employee_id > 200;
8 rows created.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

INSERT ALL Incondicional


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
contratacin, 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
empleado, fecha de contratacin y salario se insertan en la tabla SAL_HISTORY. Los detalles
de identificador de empleado, identificador de supervisor y salario se insertan en la tabla
MGR_HISTORY.
La sentencia INSERT se conoce como INSERT incondicional, ya que no se aplican ms
restricciones a las filas que se recuperan mediante la sentencia SELECT. Todas las filas
recuperadas mediante la sentencia SELECT se insertan en las dos tablas, SAL_HISTORY y
MGR_HISTORY. La clusula VALUES de las sentencias INSERT especifica las columnas de
la sentencia SELECT que se deben insertar en cada una de las tablas. Cada fila devuelta
mediante la sentencia SELECT da como resultado dos inserciones, una para la tabla
SAL_HISTORY y una para la tabla MGR_HISTORY.
Se puede interpretar que el feedback 8 rows created significa que se realiz un total de
ocho inserciones en las tablas base, SAL_HISTORY y MGR_HISTORY.

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

106

Introduccin 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 dlares, 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

INSERT ALL Condicional


En la diapositiva se especifica la sentencia con un problema para una sentencia INSERT ALL
condicional. La solucin a este problema se muestra en la pgina siguiente.

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

107

Introduccin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

INSERT ALL Condicional (continuacin)

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
identificador de empleado, fecha de contratacin, 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 empleado, fecha de contratacin y salario se insertan en la tabla
SAL_HISTORY. Los detalles de identificador de empleado, identificador de supervisor y
salario se insertan en la tabla MGR_HISTORY.
La sentencia INSERT se conoce como ALL INSERT condicional, ya que se aplica una
restriccin ms a las filas que se recuperan mediante la sentencia SELECT. De las filas
recuperadas mediante la sentencia SELECT, slo aqullas en las que el valor de la columna
SAL sea mayor que 10000 se insertarn en la tabla SAL_HISTORY y, de forma parecida, slo
las filas en las que el valor de la columna MGR sean mayor que 200 se insertarn en la tabla
MGR_HISTORY.
Observe que, a diferencia del ejemplo anterior, en el que se insertaron ocho filas en las tablas,
en este ejemplo slo se insertan cuatro filas.
Se puede interpretar que el feedback 4 rows created significa que se realiz un total de
cuatro inserciones en las tablas base, SAL_HISTORY y MGR_HISTORY.

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

108

Introduccin 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 dlares, inserte
estos valores en SPECIAL_SAL mediante una sentencia
FIRST INSERT condicional de varias tablas
Si la primera clusula WHEN se evala como verdadera,
se deben saltar las clusulas WHEN siguientes para
esta fila.
En las filas que no satisfacen la primera condicin
WHEN, realice inserciones en las tablas HIREDATE_
HISTORY_00, HIREDATE_HISTORY_99 o HIREDATE_
HISTORY, basndose en el valor de la columna HIRE_
DATE mediante una sentencia INSERT condicional de
varias tablas.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

INSERT FIRST Condicional


En la diapositiva se especifica la sentencia con un problema para una sentencia FIRST
INSERT condicional. La solucin a este problema se muestra en la pgina siguiente.

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

109

Introduccin 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
GROUP BY department_id;
8 rows created.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

INSERT FIRST Condicional (continuacin)


El ejemplo de la diapositiva inserta filas en ms de una tabla mediante una nica sentencia
INSERT. La sentencia SELECT recupera los detalles de identificador de departamento,
salario total y fecha de contratacin mxima de cada departamento de la tabla EMPLOYEES.
Esta sentencia INSERT se conoce como FIRST INSERT condicional, ya que se realiza una
excepcin para los departamentos cuyo salario total sea mayor que 25.000 dlares. La
condicin WHEN ALL > 25000 se evala en primer lugar. Si el salario total de un
departamento es mayor que 25.000 dlares, el registro se inserta en la tabla SPECIAL_SAL,
independientemente de la fecha de contratacin. Si esta primera clusula WHEN se evala
como verdadera, Oracle Server ejecuta la clusula INTO correspondiente y salta las clusulas
WHEN siguientes para esta fila.
Para las filas que no satisfacen la primera condicin WHEN (WHEN SAL > 25000), el resto de
las condiciones se evala igual que una sentencia INSERT condicional y los registros
recuperados mediante la sentencia SELECT se insertan en las tablas HIREDATE_HISTORY_
00 o HIREDATE_HISTORY_99 o HIREDATE_HISTORY, basndose en el valor de la
columna HIREDATE.
Se puede interpretar que el feedback 8 rows created significa que se realiz un total de
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

Introduccin 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 ms normal:
EMPLOYEE_ID, WEEK, SALES
Mediante una sentencia INSERT de pivoting, convierta
el juego de registros de ventas de la tabla de la base
de datos no relacional al formato relacional.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

INSERT de Pivoting

El pivoting es una operacin en la que se debe crear una transformacin tal que cada registro
de cualquier flujo de entrada como, por ejemplo, una tabla de base de datos no relacional, se
debe convertir en varios registros para un entorno de tablas de base de datos ms relacional.
Para solucionar el problema que se menciona en la diapositiva, debe crear una transformacin
tal que cada registro de la tabla de base de datos no relacional original, SALES_SOURCE_
DATA, se convierta en cinco registros para la tabla SALES_INFO del almacn de datos. Esta
operacin se suele conocer como pivoting.
En la diapositiva se especifica la sentencia con un problema para una sentencia INSERT de
pivoting. La solucin a este problema se muestra en la pgina siguiente.

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

111

Introduccin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

INSERT de Pivoting (continuacin)

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
representante de ventas cada da de la semana, durante una semana con un identificador de
semana en particular.
DESC SALES_SOURCE_DATA

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

112

Introduccin a Oracle 10g: SQL Fundamentals II

INSERT de Pivoting (continuacin)


SELECT * FROM SALES_SOURCE_DATA;

DESC SALES_INFO

SELECT * FROM sales_info;

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Observe en el ejemplo anterior que mediante una insercin (INSERT) de pivoting, una fila de
la tabla SALES_SOURCE_DATA se convierte en cinco registros de la tabla relacional,
SALES_INFO.

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

113

Introduccin a Oracle 10g: SQL Fundamentals II

Sentencia MERGE

Permite actualizar o insertar datos condicionalmente


en una tabla de base de datos
Realiza una actualizacin (UPDATE) si existe la fila y
una insercin (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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Sentencias MERGE
Oracle Server soporta la sentencia MERGE para operaciones INSERT, UPDATE y DELETE.
Mediante esta sentencia, puede actualizar, insertar o suprimir una fila condicionalmente en
una tabla, con lo que se evitan varias sentencias DML. La decisin de actualizar, insertar o
suprimir en la tabla destino se basa en una condicin de la clusula ON.
Hay que tener privilegios de objeto INSERT y UPDATE en la tabla destino y el privilegio de
objeto SELECT en la tabla origen. Para especificar la clusula DELETE de la clusula
merge_update_clause, tambin debe tener el privilegio de objeto DELETE en la tabla
destino.
La sentencia MERGE es determinista. No se puede actualizar varias veces la misma fila de la
tabla destino en la misma sentencia MERGE.
Un enfoque alternativo es utilizar bucles PL/SQL y varias sentencias DML. La sentencia
MERGE, sin embargo, es fcil de utilizar y se expresa de forma ms sencilla como una nica
sentencia SQL.
La sentencia MERGE es adecuada en diferentes aplicaciones de almacn de datos. Por
ejemplo, en una aplicacin de almacn de datos, es posible que necesite trabajar con datos
procedentes de varios orgenes, algunos de los cuales pueden estar duplicados. Con la
sentencia MERGE, puede agregar o modificar filas condicionalmente.

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

114

Introduccin 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)
VALUES (column_values);

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Fusin de Filas
Puede actualizar filas existentes e insertar nuevas filas condicionalmente mediante la
sentencia MERGE.
En la sintaxis:
Clusula INTO

Clusula USING

Clusula ON
WHEN MATCHED |

especifica la tabla destino que se va a actualizar o en la que se va


a insertar
identifica el origen de los datos que se van a actualizar o insertar;
puede ser una tabla, una vista o una subconsulta
condicin segn la cual la operacin MERGE actualiza o inserta
indica al servidor cmo responder a los resultados de la condicin
de unin

WHEN NOT MATCHED


Para obtener ms informacin, consulte Oracle Database 10g SQL Reference, MERGE.

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

115

Introduccin a Oracle 10g: SQL Fundamentals II

Fusin 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,
e.email, e.phone_number, e.hire_date, e.job_id,
e.salary, e.commission_pct, e.manager_id,
e.department_id);

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Ejemplo de Fusin de Filas


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.email
= e.email,
c.phone_number
= e.phone_number,
c.hire_date
= e.hire_date,
c.job_id
= e.job_id,
c.salary
= e.salary,
c.commission_pct = e.commission_pct,
c.manager_id
= e.manager_id,
c.department_id = e.department_id
WHEN NOT MATCHED THEN
INSERT VALUES(e.employee_id, e.first_name, e.last_name,
e.email, e.phone_number, e.hire_date, e.job_id,
e.salary, e.commission_pct, e.manager_id,
e.department_id);

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

116

Introduccin a Oracle 10g: SQL Fundamentals II

Fusin 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 *
FROM empl3;

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

20 rows selected.

Ejemplo de Fusin de Filas (continuacin)


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
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.
Se evala la condicin c.employee_id = e.employee_id. Como la tabla EMPL3
est vaca, la condicin devuelve false (no hay correspondencias). La lgica recae en la
clusula WHEN NOT MATCHED y el comando MERGE inserta las filas de la tabla
EMPLOYEES en la tabla EMPL3.
Si existieran las filas en la tabla EMPL3 y los identificadores de empleado se correspondieran
en las dos tablas (en las tablas EMPL3 y EMPLOYEES), las filas existentes en la tabla EMPL3
se actualizaran para corresponderse con la tabla EMPLOYEES.

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

117

Introduccin a Oracle 10g: SQL Fundamentals II

Seguimiento de Cambios en los Datos

SELECT

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Versiones de filas recuperadas

Seguimiento de Cambios en los Datos


Puede suceder que, de algn modo, haya datos en la tabla que se hayan cambiado
incorrectamente. Para investigar esto, puede utilizar varias consultas de flashback para ver los
datos de filas en puntos concretos en el tiempo. Lo que es ms eficaz, puede utilizar la
funcin Consulta de Versiones de Flashback para ver todos los cambios efectuados en una fila
durante un perodo de tiempo. Esta funcin le permite agregar una clusula VERSIONS a una
sentencia SELECT que especifique un SCN o rango de registro de hora en el que desee ver
cambios en los valores de fila. La consulta tambin puede devolver metadatos asociados
como, por ejemplo, la transaccin responsable del cambio.
Es ms, despus de identificar una transaccin errnea, puede utilizar la funcin Consulta de
Versiones de Flashback para identificar otros cambios que haya realizado la transaccin.
Puede utilizar entonces la funcin Consulta de Versiones de Flashback para restaurar la tabla
a un estado anterior a la realizacin de los cambios.
Puede utilizar una consulta en una tabla con una clusula VERSIONS para producir todas las
versiones de todas las filas que existen o que hayan existido entre el momento en que se
emiti la consulta y los segundos undo_retention anteriores al momento actual. undo_
retention es un parmetro de inicializacin de ajuste automtico. Una consulta que
incluye una clusula VERSIONS se conoce como consulta de versiones. Los resultados de
una consulta de versiones se comportan como si se hubiera aplicado la clusula WHERE a las
versiones de las filas. La consulta de versiones devuelve versiones de las filas slo en
transacciones.
SCN (nmero de cambio del sistema): Oracle Server asigna un SCN (nmero de cambio del
sistema) para identificar los registros de rehacer para cada transaccin validada.
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-31

118

Introduccin a Oracle 10g: SQL Fundamentals II

Ejemplo de Consulta de Versiones de Flashback


SELECT salary FROM employees3
WHERE employee_id = 107;

UPDATE employees3 SET salary = salary * 1.30


WHERE employee_id = 107;

COMMIT;

SELECT salary FROM employees3


VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE
WHERE employee_id = 107;

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Ejemplo de Consulta de Versiones de Flashback


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
diferentes versiones del salario (3).
La clusula VERSIONS no cambia el plan de la consulta. Por ejemplo, si ejecuta una consulta
en una tabla que utilice el mtodo de acceso a ndices, la misma consulta de la misma tabla con
una clusula VERSIONS contina utilizando el mtodo de acceso a ndices. Las versiones de
las filas devueltas por la consulta de versiones son versiones de las filas en las transacciones. La
clusula VERSIONS no afecta al comportamiento transaccional de una consulta. Esto significa
que una consulta en una tabla con una clusula VERSIONS sigue heredando el entorno de la
consulta de la transaccin en curso.
La clusula VERSIONS por defecto se puede especificar como VERSIONS BETWEEN
{SCN|TIMESTAMP} MINVALUE AND MAXVALUE.
La clusula VERSIONS es una extensin SQL nicamente para consultas. Puede tener
operaciones DML y DDL que utilicen una clusula VERSIONS dentro de las subconsultas. La
consulta de versiones recupera todas las versiones validadas de las filas seleccionadas. Los
cambios realizados por la transaccin activa actual no se devuelven. La consulta de versiones
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

Introduccin a Oracle 10g: SQL Fundamentals II

Ejemplo de Obtencin de Versiones de Filas


El acceso a filas para una consulta de versiones se puede definir en una de las siguientes dos
categoras:
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.
Bsicamente, esto significa que se devuelven todas las versiones de la ranura del bloque
indicado por el ROWID.
Acceso a todas las dems filas: Para el acceso a todas las dems filas, se devuelven
todas las versiones de las filas.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-33

120

Introduccin a Oracle 10g: SQL Fundamentals II

Clusula 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Clusula VERSIONS BETWEEN


Puede utilizar la clusula 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
pasado en el tiempo.
Si el momento de retencin de deshacer es mejor que el momento de lmite inferior/SCN de la
clusula BETWEEN, la consulta recupera nicamente las versiones hasta el momento de
retencin de deshacer. El intervalo de tiempo de la clusula BETWEEN se puede especificar
como intervalo SCN o como intervalo de reloj. Este intervalo de tiempo se cierra en los
lmites inferior y superior.
En el ejemplo, se recuperan los cambios de salario de Lorentz. El valor NULL para
END_DATE para la primera versin indica que se trataba de la versin existente en el
momento de la consulta. El valor NULL para START_DATE para la ltima versin indica que
esta versin se cre en un momento anterior a la retencin de deshacer.

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

121

Introduccin a Oracle 10g: SQL Fundamentals II

Resumen
En esta leccin 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

Fusionar filas en una tabla


Manipular datos mediante subconsultas
Hacer un seguimiento de los cambios en datos
durante un perodo de tiempo

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

INSERT incondicional
INSERT de pivoting
ALL INSERT condicional
FIRST INSERT condicional

Resumen
En esta leccin ha aprendido a manipular datos en la base de datos Oracle mediante subconsultas.
Tambin ha recibido informacin sobre sentencias INSERT de varias tablas, la sentencia MERGE
y el seguimiento de los cambios en la base de datos.

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

122

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 3: Visin General


Esta prctica cubre los temas siguientes:
Realizacin de inserciones (INSERT) de varias
tablas
Realizacin de operaciones MERGE
Seguimiento de versiones de filas

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Prctica 3: Visin General


En esta prctica, agregar filas a la tabla emp_data, actualizar y suprimir datos de la tabla
y realizar un seguimiento de las transacciones.

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

123

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 3
1. Ejecute el archivo de comandos lab_03_01.sql en la carpeta de prcticas 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 prcticas 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 prcticas para


crear la tabla SPECIAL_SAL.
6. Muestre la estructura de la tabla SPECIAL_SAL.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

7. a. Escriba una consulta para:


- Recuperar los detalles de identificador de empleado, fecha de contratacin,
salario e identificador de supervisor de los empleados cuyo identificador de
empleado es menor que 125 en la tabla EMPLOYEES.
- Si el salario es mayor que 20.000 dlares, insertar los detalles de identificador
de empleado y salario en la tabla SPECIAL_SAL.
- Insertar los detalles de identificador de empleado, fecha de contratacin y
salario en la tabla SAL_HISTORY.
- Insertar los detalles de identificador de empleado, identificador de supervisor y
salario en la tabla MGR_HISTORY.

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

124

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 3 (continuacin)
b. Muestre los registros de la tabla SPECIAL_SAL.

c. Muestre los registros de la tabla SAL_HISTORY.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-38

125

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 3 (continuacin)
d. Muestre los registros de la tabla MGR_HISTORY.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-39

126

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 3 (continuacin)
8. a. Ejecute el archivo de comandos lab_03_08a.sql en la carpeta de prcticas
para crear la tabla SALES_SOURCE_DATA.
b. Ejecute el archivo de comandos lab_03_08b.sql en la carpeta de prcticas
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 prcticas


para crear la tabla SALES_INFO.
f. Muestre la estructura de la tabla SALES_INFO.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-40

127

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 3 (continuacin)
g. Escriba una consulta para:
Recuperar los detalles de identificador de empleado, identificador de semana, ventas
el lunes, ventas el martes, ventas el mircoles, ventas el jueves y ventas el viernes
de la tabla SALES_SOURCE_DATA.
Crear tal transformacin que cada registro recuperado de la tabla SALES_
SOURCE_DATA se convierta en varios registros para la tabla SALES_INFO.
Indicacin: 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 electrnico 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
emp_dir. Para ello, puede utilizar el archivo de comandos lab_03_ 09.sql.
10. A continuacin, ejecute el archivo de comandos lab_03_10.sql para crear la tabla
EMP_HIST.
a. Aumente el tamao de la columna de correo electrnico a 45.
b. Fusione los datos de la tabla EMP_DATA creada en la ltima prctica en los datos de
la tabla EMP_HIST. Suponga que los datos de la tabla externa EMP_DATA son los
ms actualizados. Si una fila de la tabla EMP_DATA se corresponde con la tabla
EMP_HIST, actualice la columna de correo electrnico de la tabla EMP_ HIST
para hacerla corresponder con la fila de la tabla EMP_DATA. Si una fila de la tabla
EMP_DATA no encuentra correspondencia, insrtela en la tabla EMP_HIST. Se
considera que las filas se corresponden cuando el nombre y el apellido del empleado
son idnticos.
c. Recupere las filas de EMP_HIST despus de la fusin.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 3-41

128

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 3 (continuacin)

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

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 continuacin,
cambie el departamento de Kochhar a 50 y valide el cambio. Realice un seguimiento de
los cambios efectuados en Kochhar mediante la funcin de versiones de filas.

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

129

Introduccin a Oracle 10g: SQL Fundamentals II

Generacin de Informes mediante


la Agrupacin de Datos Relacionados

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
130

Introduccin a Oracle 10g: SQL Fundamentals II

Objetivos
Al finalizar esta leccin, debera estar capacitado para:
Utilizar la operacin ROLLUP para generar valores
subtotales
Utilizar la operacin CUBE para generar valores desde
varias tablas
Utilizar la funcin GROUPING para identificar los
valores de fila creados por ROLLUP o CUBE
Utilizar GROUPING SETS para generar un juego de
resultados nico

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Objetivos
En esta leccin, aprender a:
Agrupar datos para obtener:
- Valores subtotales mediante el operador ROLLUP
- Valores desde varias tablas mediante el operador CUBE
Utilice la funcin GROUPING para identificar el nivel de agregacin en el juego de
resultados generado por un operador ROLLUP o CUBE
Utilice GROUPING SETS para generar un nico juego de resultados que sea
equivalente a un enfoque UNION ALL

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

131

Introduccin a Oracle 10g: SQL Fundamentals II

Revisin de Funciones de Grupo

Las funciones de grupo operan en juegos de filas


para dar un resultado por grupo.
SELECT
FROM
[WHERE
[GROUP BY
[ORDER BY

[column,] group_function(column). . .
table
condition]
group_by_expression]
column];

Ejemplo:

SELECT AVG(salary), STDDEV(salary),


COUNT(commission_pct),MAX(hire_date)
FROM
employees
WHERE job_id LIKE 'SA%';

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Funciones de Grupo
Puede utilizar la clusula GROUP BY para dividir las filas de una tabla en grupos. Puede
utilizar entonces las funciones de grupo para devolver informacin de resumen para cada
grupo. Las funciones de grupo pueden aparecer en listas de seleccin y en clusulas ORDER
BY y HAVING. Oracle Server aplica las funciones de grupo a cada grupo de filas y devuelve
una sola fila de resultados para cada grupo.
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
VARIANCE operan slo en valores numricos. MAX y MIN pueden operar en valores de datos
numricos, de carcter o de fecha. COUNT devuelve el nmero de filas no nulas para la
expresin especfica. El ejemplo de la diapositiva calcula el salario medio, la desviacin
estndar en el salario, el nmero de empleados que ganan una comisin y la fecha de
contratacin mxima para los empleados cuyo JOB_ID empiece por SA.
Instrucciones para Utilizar Funciones de Grupo
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
sustituir con un valor los valores nulos, utilice la funcin NVL. COUNT devuelve un
nmero o cero.
Oracle Server clasifica implcitamente el juego de resultados en orden ascendente de las
columnas de agrupamiento especificadas si se utiliza una clusula GROUP BY. Para
sustituir esta clasificacin por defecto, puede utilizar DESC en una clusula ORDER BY.
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-3

132

Introduccin a Oracle 10g: SQL Fundamentals II

Revisin de la Clusula GROUP BY

Sintaxis:
SELECT
FROM
[WHERE
[GROUP BY
[ORDER BY

[column,] group_function(column). . .
table
condition]
group_by_expression]
column];

Ejemplo:
SELECT

department_id, job_id, SUM(salary),


COUNT(employee_id)
FROM
employees
GROUP BY department_id, job_id ;

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Revisin de la Clusula GROUP BY

Oracle Server evala el ejemplo que se muestra en la diapositiva de la siguiente forma:


La clusula SELECT especifica que se deben recuperar las siguientes columnas:
- Columnas de identificador de departamento y de identificador de puesto de la tabla
EMPLOYEES
- Suma de todos los salarios y nmero de empleados en cada grupo que ha
especificado en la clusula GROUP BY
La clusula GROUP BY especifica cmo se deben agrupar las filas en la tabla. El salario
total y el nmero de empleados se calculan para cada identificador de puesto dentro de
cada departamento. Las filas se agrupan por identificador de departamento y despus
por puesto dentro de cada departamento.

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

133

Introduccin a Oracle 10g: SQL Fundamentals II

Revisin de la Clusula HAVING

Utilice la clusula HAVING para especificar qu


grupos se deben mostrar.
Restrinja an ms los grupos basndose en una
condicin de limitacin.
SELECT
FROM
[WHERE
[GROUP BY
[HAVING
[ORDER BY

[column,] group_function(column)...
table
condition]
group_by_expression]
having_expression]
column];

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Clusula HAVING

Se forman los grupos y se calculan las funciones de grupo antes de que se aplique la clusula
HAVING a los grupos. La clusula HAVING puede ir delante de la clusula GROUP BY, pero
se recomienda colocar primero la clusula GROUP BY, porque resulta ms lgico.
Oracle Server sigue estos pasos si se utiliza la clusula HAVING:
1. Agrupa las filas
2. Aplica las funciones de grupo a los grupos y muestra los grupos que cumplen los
criterios de la clusula HAVING

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

134

Introduccin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

GROUP BY con los Operadores ROLLUP y CUBE


Especifique los operadores ROLLUP y CUBE en la clusula GROUP BY de una consulta. El
agrupamiento con ROLLUP genera un juego de resultados que contiene las filas agrupadas
normales y las filas subtotales. La operacin CUBE de la clusula GROUP BY agrupa las filas
seleccionadas basndose en los valores de todas las combinaciones posibles de expresiones de
las especificaciones y devuelve una sola fila de informacin resumida para cada grupo. Puede
utilizar el operador CUBE para generar filas de valores derivados de varias tablas.
Nota: Al trabajar con ROLLUP y CUBE, asegrese de que las columnas que vayan despus de
GROUP BY tengan relaciones significativas y reales entre s, ya que, de lo contrario, los
operadores devolvern informacin irrelevante.

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

135

Introduccin a Oracle 10g: SQL Fundamentals II

Operador ROLLUP

ROLLUP es una extensin de la clusula GROUP BY.


Utilice la operacin ROLLUP para generar agregados
acumulativos como, por ejemplo, subtotales.

SELECT
FROM
[WHERE
[GROUP BY
[HAVING
[ORDER BY

[column,] group_function(column). . .
table
condition]
[ROLLUP] group_by_expression]
having_expression];
column];

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Operador ROLLUP
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
extraer estadsticas e informacin de resumen de los juegos de resultados. Los agregados
acumulativos se pueden utilizar en informes, diagramas y grficos.
El operador ROLLUP crea agrupamientos movindose en una direccin, de derecha a
izquierda, a lo largo de la lista de columnas especificada en la clusula GROUP BY. A
continuacin, aplica la funcin agregada a estos agrupamientos.
Nota
Para generar subtotales en n dimensiones (es decir, n columnas de la clusula GROUP
BY) sin un operador ROLLUP, se deben enlazar n+1 sentencias SELECT con UNION
ALL. Esto hace que la ejecucin de la consulta resulte ineficiente, ya que cada sentencia
SELECT provoca acceso a tablas. El operador ROLLUP recopila sus resultados con un
solo acceso a tablas. El operador ROLLUP es til cuando hay muchas columnas
implicadas en la generacin de subtotales.
Los subtotales y los totales se generan con ROLLUP. CUBE genera totales tambin, pero
acumula eficazmente en cada direccin posible, lo que genera datos de valores
derivados de varias tablas.

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

136

Introduccin a Oracle 10g: SQL Fundamentals II

Operador ROLLUP: Ejemplo


SELECT
FROM
WHERE
GROUP BY

department_id, job_id, SUM(salary)


employees
department_id < 60
ROLLUP(department_id, job_id);

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Ejemplo de un Operador ROLLUP


En el ejemplo de la diapositiva:
Los salarios totales de todos los identificadores de puesto de un departamento para los
departamentos cuyo identificador es menor que 60 se muestran mediante la clusula
GROUP BY.
El operador ROLLUP muestra:
- Salario total de cada departamento cuyo identificador es menor que 60
- Salario total de todos los departamentos cuyo identificador es menor que 60,
independientemente de los identificadores de puesto
En este ejemplo, 1 indica un grupo totalizado tanto por DEPARTMENT_ID como por
JOB_ID, 2 indica un grupo totalizado slo por DEPARTMENT_ID y 3 indica la suma total.
El operador ROLLUP crea subtotales que acumulan desde el nivel ms detallado hasta la suma
total, despus de la lista de agrupamiento especificada en la clusula GROUP BY. Primero,
calcula los valores agregados estndar para los grupos especificados en la clusula GROUP
BY (en el ejemplo, la suma de salarios agrupados en cada puesto de un departamento). A
continuacin, va creando subtotales de mayor nivel progresivamente, de derecha a izquierda
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).
Dadas n expresiones en el operador ROLLUP de la clusula GROUP BY, la operacin da
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 dems, filas superagregadas.
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-8

137

Introduccin a Oracle 10g: SQL Fundamentals II

Operador CUBE

CUBE es una extensin de la clusula GROUP BY.


Puede utilizar el operador CUBE para generar valores
desde varias tablas con una nica sentencia SELECT.
SELECT
FROM
[WHERE
[GROUP BY
[HAVING
[ORDER BY

[column,] group_function(column)...
table
condition]
[CUBE] group_by_expression]
having_expression]
column];

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Operador CUBE
El operador CUBE es un conmutador adicional de la clusula GROUP BY de una sentencia
SELECT. El operador CUBE se puede aplicar a todas las funciones agregadas, incluidas AVG,
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 slo una
fraccin de posibles combinaciones de subtotales, CUBE genera subtotales para todas las
posibles combinaciones de agrupamientos especificados en la clusula GROUP BY y una
suma total.
El operador CUBE se utiliza con una funcin agregada para generar filas adicionales en un
juego de resultados. Las columnas incluidas en la clusula GROUP BY son de referencia
cruzada y se utilizan para generar un superjuego de grupos. La funcin agregada especificada
en la lista de selecciones se aplica a estos grupos para generar valores de resumen para las filas
superagregadas adicionales. El nmero de grupos adicionales del juego de resultados lo
determina el nmero de columnas incluidas en la clusula GROUP BY.
De hecho, todas las posibles combinaciones de las columnas o las expresiones de la clusula
GROUP BY se utilizan para generar superagregados. Si tiene n columnas o expresiones en la
clusula GROUP BY, habr 2n posibles combinaciones superagregadas. Matemticamente,
estas combinaciones forman un cubo de n dimensiones, de ah el nombre del operador.
Mediante la aplicacin o herramientas de programacin, estos valores superagregados se
pueden proporcionar a diagramas y grficos que expresarn los resultados y las relaciones
eficazmente y de forma visual.
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-9

138

Introduccin a Oracle 10g: SQL Fundamentals II

Operador CUBE: Ejemplo


SELECT
FROM
WHERE
GROUP BY

department_id, job_id, SUM(salary)


employees
department_id < 60
CUBE (department_id, job_id);

1
2

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
4

Ejemplo de un Operador CUBE


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
cuyo identificador es menor que 60) se muestra mediante la clusula GROUP BY.
Salario total de los departamentos cuyo identificador es menor que 60.
Salario total de todos los puestos, independientemente del departamento.
Salario total de los departamentos cuyo identificador es menor que 60,
independientemente de los cargos.
En este ejemplo, 1 indica la suma total. 2 indica las filas totalizadas slo por JOB_ID. 3
indica algunas de las filas totalizadas por DEPARTMENT_ID y JOB_ID. 4 indica algunas
de las filas totalizadas slo por DEPARTMENT_ID.
El operador CUBE tambin ha realizado la operacin ROLLUP para mostrar los subtotales de
los departamentos cuyo identificador es menor que 60 y el salario total de los de los
departamentos cuyo identificador es menor que 60, independientemente de los cargos.
Adems, el operador CUBE muestra el salario total de todos los puestos, independientemente
del departamento.
Nota: De forma parecida al operador ROLLUP, para generar subtotales en n dimensiones (es
decir, n columnas de la clusula GROUP BY) sin un operador CUBE, se deben enlazar 2n
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

Introduccin a Oracle 10g: SQL Fundamentals II

Funcin GROUPING
La funcin 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
[WHERE
condition]
[GROUP BY [ROLLUP][CUBE] group_by_expression]
[HAVING
having_expression]
[ORDER BY column];

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
.

Funcin GROUPING
La funcin GROUPING se puede utilizar con los operadores CUBE o ROLLUP para entender
mejor el modo en que se ha obtenido un valor de resumen.
La funcin GROUPING utiliza una sola columna como argumento. El valor de expr en la
funcin GROUPING se debe corresponder con una de las expresiones de la clusula GROUP
BY. La funcin devuelve un valor de 0 1.
Los valores devueltos por la funcin GROUPING son tiles para:
Determinar el nivel de agregacin de un subtotal dado; es decir, el grupo o los grupos en
los que se basa el subtotal
Identificar si un valor NULL en la columna de expresiones de una fila del juego de
resultado indica:
- Un valor NULL de la tabla base (valor NULL almacenado)
- Un valor NULL creado por ROLLUP o CUBE (como resultado de una funcin de
grupo en esa expresin)
Un valor de 0 devuelto por la funcin GROUPING basndose en una expresin indica una de
estas posibilidades:
Se ha utilizado la expresin para calcular el valor agregado.
El valor NULL de la columna de expresiones es un valor NULL almacenado.
Un valor de 1 devuelto por la funcin GROUPING basndose en una expresin indica una de
estas posibilidades:
No se ha utilizado la expresin 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

Introduccin a Oracle 10g: SQL Fundamentals II

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

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
3

Ejemplo de una Funcin GROUPING


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
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
las expresiones GROUPING(department_id) y GROUPING(job_id).
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
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
un valor de 1 para GROUPING(job_id). En la quinta fila, puede observar una salida
parecida.
En la ltima fila, observe el valor de resumen 54800 (etiquetado como 3). Es el salario total
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
y JOB_ID. As pues, se devuelve un valor de 1 para las expresiones
GROUPING(department_id) y GROUPING(job_id).

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

141

Introduccin 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 clusula GROUPING SETS y los resultados de
agrupamientos individuales se combinan con una
operacin UNION ALL.
Eficiencia de los juegos de agrupamientos:

Slo se requiere una transferencia sobre la tabla base.


No es necesario escribir sentencias UNION complejas.
Cuantos ms elementos tenga GROUPING SETS, mayor
ser la ventaja en el rendimiento.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

GROUPING SETS
GROUPING SETS es una extensin adicional de la clusula GROUP BY que se puede
utilizar para especificar varios agrupamientos de datos. Esto facilita una agregacin eficiente
y, por tanto, facilita el anlisis de datos en varias dimensiones.
Ahora se puede escribir una sola sentencia SELECT mediante GROUPING SETS para
especificar varios agrupamientos (que tambin pueden incluir operadores ROLLUP o CUBE),
en lugar de varias sentencias SELECT combinadas mediante los operadores UNION ALL.
Por ejemplo:
SELECT department_id, job_id, manager_id, AVG(salary)
FROM employees
GROUP BY
GROUPING SETS
((department_id, job_id, manager_id),
(department_id, manager_id),(job_id, manager_id));

Esta sentencia calcula agregados en tres agrupamientos:


(department_id, job_id, manager_id), (department_id,
manager_id) y (job_id, manager_id)
Sin esta funcin, se requieren varias consultas combinadas junto con UNION ALL para
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

Introduccin a Oracle 10g: SQL Fundamentals II

GROUPING SETS (continuacin)


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 slo 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.
CUBE y ROLLUP se pueden considerar juegos de agrupamientos con semntica muy
especfica. La siguiente equivalencia lo muestra:

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

CUBE(a, b, c)
es equivalente a

GROUPING SETS
((a, b, c), (a, b), (a, c), (b, c),
(a), (b), (c), ())

ROLLUP(a, b, c)

GROUPING SETS ((a, b, c), (a, b),(a), ())

es equivalente a

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

143

Introduccin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
2

GROUPING SETS: Ejemplo

La consulta de la diapositiva calcula agregados en los dos agrupamientos. La tabla se divide


en los siguientes grupos:
Identificadores de puesto, identificadores de supervisor
Identificadores de departamento, identificadores de puesto
Se calculan los salarios medios de cada uno de estos grupos. El juego de resultados muestra el
salario medio de cada uno de los dos grupos.
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
rdenes del supervisor 100 es de 17000.
El salario medio de todos los empleados con el identificador de puesto AD_MGR a las
rdenes del supervisor 101 es de 12000 y as sucesivamente.
El grupo marcado como 2 en la salida se interpreta como:
El salario medio de todos los empleados con el identificador de puesto FI_MGR del
departamento 100 es de 12000.
El salario medio de todos los empleados con el identificador de puesto FI_ACCOUNT
en el departamento 100 es de 7920 y as sucesivamente.

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

144

Introduccin a Oracle 10g: SQL Fundamentals II

GROUPING SETS: Ejemplo (continuacin)


El ejemplo de la diapositiva tambin 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
ejecucin, la consulta anterior necesitara dos exploraciones de la tabla base, EMPLOYEES.
Esto podra resultar muy ineficiente. Por tanto, se recomienda utilizar la sentencia
GROUPING SETS.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-16

145

Introduccin a Oracle 10g: SQL Fundamentals II

Columnas Compuestas

Una columna compuesta es una recopilacin de


columnas que se tratan como una unidad.
ROLLUP (a, (b,c) , d)

Utilice parntesis dentro de la clusula GROUP BY


para agrupar columnas, de modo que se traten
como una unidad al calcular operaciones ROLLUP
o CUBE.
La utilizacin de columnas compuestas con
ROLLUP o CUBE provocara el salto de la
agregacin en determinados niveles.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Columnas Compuestas
Una columna compuesta es una recopilacin de columnas que se tratan como una unidad
durante el clculo de agrupamientos. Especifique las columnas entre parntesis como en la
siguiente sentencia:
ROLLUP (a, (b, c), d)

Aqu, (b, c) forma una columna compuesta y se trata como una unidad. Por lo general, las
columnas compuestas son tiles en ROLLUP, CUBE y GROUPING SETS. Por ejemplo, en
CUBE o ROLLUP, las columnas compuestas provocaran el salto de la agregacin en
determinados niveles.
Es decir, GROUP BY ROLLUP(a, (b, c))es equivalente a
GROUP BY a, b, c UNION ALL
GROUP BY a UNION ALL
GROUP BY ()

Aqu, (b, c) se trata como una unidad y ROLLUP no se aplica en (b, c). Es como si se
tiene un alias, por ejemplo, z, para (b, c) y la expresin GROUP BY se reduce a
GROUP BY ROLLUP(a, z).
Nota: GROUP BY( ) normalmente es una sentencia SELECT con valores NULL para las
columnas a y b y slo la funcin agregada. Esto se utiliza generalmente para generar sumas
totales.
SELECT
NULL, NULL, aggregate_col
FROM
<table_name>
GROUP BY ( );

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

146

Introduccin a Oracle 10g: SQL Fundamentals II

Columnas Compuestas (continuacin)


Compare esto con la operacin ROLLUP normal, como en:
GROUP BY ROLLUP(a, b, c)

que sera
GROUP
GROUP
GROUP
GROUP

BY
BY
BY
BY

a, b, c UNION ALL
a, b UNION ALL
a UNION ALL
()

De forma parecida,
GROUP BY CUBE((a, b), c)

sera equivalente a
GROUP
GROUP
GROUP
GROUP

BY
BY
BY
BY

a, b, c UNION ALL
a, b UNION ALL
c UNION ALL
()

La siguiente tabla muestra una especificacin de juegos de agrupamientos y la especificacin


GROUP BY equivalente.

Sentencias GROUPING SETS

Sentencias GROUP BY Equivalentes

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

GROUP BY GROUPING SETS(a, b, c)

GROUP BY a UNION ALL


GROUP BY b UNION ALL
GROUP BY c

GROUP BY GROUPING SETS(a, b,(b, c))


(La expresin GROUPING SETS tiene una columna
compuesta).

GROUP BY a UNION ALL


GROUP BY b UNION ALL
GROUP BY b, c

GROUP BY GROUPING SETS((a, b, c))

GROUP BY a, b, c

GROUP BY GROUPING SETS(a, (b), ())

GROUP BY a UNION ALL


GROUP BY b UNION ALL
GROUP BY ()

GROUP BY GROUPING SETS


(a,ROLLUP(b, c))
(La expresin GROUPING SETS tiene
una columna compuesta).

GROUP BY a UNION ALL


GROUP BY ROLLUP(b, c)

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

147

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

1
2

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
4

Columnas Compuestas: Ejemplo


Observe el ejemplo:

SELECT department_id, job_id,manager_id, SUM(salary)


FROM
employees
GROUP BY ROLLUP( department_id,job_id, manager_id);

Esta consulta hace que Oracle Server calcule los siguientes agrupamientos:
1. (job_id, manager_id)
2. (department_id, job_id, manager_id)
3. (department_id)
4. Suma total
Si slo le interesan grupos especficos, no puede limitar el clculo a esos agrupamientos sin
utilizar columnas compuestas. Con las columnas compuestas, esto es posible si se trata las
columnas JOB_ID y MANAGER_ID como una unidad durante la acumulacin. Las columnas
entre parntesis se tratan como una unidad durante los clculos ROLLUP y CUBE. Esto se
ilustra en el ejemplo de la diapositiva. Al poner las columnas JOB_ID y MANAGER_ID entre
parntesis, le indica a Oracle Server que trate JOB_ID y MANAGER_ID como una unidad,
que es una columna compuesta.

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

148

Introduccin a Oracle 10g: SQL Fundamentals II

Columnas Compuestas: Ejemplo (continuacin)


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 tambin 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)
FROM
employees
GROUP BY ();

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

En ausencia de un optimizador que busque en los bloques de consulta para generar el plan de
ejecucin, la consulta anterior necesitara tres exploraciones de la tabla base, EMPLOYEES.
Esto podra resultar muy ineficiente. Por tanto, se recomienda utilizar columnas compuestas.

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

149

Introduccin 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
clusula GROUP BY.
El resultado es un producto combinado de
agrupamientos de cada juego de agrupamientos.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

GROUP BY GROUPING SETS(a, b), GROUPING SETS(c, d)

Columnas Concatenadas
Los agrupamientos concatenados ofrecen una forma concisa de generar combinaciones de
agrupamientos tiles. Para especificar los agrupamientos concatenados, se muestran varios
juegos de agrupamientos, cubos y acumulaciones, y se separan con comas. A continuacin se
ofrece un ejemplo de juegos de agrupamientos concatenados:
GROUP BY GROUPING SETS(a, b), GROUPING SETS(c, d)

Este ejemplo SQL define los siguientes agrupamientos:


(a, c), (a, d), (b, c), (b, d)

La concatenacin de juegos de agrupamientos es muy til por estos motivos:


Facilidad de desarrollo de consultas: No es necesario enumerar manualmente todos
los agrupamientos.
Uso por las aplicaciones: El SQL generado por aplicaciones OLAP suele implicar la
concatenacin de juegos de agrupamientos, en la que cada juego de agrupamientos
define los agrupamientos necesarios para una dimensin.

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

150

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

1
2
3

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Agrupamientos Concatenados: Ejemplo


El ejemplo de la diapositiva da como resultado los siguientes agrupamientos:
(job_id, manager_id) (1)
(department_id,job_id, manager_id) (2)
(job_id)(3)
(department_id,manager_id)(4)
(department_id) (5)
Se calcula el salario total de cada uno de estos grupos.

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

151

Introduccin a Oracle 10g: SQL Fundamentals II

Resumen

En esta leccin ha aprendido a utilizar:


La operacin ROLLUP para generar valores subtotales
La operacin CUBE para generar valores desde varias
tablas
La funcin 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 clusula GROUP BY para combinar expresiones de
diversos modos:

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Columnas compuestas
Juegos de agrupamientos concatenados

Resumen
ROLLUP y CUBE son extensiones de la clusula GROUP BY.
ROLLUP se utiliza para mostrar valores subtotales y la suma total.
CUBE se utiliza para mostrar valores desde varias tablas.
La funcin GROUPING le permite determinar si una fila es un agregado generado por un
operador CUBE o ROLLUP.
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
UNION ALL.
Dentro de la clusula GROUP BY, puede combinar expresiones de varias formas:-{}- Para especificar columnas compuestas, se agrupan las columnas entre parntesis,
de modo que Oracle Server las trate como una unidad al calcular operaciones
ROLLUP o CUBE.
- Para especificar 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 clusula GROUP BY. El resultado es un producto
combinado de agrupamientos de cada juego de agrupamientos.

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

152

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 4: Visin General


Esta prctica trata sobre el uso de:
Operadores ROLLUP
Operadores CUBE
Funciones GROUPING
GROUPING SETS

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Prctica 4: Visin General


En esta practica, utilizar los operadores ROLLUP y CUBE como extensiones de la clusula
GROUP BY. Utilizar tambin GROUPING SETS.

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

153

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 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 estn a las rdenes del mismo supervisor
- Salario total de esos supervisores
- Salario total de esos supervisores, independientemente de los identificadores de
puesto

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

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

154

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 4 (continuacin)
2. Observe la salida de la pregunta 1. Escriba una consulta mediante la funcin
GROUPING para determinar si los valores NULL de las columnas correspondientes a
las expresiones GROUP BY los genera la operacin ROLLUP.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-26

155

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 4 (continuacin)
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 estn 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-27

156

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 4 (continuacin)
4. Observe la salida de la pregunta 3. Escriba una consulta mediante la funcin
GROUPING para determinar si los valores NULL en las columnas correspondientes a
las expresiones GROUP BY los genera la operacin CUBE.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

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

157

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 4 (continuacin)
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.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

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

158

Introduccin a Oracle 10g: SQL Fundamentals II

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 4-30

159

Introduccin a Oracle 10g: SQL Fundamentals II

Gestin de Datos en Zonas Horarias Diferentes

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
160

Introduccin a Oracle 10g: SQL Fundamentals II

Objetivos
Al final de esta leccin, debera 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Objetivos
Esta leccin trata algunas de las funciones de fecha/hora disponibles en la base de
datos Oracle.

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

161

Introduccin a Oracle 10g: SQL Fundamentals II

Zonas Horarias

+07:00

-08:00

+02:00

+10:00

-05:00

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

La imagen representa la hora para


cada zona horaria cuando son las
12:00 en Greenwich.

Zonas Horarias
Las horas del da se miden segn la rotacin de la Tierra. La hora en cualquier momento
concreto depende del lugar en el que se est. Cuando son las doce del medioda en
Greenwich, Inglaterra, es medianoche en toda la lnea de fecha internacional. La Tierra se
divide en 24 zonas horarias, una para cada hora del da. La hora a lo largo del meridiano de
Greenwich, Inglaterra, se conoce como Hora del Meridiano de Greenwich, o GMT. GMT es
el estndar horario que sirve de referencia al resto de zonas horarias del mundo. Es la misma
durante todo el ao y no se ve afectada por el horario de invierno o de verano. El meridiano es
una lnea imaginaria que va del Polo Norte al Polo Sur. Se conoce como longitud cero y es la
lnea a partir de la cual se miden todas las dems lneas de longitud. Todas las horas se miden
en relacin 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).

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

162

Introduccin a Oracle 10g: SQL Fundamentals II

Parmetro de Sesin 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 regin especificada
SESSION
SESSION
SESSION
SESSION

ALTER
ALTER
ALTER
ALTER

SET
SET
SET
SET

TIME_ZONE
TIME_ZONE
TIME_ZONE
TIME_ZONE

=
=
=
=

'-05:00';
dbtimezone;
local;
'America/New_York';

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Parmetro de Sesin TIME_ZONE


La base de datos Oracle soporta el almacenamiento de la zona horaria en sus datos de fecha y
hora, adems de en fracciones de segundo. El comando ALTER SESSION se puede utilizar
para cambiar los valores de zona horaria en una sesin de usuario. Los valores de zona horaria
se pueden definir en un offset absoluto, una zona horaria especificada, una zona horaria de
base de datos o la zona horaria local.

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

163

Introduccin 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 sesin de


usuario
Tiene un tipo de datos TIMESTAMP

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

CURRENT_DATE, CURRENT_TIMESTAMP y LOCALTIMESTAMP


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
tipo de datos de CURRENT_TIMESTAMP es TIMESTAMP WITH TIME ZONE. Los valores
devueltos muestran el desplazamiento de zona horaria de la sesin SQL que ejecuta las
funciones. El desplazamiento de zona horaria es la diferencia (en horas y minutos) entre la
hora local y UTC. El tipo de datos TIMESTAMP WITH TIME ZONE tiene el formato:
TIMESTAMP [ (fractional_seconds_precision) ] WITH TIME ZONE
donde fractional_seconds_precision especifica opcionalmente el nmero de
dgitos de la parte fraccional del campo de fecha/hora SECOND y puede ser un nmero en el
rango de 0 a 9. El valor por defecto es 6.
La funcin LOCALTIMESTAMP devuelve la fecha y la hora actuales de la zona horaria de la
sesin. La diferencia entre LOCALTIMESTAMP y CURRENT_TIMESTAMP es que
LOCALTIMESTAMP devuelve un valor TIMESTAMP, mientras que CURRENT_TIMESTAMP
devuelve un valor TIMESTAMP WITH TIME ZONE.
Estas funciones son sensibles a NLS, es decir, los resultados estarn en los formatos de
fecha/hora y de calendario NLS actuales.

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

164

Introduccin a Oracle 10g: SQL Fundamentals II

CURRENT_DATE
Muestre la fecha y la hora actuales de la zona horaria
de la sesin.
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';


SELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL;

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

CURRENT_DATE
La funcin CURRENT_DATE devuelve la fecha actual de la zona horaria de la sesin. El valor
de retorno es una fecha del calendario gregoriano.
Los ejemplos de la diapositiva ilustran que CURRENT_DATE es sensible a la zona horaria de
la sesin. En el primer ejemplo, la sesin se modifica para definir el parmetro TIME_ZONE
en 5:0. El parmetro TIME_ZONE especifica el desplazamiento de zona horaria local por
defecto para la sesin SQL actual. TIME_ZONE es slo un parmetro de la sesin, y no un
parmetro de inicializacin. El parmetro TIME_ZONE se define del modo siguiente:
TIME_ZONE = '[+ | -] hh:mm'
La mscara de formato ([+ | -] hh:mm) indica las horas y los minutos antes o despus
de UTC (Hora Universal Coordinada, lo que antes se conoca como Hora del Meridiano
de Greenwich).
Observe en la salida que el valor de CURRENT_DATE cambia cuando el valor del parmetro
TIME_ZONE se cambia a 8:0 en el segundo ejemplo.
Nota: El comando ALTER SESSION define el formato de fecha de la sesin en
'DD-MON-YYYY HH24:MI:SS' que es da del mes (1-31)-nombre abreviado del mesao con 4 dgitos hora del da (0-23):minuto (0-59):segundo (0-59).

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

165

Introduccin a Oracle 10g: SQL Fundamentals II

CURRENT_TIMESTAMP
Muestre la fecha y la hora fraccional actuales de la
zona horaria de la sesin.
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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

CURRENT_TIMESTAMP
La funcin CURRENT_TIMESTAMP devuelve la fecha y la hora actuales de la zona horaria
de la sesin, como valor del tipo de datos TIMESTAMP WITH TIME ZONE. El
desplazamiento de zona horaria refleja la hora local actual de la sesin SQL. La sintaxis de la
funcin CURRENT_TIMESTAMP es:
CURRENT_TIMESTAMP (precision)

donde precision es un argumento opcional que especifica la precisin en fracciones de


segundo del valor horario devuelto. Si omite la precisin, el valor por defecto es 6.
El ejemplo de la diapositiva ilustra que CURRENT_TIMESTAMP es sensible a la zona horaria
de la sesin. En el primer ejemplo, la sesin se modifica para definir el parmetro
TIME_ZONE en 5:0. Observe en la salida que el valor de CURRENT_TIMESTAMP cambia
cuando el valor del parmetro TIME_ZONE se cambia a 8:0 en el segundo ejemplo.

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

166

Introduccin a Oracle 10g: SQL Fundamentals II

LOCALTIMESTAMP

Muestre la fecha y la hora actuales en la zona horaria


de la sesin 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;

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

LOCALTIMESTAMP devuelve un valor TIMESTAMP,


mientras que CURRENT_TIMESTAMP devuelve un valor
TIMESTAMP WITH TIME ZONE.

LOCALTIMESTAMP
La funcin LOCALTIMESTAMP devuelve la fecha y la hora actuales en la zona horaria de la
sesin. LOCALTIMESTAMP devuelve un valor TIMESTAMP. La sintaxis de la funcin
LOCAL_TIMESTAMP es:
LOCAL_TIMESTAMP (TIMESTAMP_precision)
donde TIMESTAMP precision es un argumento opcional que especifica la precisin en
fracciones de segundo del valor de TIMESTAMP devuelto.
Los ejemplos de la diapositiva ilustran la diferencia entre LOCALTIMESTAMP y
CURRENT_TIMESTAMP. Observe que LOCALTIMESTAMP no muestra el valor de la zona
horaria, mientras que CURRENT_TIMESTAMP s.

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

167

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


SELECT SESSIONTIMEZONE FROM DUAL;

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

DBTIMEZONE y SESSIONTIMEZONE
El DBA define la zona horaria por defecto de la base de datos especificando la clusula SET
TIME_ZONE de la sentencia CREATE DATABASE. Si se omite, la zona horaria por defecto de
la base de datos es la del sistema operativo. La zona horaria de la base de datos no se puede
cambiar para una sesin con una sentencia ALTER SESSION.
La funcin DBTIMEZONE devuelve el valor de la zona horaria de la base de datos. El tipo de
retorno es un offset de zona horaria (un tipo de carcter del formato '[+|-]TZH:TZM') o un
nombre de regin de zona horaria, dependiendo de cmo haya especificado el usuario el valor de
zona horaria de la base de datos en las sentencias CREATE DATABASE o ALTER DATABASE
ms recientes. El ejemplo de la diapositiva muestra que la zona horaria de la base de datos se
define en "05:00", ya que el parmetro TIME_ZONE est en el formato:
TIME_ZONE =
'[+ | -] hh:mm'
La funcin SESSIONTIMEZONE devuelve el valor de la zona horaria de la sesin actual. El tipo
de retorno es un offset de zona horaria (un tipo de carcter del formato '[+|-]TZH:TZM') o un
nombre de regin de zona horaria, dependiendo de cmo haya especificado el usuario el valor de
zona horaria de la sesin en la sentencia ALTER SESSION ms reciente. El ejemplo de la
diapositiva muestra que la zona horaria de la sesin tiene un offset con respecto a UTC de 8
horas Observe que la zona horaria de la base de datos es diferente a la de la sesin actual.

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

168

Introduccin a Oracle 10g: SQL Fundamentals II

Tipo de Datos TIMESTAMP

El tipo de datos TIMESTAMP es una extensin del


tipo de datos DATE.
Almacena el ao, el mes y el da del tipo de datos
DATE, ms 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


TIMESTAMP

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

[(fractional_seconds_precision)]_
WITH LOCAL TIME ZONE

Tipos de Datos de Fecha/Hora


El tipo de datos TIMESTAMP contiene los campos de fecha/hora YEAR, MONTH, DAY, HOUR,
MINUTE y SECOND, y fracciones de segundo.
El tipo de datos TIMESTAMP WITH TIME ZONE contiene los campos de fecha/hora
HOUR, MINUTE, SECOND, TIMEZONE_HOUR y TIMEZONE_MINUTE, y fracciones
de segundo.
El tipo de datos TIMESTAMP WITH TIME ZONE contiene los campos de fecha/hora
YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, TIMEZONE_HOUR y
TIMEZONE_MINUTE, y fracciones de segundo.
Nota: La precisin de fracciones de segundo especifica el nmero de dgitos de la parte
fraccional del campo de fecha/hora SECOND y puede ser un nmero del rango de 0 a 9. El
valor por defecto es 6.

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

169

Introduccin a Oracle 10g: SQL Fundamentals II

Tipos de Datos TIMESTAMP

Tipo de Datos
TIMESTAMP

Campos
YEAR, MONTH, DAY, HOUR, MINUTE,
SECOND con fracciones de segundo
YEAR, MONTH, DAY, HOUR, MINUTE,
SECOND con fracciones de segundo,
TIMEZONE_HOUR y TIMEZONE_
MINUTE o TIMEZONE_REGION

TIMESTAMP WITH LOCAL


TIME ZONE

YEAR, MONTH, DAY, HOUR, MINUTE,


SECOND con fracciones de segundo

TIMESTAMP WITH TIME


ZONE

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Tipos de Datos TIMESTAMP


TIMESTAMP (fractional_seconds_precision)

Este tipo de datos contiene los valores de fecha de ao, mes y da, adems de los valores
de hora, minuto y segundo, donde la precisin de fracciones de segundo es el nmero de
dgitos de la parte fraccional del campo de fecha/hora SECOND. Los valores aceptados de
fractional_seconds_precision significativos son de 0 a 9. El valor por
defecto es 6.
TIMESTAMP (fractional_seconds_precision) WITH TIME ZONE

Este tipo de datos contiene todos los valores de TIMESTAMP adems del valor de
desplazamiento de zona horaria.
TIMESTAMP (fractional_seconds_precision) WITH LOCAL TIME ZONE

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
base de datos.
Cuando se recuperan los datos, los usuarios los ven en la zona horaria de la sesin.

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

170

Introduccin a Oracle 10g: SQL Fundamentals II

Campos TIMESTAMP

Valores Vlidos

YEAR

De 4712 a 9999 (excluido el ao 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 precisin

TIMEZONE_HOUR

De 12 a 14

TIMEZONE_MINUTE

De 00 a 59

Campo de Fecha/Hora

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Campos TIMESTAMP

Cada tipo de datos de fecha/hora est compuesto por varios de estos campos. Las fechas/horas
son asignables y comparables mutuamente slo si tienen los mismos campos de fecha/hora.

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

171

Introduccin a Oracle 10g: SQL Fundamentals II

Diferencia entre DATE y TIMESTAMP


A

-- when hire_date is
of type DATE

ALTER TABLE emp5


MODIFY hire_date TIMESTAMP;

SELECT hire_date
FROM emp5;

SELECT hire_date
FROM emp5;

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Tipo de Datos TIMESTAMP: Ejemplo


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
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
tiene datos, pero no se puede convertir de DATE o TIMESTAMP a TIMESTAMP WITH
TIME ZONE a menos que la columna est vaca.
Puede especificar la precisin en fracciones de segundo para el registro de hora. Si no se
especifica ninguna, como en el ejemplo anterior, toma el valor por defecto de 6.
Por ejemplo, la siguiente sentencia define la precisin de fracciones de segundo en 7:
ALTER TABLE emp5
MODIFY hire_date TIMESTAMP(7);

Nota: El tipo de datos de fecha de Oracle por defecto aparece como se muestra en el ejemplo.
Sin embargo, el tipo de datos de fecha tambin contiene informacin adicional como horas,
minutos, segundos, a.m. y p.m. Para obtener la fecha en este formato, puede aplicar una
mscara de formato o una funcin al valor de fecha.

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

172

Introduccin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Tipo de Datos TIMESTAMP WITH TIME ZONE

UTC son las siglas en ingls de Hora Universal Coordinada (lo que antes se conoca como
Hora del Meridiano de Greenwich). Dos valores TIMESTAMP WITH TIME ZONE se
consideran idnticos si representan el mismo instante en UTC, independientemente de los
offsets TIME ZONE almacenados en los datos. Por ejemplo:
TIMESTAMP '1999-04-15 8:00:00 -8:00'
es lo mismo que
TIMESTAMP '1999-04-15 11:00:00 -5:00'.

Es decir, 8:00 a.m. Hora Oficial del Pacfico es lo mismo que 11:00 a.m. Hora Oficial
Oriental.
Tambin se puede especificar como:
TIMESTAMP '1999-04-15 8:00:00 US/Pacific'

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

173

Introduccin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

TIMESTAMP WITH TIME ZONE: Ejemplo

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
un pedido por Web (web_order). El registro de hora y la zona horaria del usuario que
realiza el pedido se inserta basndose en el valor de CURRENT_DATE. De este modo, una
compaa basada en Web garantiza el envo y puede estimar su tiempo de entrega basndose
en la zona horaria de la persona que realiza el pedido.

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

174

Introduccin 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 sesin local del usuario.
El tipo de datos TIMESTAMP WITH LOCAL TIME
ZONE se especifica as:

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

TIMESTAMP[(fractional_seconds_precision)]
WITH LOCAL TIME ZONE

TIMESTAMP WITH LOCAL TIMEZONE

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
desplazamiento de zona horaria es la diferencia (en horas y minutos) entre la hora local y
UTC. No hay ningn literal para TIMESTAMP WITH LOCAL TIME ZONE.

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

175

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

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

TIMESTAMP WITH LOCAL TIME ZONE: Ejemplo


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
en ella dos das 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
horaria. El comando ALTER SESSION se emite para cambiar la zona horaria a la zona
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
cliente la hora de entrega estimada.

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

176

Introduccin 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:
Ao-mes
Da-hora

La precisin del intervalo:


Es el subjuego real de campos que componen un
intervalo
Se especifica en el cualificador de intervalo
Campos

INTERVAL YEAR TO MONTH

YEAR, MONTH

INTERVAL DAY TO SECOND

DAY, HOUR, MINUTE, SECOND con


fracciones de segundo

Tipo de Datos

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

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: intervalos ao-mes e intervalos da-hora. Un
intervalo ao-mes se compone de un subjuego contiguo de campos YEAR y MONTH, mientras
que un intervalo da-hora se compone de un subjuego contiguo de campos DAY, HOUR,
MINUTE y SECOND. El subjuego real de campos que componen un intervalo se denomina
precisin del intervalo y se especifica en el cualificador de intervalo. Como el nmero de das
de un ao depende del calendario, el intervalo ao-mes es dependiente de NLS, mientras que
el intervalo da-hora es independiente de NLS.
El cualificador de intervalo tambin puede especificar la precisin del campo inicial, que es el
nmero de dgitos del campo inicial o nico (que en caso del campo final es SECOND)
tambin puede especificar la precisin de fracciones de segundo, que es el nmero de dgitos
de la parte fraccional del valor SECOND. Si no se especifica, el valor por defecto para la
precisin de campo inicial es de 2 dgitos y el valor por defecto para la precisin de fracciones
de segundo es de 6 dgitos

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

177

Introduccin a Oracle 10g: SQL Fundamentals II

Tipos de Datos INTERVAL (continuacin)


INTERVAL YEAR (year_precision) TO MONTH
Este tipo de datos almacena un perodo de tiempo en aos y meses, mientras que
year_precision es el nmero de dgitos 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 perodo de tiempo en das, horas, minutos y segundos, donde
day_precision es el nmero mximo de dgitos 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 nmero de dgitos de la parte fraccional del campo SECOND. Los valores
aceptados son de 0 a 9. El valor por defecto es 6.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-19

178

Introduccin a Oracle 10g: SQL Fundamentals II

Campos INTERVAL

Campo INTERVAL Valores Vlidos 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 precisin

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Campos INTERVAL
INTERVAL YEAR TO MONTH puede tener campos YEAR y MONTH.
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
intervalo se define mediante un cualificador de intervalo y este subjuego se conoce como
precisin del elemento.
Los intervalos ao-mes son asignables y comparables mutuamente slo con otros intervalos
ao-mes y los intervalos da-hora son asignables y comparables mutuamente slo con otros
intervalos da-hora.

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

179

Introduccin a Oracle 10g: SQL Fundamentals II

Tipo de Datos INTERVAL YEAR TO MONTH


INTERVAL YEAR TO MONTH almacena un perodo 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

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Indicates an interval of 3 months

Tipo de Datos INTERVAL YEAR TO MONTH


INTERVAL YEAR TO MONTH almacena un perodo de tiempo mediante los campos de
fecha/hora YEAR y MONTH. Especifique INTERVAL YEAR TO MONTH del siguiente modo:
INTERVAL YEAR [(year_precision)] TO MONTH
donde year_precision es el nmero de dgitos del campo de fecha/hora YEAR. El valor
por defecto de year_precision es 2.
Restriccin: El campo inicial debe ser ms significativo que el campo final. Por ejemplo,
INTERVAL '0-1' MONTH TO YEAR no es vlido.
El siguiente literal INTERVAL YEAR TO MONTH indica un intervalo de 123 aos
y 3 meses:
INTERVAL '123-3' YEAR(3) TO MONTH
INTERVAL '123' YEAR(3) indica un intervalo de 123 aos y 0 meses.
INTERVAL '3' MONTH indica un intervalo de 3 meses.

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

180

Introduccin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Tipo de Datos INTERVAL YEAR TO MONTH (continuacin)


INTERVAL YEAR TO MONTH almacena un perodo de tiempo mediante los campos de
fecha/hora YEAR y MONTH. Especifique INTERVAL YEAR TO MONTH del siguiente modo:
INTERVAL YEAR [(year_precision)] TO MONTH
donde year_precision es el nmero de dgitos del campo de fecha/hora YEAR. El valor
por defecto de year_precision es 2.

Restriccin: El campo inicial debe ser ms significativo que el campo final. Por ejemplo,
INTERVAL '0-1' MONTH TO YEAR no es vlido.
La base de datos Oracle soporta dos tipos de datos de intervalo: INTERVAL YEAR TO
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
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
los dos tipos soportados.
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
insertan en ella valores diferentes para indicar aos y meses para diversos productos. Cuando
se recuperan estas filas de la tabla, se ve que un valor de mes ha desplazado el valor de ao
mediante un (-)
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-22

181

Introduccin a Oracle 10g: SQL Fundamentals II

Tipo de Datos INTERVAL DAY TO SECOND


INTERVAL DAY TO SECOND
(fractional_seconds_precision) almacena un
perodo de tiempo en das, 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


0

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Indicates an interval of 6 days and 0 hours,


minutes and 0 seconds

Tipo de Datos INTERVAL DAY TO SECOND


INTERVAL DAY (day_precision) TO SECOND (fractional_seconds_
precision) almacena un perodo de tiempo en das, horas, minutos y segundos, donde
day_precision es el nmero mximo de dgitos 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 nmero de dgitos de la parte fraccional del
campo SECOND. Los valores aceptados son de 0 a 9. El valor por defecto es 6.
En el ejemplo anterior, 6 representa el nmero de das y 03:30:15 indica los valores para
horas, minutos y segundos.

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

182

Introduccin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Tipo de Datos INTERVAL DAY TO SECOND: Ejemplo


En el ejemplo anterior, est creando la tabla de prcticas con una columna test_time del
tipo de datos INTERVAL DAY TO SECOND. Inserte en ella a continuacin el valor
90 00:00:00 para indicar 90 das, 0 horas, 0 minutos y 0 segundos e INTERVAL
'6 03:30:16' DAY TO SECOND. La sentencia SELECT ilustra cmo se muestran estos
datos en la base de datos.

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

183

Introduccin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

EXTRACT
La expresin EXTRACT extrae y devuelve el valor de un campo de fecha/hora especificado de
una expresin de valor de fecha/hora o intervalo. Puede extraer cualquiera de los
componentes mencionados en la siguiente sintaxis mediante la funcin EXTRACT. La sintaxis
de la funcin EXTRACT es:
SELECT

EXTRACT ([YEAR] [MONTH][DAY] [HOUR] [MINUTE][SECOND]


[TIMEZONE_HOUR] [TIMEZONE_MINUTE]
[TIMEZONE_REGION] [TIMEZONE_ABBR]
FROM [datetime_value_expression] [interval_value_expression]);

Al extraer TIMEZONE_REGION o TIMEZONE_ABBR (abreviatura), el valor devuelto es una


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
realizar una extraccin de una fecha/hora con un valor de zona horaria, el valor devuelto est
en UTC.
En el primer ejemplo de la diapositiva, la funcin EXTRACT se utiliza para extraer el ao
(YEAR) de SYSDATE. En el segundo ejemplo de la diapositiva, la funcin EXTRACT se
utiliza para extraer el mes (MONTH) de la columna HIRE_DATE de la tabla EMPLOYEES,
para los empleados que estn bajo las rdenes del supervisor cuyo EMPLOYEE_ID es 100.

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

184

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

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

SELECT TZ_OFFSET('Europe/London') FROM DUAL;

TZ_OFFSET
La funcin 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.
Por ejemplo, si la funcin 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
un nombre vlido de zona horaria, un offset de zona horaria desde UTC (que simplemente se
devuelve a s mismo) o las palabras clave SESSIONTIMEZONE o DBTIMEZONE. La sintaxis
de la funcin TZ_OFFSET es:
TZ_OFFSET ( ['time_zone_name'] '[+ | -] hh:mm' ]
[ SESSIONTIMEZONE] [DBTIMEZONE]
Fold Motor Company tiene las oficinas centrales en Michigan, EE.UU., que est en la zona
horaria US/Eastern. El presidente de la compaa, Mr. Fold, desea realizar una conferencia
telefnica con el vicepresidente de operaciones canadienses y el vicepresidente de
operaciones europeas, que estn en las zonas horarias Canada/Yukon y Europe/London,
respectivamente. Mr. Fold quiere conocer la hora en cada uno de estos lugares para asegurarse
de que los supervisores senior podrn asistir a la reunin. Para ayudarle, su secretario, Mr.
Scott, emite las consultas que se muestran en el ejemplo y obtiene los siguientes resultados:
En la zona horaria 'US/Eastern' son cuatro horas menos que en UTC.
En la zona horaria 'Canada/Yukon' son siete horas menos que en UTC.
En la zona horaria 'Europe/London' es una hora ms que en UTC.

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

185

Introduccin a Oracle 10g: SQL Fundamentals II

TZ_OFFSET (continuacin)
Para obtener un listado de valores de nombres de zona horaria vlidos, puede consultar la
vista de rendimiento dinmica V$TIMEZONE_NAMES.
SELECT * FROM V$TIMEZONE_NAMES;

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

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

186

Introduccin a Oracle 10g: SQL Fundamentals II

Conversin 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
regin de zona horaria 'Australia/North'.

SELECT FROM_TZ(TIMESTAMP
'2000-03-28 08:00:00', 'Australia/North')
FROM DUAL;

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Conversin de TIMESTAMP mediante FROM_TZ


La funcin FROM_TZ convierte un valor TIMESTAMP a un valor TIMESTAMP WITH
TIME ZONE.
La sintaxis de la funcin FROM_TZ es la siguiente:
FROM_TZ(TIMESTAMP timestamp_value, time_zone_value)
donde time_zone_value es una cadena de caracteres con formato 'TZH:TZM' o una
expresin de carcter que devuelve una cadena en TZR (regin de zona horaria) con formato
TZD opcional. TZD es una cadena de zona horaria abreviada con informacin de horario de
verano. TZR representa la regin de zona horaria en cadenas de entrada de fecha/hora.
Algunos ejemplos son 'Australia/North', 'PST' para la hora oficial del
Pacfico/EE.UU. y 'PDT' para la hora en horario de verano del Pacfico/EE.UU., etc. Para
ver un listado de valores vlidos para los elementos con formato TZR y TZD, consulte la vista
de rendimiento dinmica V$TIMEZONE_NAMES.
El ejemplo de la diapositiva convierte un valor TIMESTAMP a TIMESTAMP WITH
TIME ZONE.

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

187

Introduccin a Oracle 10g: SQL Fundamentals II

Conversin 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')
FROM DUAL;

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Conversin a TIMESTAMP mediante TO_TIMESTAMP y TO_TIMESTAMP_TZ


La funcin 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 funcin
TO_TIMESTAMP es:
TO_TIMESTAMP (char,[fmt],['nlsparam'])
El parmetro fmt opcional especifica el formato de char si se omite. La cadena debe estar
en el formato del tipo de datos TIMESTAMP. El parmetro opcional nlsparam especifica el
idioma en que se devolvern los nombres y las abreviaturas de mes y de da. Este argumento
puede tener esta forma:
'NLS_DATE_LANGUAGE = language'
Si omite nlsparams, esta funcin utiliza el idioma de fecha por defecto para la sesin. El
ejemplo de la diapositiva convierte una cadena de caracteres a un valor TIMESTAMP.
La funcin TO_TIMESTAMP_TZ convierte una cadena de tipo de datos CHAR, VARCHAR2,
NCHAR o NVARCHAR2 a un valor del tipo de datos TIMESTAMP WITH TIME ZONE. La
sintaxis de la funcin TO_TIMESTAMP_TZ es:
TO_TIMESTAMP_TZ (char,[fmt],['nlsparam'])
El parmetro opcional fmt especifica el formato de char. Si se omite, una cadena debe
estar en el formato por defecto del tipo de datos TIMESTAMP WITH TIME ZONE. El
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

Introduccin a Oracle 10g: SQL Fundamentals II

Conversin de Intervalo de Tiempo con


TO_YMINTERVAL
Muestre una fecha que sea posterior en un ao y dos
meses a la fecha de contratacin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Conversin de Intervalo de Tiempo con TO_YMINTERVAL


La funcin 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
INTERVAL YEAR TO MONTH almacena un perodo de tiempo mediante los campos de
fecha/hora YEAR y MONTH: El formato de INTERVAL YEAR TO MONTH es el siguiente:
INTERVAL YEAR [(year_precision)] TO MONTH
donde year_precision es el nmero de dgitos del campo de fecha/hora YEAR. El valor
por defecto de year_precision es 2.
La sintaxis de la funcin TO_YMINTERVAL es:
TO_YMINTERVAL (char)
donde char es la cadena de caracteres que se va a convertir.
En el ejemplo de la diapositiva se calcula una fecha posterior en un ao y dos meses a la fecha
de contratacin del empleado que trabaja en el departamento 20 de la tabla EMPLOYEES.
Tambin se puede realizar un clculo inverso mediante la funcin TO_YMINTERVAL.
Por ejemplo:
SELECT hire_date, hire_date + TO_YMINTERVAL('-02-04') AS
HIRE_DATE_YMINTERVAL
FROM EMPLOYEES WHERE department_id = 20;
Observe que la cadena de caracteres transferida a la funcin TO_YMINTERVAL tiene
un valor negativo. El ejemplo devuelve una fecha anterior en dos aos y cuatro meses a
la fecha de contratacin 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

Introduccin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

TO_DSINTERVAL
TO_DSINTERVAL convierte una cadena de caracteres de tipo de datos CHAR, VARCHAR2,
NCHAR o NVARCHAR2 a un tipo INTERVAL DAY TO SECOND.
En el ejemplo anterior, se obtiene una fecha posterior en 100 das y 10 horas a la fecha
de contratacin.
TO_YMINTERVAL
La funcin TO_YMINTERVAL convierte una cadena de caracteres de tipo de datos CHAR,
VARCHAR2, NCHAR o NVARCHAR2 a un tipo INTERVAL YEAR TO MONTH.
En el siguiente ejemplo, se obtiene una fecha posterior en un ao y dos meses a la fecha
de contratacin.
SELECT hire_date, hire_date + TO_YMINTERVAL('01-02') ytm
FROM employees;
HIRE_DATE
--------17-JUN-87
21-SEP-89
13-JAN-93
03-JAN-90
21-MAY-91

YTM
--------17-AUG-88
21-NOV-90
13-MAR-94
03-MAR-91
21-JUL-92

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

190

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

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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

DST (Horario de Verano)


La mayora de las naciones occidentales adelanta el reloj una hora en los meses de verano.
Este perodo se denomina horario de verano. El horario de verano se extiende desde el primer
domingo de abril al ltimo domingo de octubre en la mayor parte de Estados Unidos, Mxico
y Canad. Las naciones de la Unin Europea tambin utilizan el horario de verano. El horario
de verano de Europa comienza una semana antes que en Norteamrica, pero termina a la vez.
La base de datos Oracle determina automticamente, para cualquier regin de zona horaria, si
el horario de verano est en vigor y devuelve los valores de hora local de la manera
correspondiente. El valor de fecha/hora es suficiente para que la base de datos Oracle
determine si el horario de verano est en vigor en una regin determinada en todos los casos,
excepto en la hora del cambio. La hora del cambio se produce durante el perodo en que el
horario de verano entra en vigor o deja de estar en vigor. Por ejemplo, en la regin oriental de
EE.UU., cuando el horario de verano entra en vigor, la hora cambia de 01:59:59 a.m. a
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
intervalo de una hora entre 01:00:01 y 02:00:00 a.m. se repite.

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

191

Introduccin a Oracle 10g: SQL Fundamentals II

DST (Horario de Verano) (continuacin)


ERROR_ON_OVERLAP_TIME
ERROR_ON_OVERLAP_TIME es un parmetro de sesin para notificar al sistema que emita
un error cuando encuentre una fecha/hora que se produzca en el perodo superpuesto y no se
ha especificado ninguna abreviatura de zona para distinguir el perodo.
Por ejemplo, si el horario de verano termina el 31 de octubre, a las 02:00:01 a.m., los perodos
superpuestos seran:
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 perodos, debe
especificar la abreviatura de zona horaria (por ejemplo, EDT o EST) en la cadena de entrada
para que el sistema determine el perodo. Sin esta abreviatura de zona horaria, el sistema har
lo siguiente:
Si el parmetro 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-33

192

Introduccin a Oracle 10g: SQL Fundamentals II

Resumen
En esta leccin, ha aprendido a utilizar estas
funciones:
CURRENT_DATE
TZ_OFFSET
CURRENT_TIMESTAMP
FROM_TZ
LOCALTIMESTAMP
TO_TIMESTAMP
TO_TIMESTAMP_TZ DBTIMEZONE
SESSIONTIMEZONE
TO_YMINTERVAL
EXTRACT

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Resumen
Esta leccin ha tratado algunas de las funciones de fecha/hora disponibles en la base de
datos Oracle.

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

193

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 5: Visin General


Esta prctica cubre el uso de las funciones de
fecha/hora.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Prctica 5: Visin General


En esta prctica, mostrar los offsets de zona horaria, CURRENT_DATE, CURRENT_
TIMESTAMP y LOCALTIMESTAMP. Tambin definir zonas horarias y utilizar la funcin
EXTRACT.

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

194

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 5
1. Modifique la sesin 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 sesin para definir el valor del parmetro TIME_ZONE en el offset


de zona horaria US/Pacific-New.
c. Muestre los valores de CURRENT_DATE, CURRENT_TIMESTAMP y
LOCALTIMESTAMP para esta sesin.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
d. Modifique la sesin para definir el valor del parmetro TIME_ZONE en el offset
de zona horaria Singapore.
e. Muestre los valores de CURRENT_DATE, CURRENT_TIMESTAMP y
LOCALTIMESTAMP para esta sesin.
Nota: La salida podra ser diferente, segn la fecha en que se ejecute
el comando.

Nota: Observe en la prctica anterior que CURRENT_DATE,


CURRENT_TIMESTAMP y LOCALTIMESTAMP son todos sensibles a la zona
horaria de la sesin.

3. Escriba una consulta para mostrar los valores de DBTIMEZONE y


SESSIONTIMEZONE.

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

195

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 5 (continuacin)
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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

5. Modifique la sesin para definir NLS_DATE_FORMAT en DD-MON-YYYY.

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

196

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 5 (continuacin)
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 cmbielo a TIMESTAMP.


Seleccione en la tabla para ver los datos.

c. Intente modificar el tipo de datos de la columna DATE_COL y cmbielo a


TIMESTAMP WITH TIME ZONE. Qu sucede?

7. Cree una consulta para recuperar apellidos de la tabla EMPLOYEES y calcule el


estado de revisin. Si el ao de contratacin fue 2000, muestre Needs Review para
el estado de revisin; de lo contrario, muestre not this year!. Asigne a la
columna de estado de revisin el nombre Review. Ordene los resultados por la
columna HIRE_DATE.
Indicacin: Utilice una expresin CASE con la funcin EXTRACT para calcular el
estado de revisin.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

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

197

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 5 (continuacin)
8. Cree una consulta para imprimir los apellidos y el nmero de aos de servicio para
cada empleado. Si el empleado lleva contratado cinco aos o ms, imprima 5 years
of service. Si el empleado lleva contratado 10 aos o ms, imprima 10 years
of service. Si el empleado lleva contratado 15 aos o ms, 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.
Indicacin: Utilice TO_YMINTERVAL y expresiones CASE.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-39

198

Introduccin a Oracle 10g: SQL Fundamentals II

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 5-40

199

Introduccin a Oracle 10g: SQL Fundamentals II

Recuperacin de Datos mediante Subconsultas

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
200

Introduccin a Oracle 10g: SQL Fundamentals II

Objetivos

Al finalizar esta leccin, debera 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 clusula WITH

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Objetivos
En esta leccin, aprender a escribir subconsultas de varias columnas, as como subconsultas
en la clusula FROM de una sentencia SELECT. Tambin aprender a solucionar problemas
mediante subconsultas escalares correlacionadas y la clusula WITH.

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

201

Introduccin a Oracle 10g: SQL Fundamentals II

Subconsultas de Varias Columnas

Consulta principal
WHERE (MANAGER_ID, DEPARTMENT_ID) IN

Subconsulta
100
102
124

90
60
50

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Cada fila de la consulta principal se compara con los


valores de una subconsulta de varias filas y varias
columnas.

Subconsultas de Varias Columnas


Hasta ahora, ha escrito subconsultas de una sola fila y subconsultas de varias filas en las que
slo se devuelve una columna mediante la sentencia interna SELECT y esto se utiliza para
evaluar la expresin de la sentencia SELECT principal. Si desea comparar dos o ms
columnas, debe escribir una clusula WHERE compuesta mediante operadores lgicos.
Mediante subconsultas de varias columnas, puede combinar condiciones WHERE duplicadas
en una sola clusula WHERE.
Sintaxis
SELECT
FROM
WHERE

column, column, ...


table
(column, column, ...) IN
(SELECT column, column, ...
FROM
table
WHERE condition);
El grfico de la diapositiva ilustra que los valores de MANAGER_ID y DEPARTMENT_ID de
la consulta principal se estn comparando con los valores MANAGER_ID y DEPARTMENT_
ID recuperados por la subconsulta. Como el nmero de columnas que se estn comparando es
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

Introduccin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Comparaciones entre Pares y entre No Pares


Las comparaciones de columnas en una subconsulta de varias columnas pueden ser entre
pares y entre no pares.
En el ejemplo de la siguiente diapositiva, se ejecuta una comparacin entre pares en la
clusula WHERE. Cada fila candidata de la sentencia SELECT debe tener las dos mismas
columnas MANAGER_ID y DEPARTMENT_ID que los empleados con EMPLOYEE_ID 199
174.
Una subconsulta de varias columnas tambin puede ser una comparacin entre no pares. En
una comparacin entre no pares, cada columna de la clusula WHERE de la sentencia SELECT
principal se compara individualmente con varios valores recuperados por la sentencia
SELECT interna. Las columnas individuales se pueden corresponder con cualquier valor
recuperado por la sentencia SELECT interna. Pero colectivamente, se deben satisfacer todas
las condiciones mltiples de la sentencia SELECT principal para que se muestre la fila. El
ejemplo de la pgina siguiente ilustra una comparacin entre pares.

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

203

Introduccin a Oracle 10g: SQL Fundamentals II

Subconsulta de Comparacin entre Pares


Muestre los detalles de los empleados que estn 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Subconsulta de Comparacin entre Pares


El ejemplo de la diapositiva muestra una subconsulta de varias columnas, ya que la
subconsulta devuelve ms de una columna. Compara los valores de la columna MANAGER_
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
EMPLOYEE_ID 199 174.
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
comparan con la columna MANAGER_ID y la columna DEPARTMENT_ID de cada fila de la
tabla EMPLOYEES. Si los valores se corresponden, se muestra la fila. En la salida, no se
mostrarn los registros de los empleados con EMPLOYEE_ID 199 174. sta es la salida de
la consulta de la diapositiva:

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

204

Introduccin a Oracle 10g: SQL Fundamentals II

Subconsulta de Comparacin entre No Pares


Muestre los detalles de los empleados que estn 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
FROM
WHERE

AND

employee_id, manager_id, department_id


employees
manager_id IN
(SELECT manager_id
FROM
employees
WHERE
employee_id IN (174,199))
department_id IN
(SELECT department_id
FROM
employees
WHERE
employee_id IN (174,199))

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

AND

employee_id NOT IN(174,199);

Subconsulta de Comparacin entre No Pares


El ejemplo muestra una comparacin entre no pares de las columnas. Muestra los valores de
EMPLOYEE_ID, MANAGER_ID y DEPARTMENT_ID de cualquier empleado cuyo
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
correspondan con los identificadores de departamento cuyo identificador de empleado sea
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
segunda subconsulta para recuperar los valores de DEPARTMENT_ID para los empleados con
el valor de EMPLOYEE_ID 199 174. Los valores recuperados de las columnas
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
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
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
de la diapositiva:

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

205

Introduccin a Oracle 10g: SQL Fundamentals II

Expresiones de Subconsultas Escalares

Una expresin 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 expresin y condicin de DECODE y CASE
Todas las clusulas de SELECT excepto GROUP BY

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Subconsultas Escalares en SQL


Una subconsulta que devuelve exactamente un valor de columna de una fila se conoce
tambin como subconsulta escalar. Las subconsultas de varias columnas que se escriben para
comparar dos o ms columnas, mediante una clusula WHERE compuesta y operadores
lgicos, no se califican como subconsultas escalares.
El valor de la expresin de subconsulta escalar es el valor del elemento de lista de seleccin
de la subconsulta. Si la subconsulta devuelve 0 filas, el valor de la expresin de subconsulta
escalar es NULL. Si la subconsulta devuelve ms de una fila, Oracle Server devuelve un error.
Oracle Server siempre ha soportado el uso de una subconsulta escalar en una sentencia
SELECT. Puede utilizar subconsultas escalares en:
La parte de expresin y condicin de DECODE y CASE
Todas las clusulas de SELECT excepto GROUP BY
La clusula SET y la clusula WHERE de una sentencia UPDATE
Sin embargo, las subconsultas escalares no son expresiones vlidas en los siguientes casos:
Como valores por defecto para columnas y expresiones de comprobacin aleatoria para
agrupamientos
En la clusula RETURNING de sentencias DML
Como base de un ndice basado en funciones
En clusulas GROUP BY, restricciones CHECK, condiciones WHEN
En clusulas CONNECT BY
En sentencias que no estn relacionadas con consultas como, por ejemplo, CREATE
PROFILE
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-7

206

Introduccin 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 clusula ORDER BY

SELECT
employee_id, last_name
FROM
employees e
ORDER BY (SELECT department_name
FROM departments d
WHERE e.department_id = d.department_id);

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Subconsultas Escalares: Ejemplos


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
departamento del departamento cuyo identificador de ubicacin es 1800. La expresin CASE
de la consulta externa utiliza el resultado de la consulta interna para mostrar el identificador de
empleado, los apellidos y un valor de Canad o EE.UU., dependiendo de si el identificador de
departamento del registro recuperado por la consulta externa es 20 o no.
ste es el resultado del primer ejemplo de la diapositiva:

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

207

Introduccin a Oracle 10g: SQL Fundamentals II

Subconsultas Escalares: Ejemplos (continuacin)


El segundo ejemplo de la diapositiva demuestra que las subconsultas escalares se pueden utilizar
en la clusula ORDER BY. En el ejemplo, se ordena la salida basndose 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 comparacin se realiza en una
subconsulta escalar en la clusula ORDER BY. ste es el resultado del segundo ejemplo:

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

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
sentencia principal. Las subconsultas correlacionadas se explican ms adelante en esta leccin.

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

208

Introduccin 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

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

UTILICE
valores de la consulta interna para calificar o
descalificar la fila candidata

Subconsultas Correlacionadas
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
correlacionada se evala una vez para cada fila procesada por la sentencia principal. La
sentencia principal puede ser una sentencia SELECT, UPDATE o DELETE.
Subconsultas Anidadas frente a Subconsultas Correlacionadas
Con una subconsulta anidada normal, la consulta SELECT interna se ejecuta primero y una
vez, y devuelve valores que sern utilizados por la consulta principal. Sin embargo, una
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
externa.
Ejecucin de Subconsultas Anidadas
La consulta interna se ejecuta primero y encuentra un valor.
La consulta externa se ejecuta una vez y utiliza el valor de la consulta interna.
Ejecucin de Subconsultas Correlacionadas
Obtenga una fila candidata (recuperada por la consulta externa).
Ejecute la consulta interna mediante el valor de la fila candidata.
Utilice los valores resultantes de la consulta interna para calificar o descalificar la fila
candidata.
Repita el proceso hasta que no queden filas candidatas.
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-10

209

Introduccin 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, ...
outer
FROM
table1
WHERE column1 operator
(SELECT
FROM
WHERE

column1, column2
table2
expr1 =
outer.expr2);

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Subconsultas Correlacionadas (continuacin)


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
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
responder a una pregunta de varias partes cuya respuesta dependa del valor de cada fila
procesada por la sentencia principal.
Oracle Server realiza una consulta correlacionada cuando la subconsulta hace referencia a una
columna desde una tabla de la consulta principal.
Nota: Puede utilizar los operadores ANY y ALL en una subconsulta correlacionada.

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

210

Introduccin a Oracle 10g: SQL Fundamentals II

Uso de Subconsultas Correlacionadas


Busque todos los empleados que ganen ms 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);

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Cada vez que se procesa


una fila de la consulta
externa, se evala la
consulta interna.

Uso de Subconsultas Correlacionadas


El ejemplo de la diapositiva determina qu empleados ganan ms que el salario medio de su
departamento. En este caso, la subconsulta correlacionada calcula especficamente el salario
medio de cada departamento.
Como la consulta externa y la interna utilizan la tabla EMPLOYEES en la clusula FROM, se
asigna un alias a EMPLOYEES en la sentencia SELECT externa por motivos de claridad. El
alias no slo hace que toda la sentencia SELECT resulte ms legible, sino que sin l, la
consulta no funcionara correctamente, ya que la sentencia interna no podra distinguir la
columna de la tabla interna de la columna de la tabla externa.

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

211

Introduccin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Uso de Subconsultas Correlacionadas (continuacin)


El ejemplo de la diapositiva muestra los detalles de los empleados que han cambiado de puesto
al menos dos veces. Oracle Server evala una subconsulta correlacionada de esta manera:
1. Seleccione una fila de la tabla especificada en la consulta externa. sta ser la fila
candidata actual.
2. Almacene el valor de la columna a la que se hace referencia en la subconsulta desde esta
fila candidata. (En el ejemplo de la diapositiva, la columna a la que se hace referencia en
la subconsulta es E.EMPLOYEE_ID).
3. Realice la subconsulta con su condicin haciendo referencia al valor de la fila candidata
de la consulta externa. (En el ejemplo de la diapositiva, la funcin de grupo COUNT(*)
se evala basndose en el valor de la columna E.EMPLOYEE_ID obtenida en el paso 2).
4. Evale la clusula WHERE de la consulta externa basndose en los resultados de la
subconsulta realizada en el paso 3. Esto determina si se selecciona la fila candidata para
la salida. (En el ejemplo, el nmero de veces que un empleado ha cambiado de puesto,
evaluado por la subconsulta, se compara con 2 en la clusula WHERE de la consulta
externa. Si se satisface la condicin, se muestra el registro de ese empleado).
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.
La correlacin se establece mediante un elemento de la consulta externa en la subconsulta. En
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

Introduccin 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 bsqueda no contina en la consulta interna
La condicin se indica como TRUE

Si no se encuentra un valor de fila de subconsulta:


La condicin se indica como FALSE
La bsqueda contina en la consulta interna

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Operador EXISTS
Con las sentencias SELECT anidadas, son vlidos todos los operadores lgicos. Adems,
puede utilizar el operador EXISTS. Este operador se utiliza frecuentemente con subconsultas
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
menos una fila, el operador devuelve TRUE. Si el valor no existe, devuelve FALSE. De forma
anloga, 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.

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

213

Introduccin a Oracle 10g: SQL Fundamentals II

Bsqueda 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Uso del Operador EXISTS


El operador EXISTS asegura que la bsqueda en la consulta interna no contine cuando se
encuentre al menos una correspondencia para el nmero de empleado y de supervisor
mediante la condicin:
WHERE manager_id = outer.employee_id.

Observe que la consulta SELECT interna no necesita devolver un valor especfico, por lo que
se puede seleccionar una constante.

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

214

Introduccin a Oracle 10g: SQL Fundamentals II

Bsqueda 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Uso del Operador NOT EXISTS

Solucin Alternativa
Se puede utilizar una construccin NOT IN como alternativa para un operador NOT
EXISTS, como se muestra en el siguiente ejemplo:
SELECT department_id, department_name
FROM
departments
WHERE department_id NOT IN(SELECT department_id
FROM
employees);

Sin embargo, NOT IN se evala como FALSE si cualquier miembro del juego es un valor
NULL. Por tanto, la consulta no devolver ninguna fila incluso aunque haya filas en la tabla
DEPARTMENTS que satisfagan la condicin WHERE.

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

215

Introduccin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Consulta Correlacionada: UPDATE


En el caso de la sentencia UPDATE, puede utilizar una subconsulta correlacionada para
actualizar filas de una tabla basada en filas de otra tabla.

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

216

Introduccin 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 actualizacin
correlacionada.
ALTER TABLE empl6
ADD(department_name VARCHAR2(25));

UPDATE empl6 e
SET
department_name =
(SELECT department_name
FROM
departments d
WHERE e.department_id = d.department_id);

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Consulta Correlacionada: UPDATE (continuacin)


En el ejemplo de la diapositiva, se desnormaliza la tabla EMPL6 al agregar una columna para
almacenar el nombre de departamento y rellena despus la tabla mediante una actualizacin
correlacionada.
A continuacin, se muestra otro ejemplo para una actualizacin correlacionada.
Sentencia con Problema
La tabla REWARDS tiene una lista de empleados que han excedido las expectativas en su
rendimiento. Utilice una subconsulta correlacionada para actualizar filas en la tabla EMPL6
basada en filas de la tabla REWARDS.
UPDATE empl6
SET
salary = (SELECT employees.salary + rewards.pay_raise
FROM
rewards
WHERE employee_id =
employees.employee_id
AND payraise_date =
(SELECT MAX(payraise_date)
FROM
rewards
WHERE employee_id = employees.employee_id))
WHERE employees.employee_id
IN
(SELECT employee_id FROM rewards);

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

217

Introduccin a Oracle 10g: SQL Fundamentals II

Consulta Correlacionada: UPDATE (continuacin)


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 recepcin del aumento de salario en la tabla
REWARDS. La tabla REWARDS puede contener ms de un registro para un empleado. La
columna PAYRAISE_DATE se utiliza para identificar el aumento de salario ms 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-19

218

Introduccin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Consulta Correlacionada: DELETE


En el caso de una sentencia DELETE, puede utilizar una subconsulta correlacionada para
suprimir slo las filas que tambin existen en otra tabla. Si decide que slo va a mantener los
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 ms antigua
buscando MIN(START_DATE) en la tabla JOB_HISTORY para el empleado. El siguiente
cdigo ilustra cmo se puede realizar la operacin anterior mediante una supresin (DELETE)
correlacionada:
DELETE FROM emp_history JH
WHERE employee_id =
(SELECT employee_id
FROM employees E
WHERE JH.employee_id = E.employee_id
AND START_DATE =
(SELECT MIN(start_date)
FROM job_history JH
WHERE JH.employee_id = E.employee_id)
AND 5 > (SELECT COUNT(*)
FROM job_history JH
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

Introduccin a Oracle 10g: SQL Fundamentals II

Uso de Consultas Correlacionadas: DELETE


Utilice una subconsulta correlacionada para suprimir
slo las filas de la tabla EMPL6 que tambin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Consulta Correlacionada: DELETE (continuacin)

Ejemplo
En este ejemplo se utilizan dos tablas. Estas tablas son:
La tabla EMPL6, que proporciona detalles de todos los empleados actuales
La tabla EMP_HISTORY, que proporciona detalles de empleados anteriores
EMP_HISTORY contiene datos relacionados con empleados anteriores, por lo que sera
errneo que el registro del mismo empleado existiera en las tablas EMPL6 y EMP_HISTORY.
Puede suprimir dichos registros errneos mediante la subconsulta correlacionada que se
muestra en la diapositiva.

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

220

Introduccin a Oracle 10g: SQL Fundamentals II

Clusula WITH

Mediante la clusula WITH, puede utilizar el mismo


bloque de consulta en una sentencia SELECT cuando
se produce ms de una vez dentro de una consulta
compleja.
La clusula WITH recupera los resultados de un
bloque de consulta y los almacena en el tablespace
temporal del usuario.
La clusula WITH mejora el rendimiento.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Clusula WITH
Mediante la clusula WITH, puede definir un bloque de consulta antes de utilizarlo en una
consulta. La clusula WITH (conocida formalmente como subquery_factoring_clause)
le permite reutilizar el mismo bloque de consulta en una sentencia SELECT cuando se produce
ms de una vez dentro de una consulta compleja. Esto resulta particularmente til cuando una
consulta tiene muchas referencias al mismo bloque de consulta y hay presentes uniones y
agregaciones.
Mediante la clusula WITH, puede reutilizar la misma consulta cuando resulta caro evaluar el
bloque de consulta y se produce ms de una vez dentro de una consulta compleja. Mediante la
clusula WITH, Oracle Server recupera los resultados de un bloque de consulta y los almacena en
el tablespace temporal del usuario. Esto puede mejorar el rendimiento.
Ventajas de la Clusula WITH
Hace que la consulta resulte fcil de leer
Evala una clusula slo una vez, incluso aunque aparezca varias veces en la consulta
En la mayora de los casos puede mejorar el rendimiento para las consultas grandes

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

221

Introduccin a Oracle 10g: SQL Fundamentals II

Clusula WITH: Ejemplo


Mediante la clusula 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Clusula WITH: Ejemplo

El problema de la diapositiva requerira los siguientes clculos intermedios:


1. Calcule el salario total para todos los departamentos y almacene el resultado mediante
una clusula WITH.
2. Calcule el salario medio de todos los departamentos y almacene el resultado mediante
una clusula WITH.
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
salario medio de todos los departamentos, muestre el nombre de departamento y el
salario total de ese departamento.
La solucin a este problema se muestra en la pgina siguiente.

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

222

Introduccin a Oracle 10g: SQL Fundamentals II

Clusula 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
FROM avg_cost)
ORDER BY department_name;

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Clusula WITH: Ejemplo (continuacin)


El cdigo SQL de la diapositiva es un ejemplo de una situacin en la que se puede mejorar el
rendimiento y escribir SQL de forma ms sencilla mediante la clusula WITH. La consulta
crea los nombres de consulta DEPT_COSTS y AVG_COST y los utiliza en el cuerpo de la
consulta principal. Internamente, la clusula WITH se resuelve como una vista en lnea o una
tabla temporal. El optimizador selecciona la resolucin adecuada segn el costo o las ventajas
de almacenar temporalmente los resultados de la clusula WITH.
sta es la salida generada por el cdigo SQL de la diapositiva:

Notas de Uso de la Clusula WITH


Se utiliza slo con sentencias SELECT.
Un nombre de consulta es visible para todos los bloques de consulta del elemento WITH
(incluidos los bloques de subconsulta) definidos despus de ste y el propio bloque de
consulta (incluidos los bloques de subconsulta).
Cuando el nombre de consulta es igual que un nombre de tabla existente, el analizador
busca de dentro a fuera y el nombre de bloque de consulta tiene prioridad sobre el
nombre de tabla.
La clusula WITH puede contener ms de una consulta. Cada consulta se separa
entonces con una coma.
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-24

223

Introduccin a Oracle 10g: SQL Fundamentals II

Resumen
En esta leccin, ha aprendido lo siguiente:
Una subconsulta de varias columnas devuelve ms
de una columna.
Las comparaciones de varias columnas pueden ser
entre pares y entre no pares.
Una subconsulta de varias columnas tambin se
puede utilizar en la clusula FROM de una sentencia
SELECT.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Resumen
Puede utilizar subconsultas de varias columnas para combinar varias condiciones WHERE en
una sola clusula WHERE. Las comparaciones de columnas en una subconsulta de varias
columnas pueden ser entre pares y entre no pares.
Puede utilizar una subconsulta para definir una tabla en la que pueda operar una consulta que
la contenga.
Las subconsultas escalares se pueden utilizar en:
Parte de expresin y condicin de DECODE y CASE
Todas las clusulas de SELECT excepto GROUP BY
Una clusula SET y clusula WHERE de una sentencia UPDATE

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

224

Introduccin 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 clusula WITH para utilizar el
mismo bloque de consulta en una sentencia
SELECT cuando se produce ms de una vez.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Resumen (continuacin)
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
correlacionada se evala una vez para cada fila procesada por la sentencia principal. La
sentencia principal puede ser una sentencia SELECT, UPDATE o DELETE. Mediante la
clusula WITH, puede reutilizar la misma consulta cuando resulta caro volver a evaluar el
bloque de consulta y se produce ms de una vez dentro de una consulta compleja.

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

225

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 6: Visin General


Esta prctica cubre los siguientes temas:
Creacin de subconsultas de varias columnas
Escritura de subconsultas correlacionadas
Uso del operador EXISTS
Uso de subconsultas escalares
Uso de la clusula WITH

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Prctica 6: Visin General


En esta prctica, escribir subconsultas de varias columnas, as como subconsultas
correlacionadas y escalares. Tambin solucionar problemas escribiendo la clusula WITH.

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

226

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 6
1. Escriba una consulta para mostrar el apellido, el nmero de departamento y el salario de
cualquier empleado cuyo nmero de departamento y salario se correspondan con el
nmero de departamento y el salario de cualquier empleado que gane una comisin.

2. Muestre el apellido, el nombre de departamento y el salario de cualquier empleado cuyo


salario y comisin se correspondan con el salario y la comisin de cualquier empleado
con el identificador de ubicacin 1700.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

3. Cree una consulta para mostrar el apellido, la fecha de contratacin y el salario de todos
los empleados que tengan el mismo salario y la misma comisin que Kochhar.
Nota: No muestre a Kochhar en el juego de resultados.

4. Cree una consulta para mostrar los empleados que ganen un salario que sea ms alto que
el salario de todos los supervisores de ventas (JOB_ID = 'SA_MAN'). Ordene los
resultados por salario en orden descendente.

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

227

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 6 (continuacin)
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 ms 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

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

228

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 6 (continuacin)
7. Busque todos los empleados que no sean supervisores.
a. Hgalo primero mediante el operador NOT EXISTS.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

b. Esto se puede conseguir mediante el operador NOT IN? Cmo o por qu no?

8. Escriba una consulta para mostrar los apellidos de los empleados que ganen menos que
el salario medio en sus departamentos.

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

229

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 6 (continuacin)
9. Escriba una consulta para mostrar los apellidos de los empleados que tienen uno o ms
colegas en su departamento con fechas de contratacin posteriores pero salarios
ms altos.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

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.

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

230

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 6 (continuacin)
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
compaa. Utilice la clusula WITH para escribir esta consulta. Asigne a la consulta el
nombre SUMMARY.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 6-32

231

Introduccin a Oracle 10g: SQL Fundamentals II

Recuperacin Jerrquica

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
232

Introduccin a Oracle 10g: SQL Fundamentals II

Objetivos
Al finalizar esta leccin, debera estar capacitado para:
Interpretar el concepto de consulta jerrquica
Crear un informe en estructura de rbol
Formatear datos jerrquicos
Excluir ramas de la estructura de rbol

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Objetivos
En esta leccin, aprender a utilizar consultas jerrquicas para crear informes en estructura
de rbol.

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

233

Introduccin a Oracle 10g: SQL Fundamentals II

Ejemplo de Datos de la Tabla EMPLOYEES

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Ejemplo de Datos de la Tabla EMPLOYEES

Mediante consultas jerrquicas, puede recuperar datos basndose en una relacin jerrquica
natural entre filas de una tabla. Una base de datos relacional no almacena registros de forma
jerrquica. Sin embargo, si existe una relacin jerrquica entre las filas de una sola tabla, un
proceso denominado desplazamiento por el rbol permite que se construya la jerarqua. Una
consulta jerrquica es un mtodo de informar de las ramas de un rbol en un orden especfico.
Imagine un rbol genealgico con los miembros mayores de la familia situados cerca de la
base o del tronco del rbol y los ms jvenes representados como ramas del rbol. Las ramas
pueden tener ms ramas, y as sucesivamente.
Una consulta jerrquica es posible cuando existe una relacin entre filas en una tabla. Por
ejemplo, en la diapositiva, se ve que los empleados con el identificador de puesto AD_VP,
ST_MAN, SA_MAN y MK_MAN estn bajo las rdenes directas del presidente de la compaa.
Lo sabemos porque la columna MANAGER_ID de estos registros contiene el identificador de
empleado 100, que pertenece al presidente (AD_PRES).
Nota: Los rboles jerrquicos se utilizan en diversos campos como, por ejemplo, la
genealoga humana (rboles genealgicos), la cra de ganado (reproduccin), la gerencia
empresarial (jerarquas de los supervisores), la manufactura (ensamblaje de productos), la
investigacin evolutiva (desarrollo de especies) y la investigacin cientfica.

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

234

Introduccin a Oracle 10g: SQL Fundamentals II

Estructura de rbol Natural

EMPLOYEE_ID = 100 (Principal)


King

MANAGER_ID = 100 (Secundario)


Kochhar

Whalen

Higgins

De Haan

Mourgos

Hunold Rajs Davies

Matos

Hartstein

Vargas
Fay

Lorentz

Abel

Taylor

Grant

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Gietz Ernst

Zlotkey

Estructura de rbol Natural


La tabla EMPLOYEES tiene una estructura de rbol que representa la lnea de supervisores.
Para crear la jerarqua, se puede observar la relacin entre valores equivalentes de las
columnas EMPLOYEE_ID y MANAGER_ID. Para utilizar esta relacin, se puede unir la
tabla a s misma. La columna MANAGER_ID contiene el nmero de empleado del supervisor
del empleado.
La relacin principal-secundario de una estructura de rbol le permite controlar:
La direccin de desplazamiento por la jerarqua
El punto de partida dentro de la jerarqua
Nota: La diapositiva muestra una estructura de rbol invertido de la jerarqua de supervisores
de los empleados de la tabla EMPLOYEES.

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

235

Introduccin a Oracle 10g: SQL Fundamentals II

Consultas Jerrquicas

SELECT [LEVEL], column, expr...


FROM
table
[WHERE condition(s)]
[START WITH condition(s)]
[CONNECT BY PRIOR condition(s)] ;

Condicin WHERE:
expr comparison_operator expr

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Palabras Clave y Clusulas


Las consultas jerrquicas se pueden identificar por la presencia de las clusulas CONNECT BY
y START WITH.
En la sintaxis:
SELECT
Es la clusula SELECT estndar
LEVEL
Para cada fila devuelta por una consulta jerrquica, la
pseudocolumna LEVEL devuelve 1 para una fila de raz, 2 para un
secundario de la raz y as sucesivamente.
FROM table
Especifica la tabla, la vista o la instantnea que contiene las columnas.
Puede seleccionar de una sola tabla.
WHERE
Restringe las filas devueltas por la consulta sin que afecte a otras filas de
la jerarqua.
condition
Es una comparacin con expresiones
START WITH
Especifica las filas de raz de la jerarqua (dnde comenzar). Esta
clusula es necesaria para una consulta jerrquica verdadera.
CONNECT BY
Especifica las columnas en las que existe la relacin entre filas
PRIOR principales y secundarias. Esta clusula es necesaria para una
consulta jerrquica.
La sentencia SELECT no puede contener una unin ni una consulta de una vista que contenga
una unin.

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

236

Introduccin a Oracle 10g: SQL Fundamentals II

Desplazamiento por el rbol

Punto de Partida

Especifica la condicin que se debe cumplir


Acepta cualquier condicin vlida

START WITH column1 = value

Mediante la tabla EMPLOYEES, parta del empleado cuyo


apellido es Kochhar.

...START WITH last_name = 'Kochhar'

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Desplazamiento por el rbol


La clusula START WITH determina la fila o las filas que se deben utilizar como raz
del rbol. La clusula START WITH se puede utilizar en conjuncin con cualquier
condicin vlida.
Ejemplos
Mediante la tabla EMPLOYEES, parta de King, el presidente de la compaa.
... START WITH manager_id IS NULL

Mediante la tabla EMPLOYEES, parta del empleado Kochhar. Una condicin START WITH
puede contener una subconsulta.
... START WITH employee_id = (SELECT employee_id
FROM
employees

WHERE last_name = 'Kochhar')


Si se omite la clusula START WITH, el desplazamiento por el rbol parte de todas las filas
de la tabla como filas de raz. Si se utiliza una clusula WHERE, el desplazamiento parte de
todas las filas que satisfacen la condicin WHERE. Esto ya no refleja una jerarqua verdadera.
Nota: Las clusulas CONNECT BY PRIOR y START WITH no son del estndar ANSI SQL.

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

237

Introduccin a Oracle 10g: SQL Fundamentals II

Desplazamiento por el rbol

CONNECT BY PRIOR column1 = column2

Desplcese de arriba abajo mediante la tabla EMPLOYEES.


... CONNECT BY PRIOR employee_id = manager_id

Direccin
De arriba abajo

Columna1 = Clave secundaria


Columna2 = Clave principal

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

De abajo arriba

Columna1 = Clave principal


Columna2 = Clave secundaria

Desplazamiento por el rbol (continuacin)


La direccin de la consulta, ya sea de principal a secundario o de secundario a principal, est
determinada por la colocacin de la columna CONNECT BY PRIOR. El operador PRIOR se
refiere a la fila principal. Para encontrar las filas secundarias de una fila principal, Oracle
Server evala la expresin PRIOR para la fila principal y las dems expresiones para cada fila
de la tabla. Las filas para las que la condicin es verdadera son las filas secundarias de la
principal. Oracle Server selecciona siempre las filas secundarias evaluando la condicin
CONNECT BY con respecto a una fila principal actual.
Ejemplos
Desplcese de arriba abajo mediante la tabla EMPLOYEES. Defina una relacin jerrquica en
la que el valor EMPLOYEE_ID de la fila principal sea igual al valor MANAGER_ID de la
fila secundaria.
... CONNECT BY PRIOR employee_id = manager_id
Desplcese de abajo arriba mediante la tabla EMPLOYEES.
... CONNECT BY PRIOR manager_id = employee_id
No es necesario codificar inmediatamente el operador PRIOR despus de CONNECT BY.
As, la siguiente clusula CONNECT BY PRIOR genera el mismo resultado que la del
ejemplo anterior.
... CONNECT BY employee_id = PRIOR manager_id
Nota: La clusula CONNECT BY no puede contener una subconsulta.
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 7-7

238

Introduccin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Desplazamiento por el rbol: De Abajo Arriba


En el ejemplo de la diapositiva se muestra una lista de supervisores que comienza por el
empleado cuyo identificador es 101.
Ejemplo
En el ejemplo siguiente, los valores de EMPLOYEE_ID se evalan para la fila principal y
MANAGER_ID, y los valores de SALARY son evaluados por las filas secundarias. El operador
PRIOR se aplica slo al valor de EMPLOYEE_ID.
... CONNECT BY PRIOR employee_id = manager_id
AND salary > 15000;

Para calificarse como fila secundaria, una fila debe tener un valor de MANAGER_ID igual
al valor EMPLOYEE_ID de la fila principal y debe tener un valor SALARY superior a
15.000 dlares.

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

239

Introduccin a Oracle 10g: SQL Fundamentals II

Desplazamiento por el rbol: De Arriba Abajo

SELECT
PRIOR
FROM
START
CONNECT

last_name||' reports to '||


last_name "Walk Top Down"
employees
WITH last_name = 'King'
BY PRIOR employee_id = manager_id ;

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Desplazamiento por el rbol: De Arriba Abajo


Desplazndose de arriba abajo, muestre los nombres de los empleados y su supervisor. Utilice
el empleado King como punto de partida. Imprima slo una columna.

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

240

Introduccin a Oracle 10g: SQL Fundamentals II

Clasificacin de Filas con la


Pseudocolumna LEVEL
Nivel 1
raz/principal
King

Kochhar

De Haan

Mourgos

Whalen Higgins Hunold Rajs Davies

Zlotkey

Matos

Vargas

Hartstein

Nivel 3
principal/secundario/hoja
Fay

Lorentz

Abel

Taylor

Grant

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Gietz Ernst

Nivel 4
hoja

Clasificacin de Filas con la Pseudocolumna LEVEL


Puede mostrar explcitamente la clasificacin o el nivel de una fila en la jerarqua mediante la
pseudocolumna LEVEL. Esto har que el informe resulte ms legible. Las bifurcaciones en las
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
rbol invertido con sus valores LEVEL. Por ejemplo, el empleado Higgins es principal y
secundario, mientras que el empleado Davies es secundario y hoja.
Pseudocolumna LEVEL
Valor
1
2
3

Nivel
Nodo raz
Secundario de un nodo raz
Secundario de un secundario y as sucesivamente.

En la diapositiva, King es la raz o el principal (LEVEL = 1). Kochhar, De Haan, Mourgos,


Zlotkey, Hartstein, Higgins y Hunold son secundarios y tambin principales (LEVEL = 2).
Whalen, Rajs, Davies, Matos, Vargas, Gietz, Ernst, Lorentz, Abel, Taylor, Grant y Fay son
secundarios y hojas. (LEVEL = 3 y LEVEL = 4)
Nota: Un nodo raz es el nodo ms alto dentro de un rbol invertido. Un nodo secundario es
cualquier nodo no raz. Un nodo principal es cualquier nodo que tenga secundarios. Un nodo
hoja es cualquier nodo sin secundarios. El nmero de niveles devuelto por una consulta
jerrquica se puede ver limitado por la memoria de usuario disponible.
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 7-10

241

Introduccin a Oracle 10g: SQL Fundamentals II

Formato de Informes Jerrquicos


mediante LEVEL y LPAD
Cree un informe que muestre los niveles de
supervisores de la compaa, partiendo del nivel ms
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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Formato de Informes Jerrquicos mediante LEVEL


A los nodos de un rbol se les asignan nmeros de niveles desde la raz. Utilice la funcin
LPAD en conjuncin con la pseudocolumna LEVEL para mostrar un informe jerrquico como
rbol con sangrado.
En el ejemplo de la diapositiva:
LPAD(char1,n [,char2]) devuelve char1, rellenado a la izquierda hasta la
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.
LPAD(last_name, LENGTH(last_name)+(LEVEL*2)-2,'_')define el
formato de visualizacin.
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 '_'.
Dicho de otro modo, esto indica a SQL que tome LAST_NAME y lo rellene a la izquierda con
el carcter '_' hasta que la longitud de la cadena resultante sea igual a los valores
determinados por LENGTH(last_name)+(LEVEL*2)-2.
Para King, LEVEL = 1. Por tanto, (2 * 1) 2 = 2 2 = 0. As pues, King no se rellena con
ningn carcter '_' y se muestra en la columna 1.
Para Kochhar, LEVEL = 2. Por tanto, (2 * 2) 2 = 4 2 = 2 . As pues, Kochhar se rellena
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

Introduccin a Oracle 10g: SQL Fundamentals II

Formato de Informes Jerrquicos mediante LEVEL (continuacin)

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 7-12

243

Introduccin a Oracle 10g: SQL Fundamentals II

Eliminacin de Ramas

Utilice la clusula WHERE


para eliminar un nodo.

Utilice la clusula CONNECT BY


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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Gietz

Gietz

Eliminacin de Ramas
Puede utilizar las clusulas 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
condicin booleana.
Ejemplos
Partiendo de la raz, desplcese de arriba abajo y elimine el empleado Higgins del resultado,
pero procese las filas secundarias.
SELECT
FROM
WHERE
START
CONNECT

department_id, employee_id,last_name, job_id, salary


employees
last_name != 'Higgins'
WITH manager_id IS NULL
BY PRIOR employee_id = manager_id;

Partiendo de la raz, desplcese de arriba abajo y elimine el empleado Higgins del resultado y
todas las filas secundarias.
SELECT
FROM
START
CONNECT
AND

department_id, employee_id,last_name, job_id, salary


employees
WITH manager_id IS NULL
BY PRIOR employee_id = manager_id
last_name != 'Higgins';

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

244

Introduccin a Oracle 10g: SQL Fundamentals II

Resumen
En esta leccin, ha aprendido lo siguiente:
Puede utilizar consultas jerrquicas para ver una
relacin jerrquica entre filas de una tabla.
Puede especificar la direccin y el punto de
partida de la consulta.
Puede eliminar nodos o ramas mediante la
eliminacin.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Resumen
Puede utilizar consultas jerrquicas para recuperar datos basndose en una relacin jerrquica
natural entre filas de una tabla. La pseudocolumna LEVEL cuenta lo lejos que se ha
desplazado hacia abajo en un rbol jerrquico. Puede especificar la direccin de la consulta
mediante la clusula CONNECT BY PRIOR. Puede especificar el punto de partida mediante
la clusula START WITH. Puede utilizar las clusulas WHERE y CONNECT BY para eliminar
las ramas del rbol.

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

245

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 7: Visin General


Esta prctica cubre los siguientes temas:
Distincin entre consultas jerrquicas y consultas
no jerrquicas
Desplazamiento por un rbol
Generacin de un informe con sangrado mediante
la pseudocolumna LEVEL
Eliminacin de la estructura del rbol
Ordenacin de la salida

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Prctica 7: Visin General


En esta prctica, obtendr experiencia prctica en la generacin de informes jerrquicos.
Nota: La pregunta 1 se realiza sobre papel.

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

246

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 7
1. Observe los siguientes ejemplos de salida. Son resultado de una consulta jerrquica?
Explique por qu o por qu no.
Imagen 1:

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Imagen 2:

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

247

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 7 (continuacin)
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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

3. Cree un informe que muestre la jerarqua de los supervisores del empleado Lorentz.
Muestre primero el supervisor inmediato.

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

248

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 7 (continuacin)
4. Cree un informe con sangrado que muestre la jerarqua 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Si le queda tiempo, realice el siguiente ejercicio:


5. Genere un organigrama de la compaa que muestre la jerarqua de los supervisores.
Parta de la persona de nivel ms alto, excluya a todas las personas con el identificador
de puesto IT_PROG, a De Haan y a los empleados que estn a las rdenes de De Haan.

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

249

Introduccin a Oracle 10g: SQL Fundamentals II

Soporte de Expresiones Normales

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
250

Introduccin a Oracle 10g: SQL Fundamentals II

Objetivos
Al final de esta leccin, debera estar capacitado para
utilizar el soporte de expresiones normales en SQL
para buscar, hacer corresponder y sustituir cadenas
siempre en trminos de expresiones normales.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Copyright 2004, Oracle. Todos
.
los derechos reservados.

Objetivos
En esta leccin, aprender a utilizar la funcin de soporte de expresiones normales que se ha
introducido en la base de datos Oracle 10g.

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

251

Introduccin a Oracle 10g: SQL Fundamentals II

Visin General de Expresiones Normales


Soporte de
expresiones normales
multilinge para tipos
de cadena SQL y
PL/SQL

ABC

Mtodo para describir


patrones sencillos y
complejos de bsqueda
y manipulacin

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Varias funciones
nuevas para soportar
expresiones
normales

Copyright 2004, Oracle. Todos


.
los derechos reservados.

Visin General de Expresiones Normales


La base de datos Oracle 10g introduce el soporte de expresiones normales. La
implementacin cumple con el estndar POSIX (Sistema Operativo Porttil para UNIX),
controlado por el IEEE (Instituto de Ingenieros en Electricidad y Electrnica), para la
semntica y la sintaxis de correspondencia de datos ASCII. Las capacidades multilinges de
Oracle amplan las capacidades de correspondencia de los operadores ms all del estndar
POSIX. Las expresiones normales son un mtodo para describir patrones sencillos y
complejos de bsqueda y manipulacin.
La manipulacin y la bsqueda de cadenas suponen un amplio porcentaje de la lgica de una
aplicacin basada en la Web. El uso va desde la simple bsqueda de las palabras San
Francisco en un texto especificado, pasando por la compleja extraccin de todas las
direcciones URL del texto, hasta la bsqueda ms compleja de todas las palabras cuyo
segundo carcter sea una vocal.
Si se une al SQL nativo, el uso de expresiones normales permite operaciones muy potentes de
bsqueda y de manipulacin de cualquier dato almacenado en una base de datos Oracle.
Puede utilizar esta funcin para solucionar fcilmente problemas que de otro modo resultaran
muy complejos de programar.

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

252

Introduccin a Oracle 10g: SQL Fundamentals II

Metacaracteres
Smbolo

Descripcin

Se corresponde con cero o ms incidencias

Operador de modificacin para especificar correspondencias alternativas

^/$

Se corresponde con el inicio de lnea/fin de lnea


Expresin 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 ms de n veces

[: :]

Especifica una clase de carcter y se corresponde con cualquier carcter de


esa clase

Puede tener 4 significados diferentes: 1. Se representa a s mismo. 2. Presenta el


siguiente carcter. 3. Introduce un operador. 4. No hace nada.

Se corresponde con una o ms incidencias

Se corresponde con cero o una incidencia

Se corresponde con cualquier carcter del juego de caracteres soportado,


excepto NULL

()

Expresin de agrupamiento, que se trata como subexpresin nica

[==]
[..]

Especifica clases de equivalencia

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

\n

[]

Referencia a expresin anterior

Especifica un elemento de intercalacin como, por ejemplo, un elemento de


varios caracteres
Copyright 2004, Oracle. Todos
.
los derechos reservados.

Metacaracteres
Los metacaracteres son caracteres especiales que tienen un significado especial como, por
ejemplo, un comodn, un carcter de repeticin, un carcter de no correspondencia o un rango
de caracteres. Puede utilizar varios smbolos de metacaracteres predefinidos en la
correspondencia de patrones.

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

253

Introduccin a Oracle 10g: SQL Fundamentals II

Uso de Metacaracteres
Problem: Find 'abc' within a string:
Solution:
'abc'
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'
2
Matches:
abc
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
Solution:
'a+'
Matches:
a
Matches:
aa
Does not match:
bbb

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Copyright 2004, Oracle. Todos
.
los derechos reservados.

Uso de Metacaracteres
1. En el primer ejemplo, se realiza una correspondencia sencilla.
2. En el segundo ejemplo, el carcter any se define como un '.'. En este ejemplo se busca
el carcter a seguido de cualquier carcter, seguido del carcter c.
3. El tercer ejemplo busca una o ms incidencias de la letra a. El carcter + se utiliza
aqu para indicar una correspondencia de uno o ms de los caracteres anteriores.
Puede buscar tambin listas de caracteres sin correspondencia. Una lista de caracteres sin
correspondencia le permite definir un juego de caracteres para los que una correspondencia no
es vlida. Por ejemplo, para buscar cualquier cosa menos los caracteres a, b o c, puede
definir ^ para indicar una no correspondencia.
Expression:
[^abc]
Matches:
abcdef
Matches:
ghi
Does not match: abc
Para hacer corresponder cualquier letra que no est entre a e i, puede utilizar:
Expression:
[^a-i]
Matches:
hijk
Matches:
lmn
Does not match: abcdefghi

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

254

Introduccin a Oracle 10g: SQL Fundamentals II

Uso de Metacaracteres (continuacin)


Nombre de Operador

Descripcin

Cualquier carcter Punto

Se corresponde con cualquier carcter.

Una o ms Cuantificador
de signo ms

Se corresponde con una o ms


incidencias de la subexpresin anterior.

Cero o una Cuantificador


de signo de interrogacin

Se corresponde con cero o una


incidencia de la subexpresin anterior.

Cero o ms Cuantificador
de asterisco

Se corresponde con cero o ms


incidencias de la subexpresin anterior.

{m}
{m,}
{m,n}

Intervalo Recuento exacto

Se corresponde con
m incidencias exactamente
al menos m incidencias
al menos m, pero no ms de n
incidencias de la subexpresin
anterior

Lista de caracteres de
correspondencia

Se corresponde con cualquier carcter


de la lista ...

[^]

Lista de caracteres sin


correspondencia

Se corresponde con cualquier carcter


que no est en la lista ...

'a|b' se corresponde con los caracteres


'a' o 'b'.

Subexpresin o
agrupamiento

Trata la expresin ... como una unidad.

Referencia a expresin
anterior

Se corresponde con la ensima


subexpresin anterior, donde n es un
entero del 1 al 9

Carcter de escape

Trata el metacarcter siguiente de la


expresin como un literal.

Inicio de fijacin de lnea

Se corresponde con la expresin


siguiente cuando se produce al principio
de una lnea.
Se corresponde con la expresin
anterior slo cuando se produce al final
de una lnea.

Sintaxis de
Metacarcter

\n

\
^
$

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

()

[]

Fin de fijacin de lnea

[:class:]

Clase de carcter POSIX

Se corresponde con cualquier carcter


que pertenezca a la clase de carcter
especificada.

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

255

Introduccin a Oracle 10g: SQL Fundamentals II

Funciones de Expresiones Normales


Nombre de Funcin Descripcin
Parecido al operador LIKE, pero realiza
REGEXP_LIKE
una correspondencia de expresiones
normales en lugar de una
correspondencia de patrones sencillos

Busca un patrn de expresin normal y


lo sustituye por una cadena de
sustitucin

REGEXP_INSTR

Busca en una cadena especificada un


patrn de expresin normal y devuelve
la posicin en la que se encuentra la
correspondencia

REGEXP_SUBSTR

Busca un patrn de expresin normal


dentro de una cadena especificada y
devuelve la subcadena con la
correspondencia

REGEXP_REPLACE

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Copyright 2004, Oracle. Todos
.
los derechos reservados.

Funciones de Expresiones Normales


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
funciones en cualquier tipo de datos que contenga datos de caracteres como, por ejemplo,
CHAR, NCHAR, CLOB, NCLOB, NVARCHAR2 y VARCHAR2. Una expresin normal debe ir
entre comillas simples. Esto asegura que toda la expresin sea interpretada por la funcin
SQL y puede mejorar la legibilidad del cdigo.
REGEXP_LIKE: Esta funcin busca un patrn en una columna de caracteres. Utilice esta
funcin en la clusula WHERE de una consulta para devolver las filas que se correspondan con
la expresin normal que se especifique.
REGEXP_REPLACE: Esta funcin busca un patrn en una columna de caracteres y sustituye
cada incidencia de ese patrn por el patrn que se especifique.
REGEXP_INSTR: Esta funcin busca en una cadena una incidencia especificada de un
patrn de expresin normal. Hay que especificar qu incidencia se desea buscar y la posicin
inicial desde la que buscar. Esta funcin devuelve un entero que indica la posicin en la
cadena en la que ha encontrado la correspondencia.
REGEXP_SUBSTR: Esta funcin devuelve la subcadena real que se corresponde con el
patrn de expresin normal que se especifique.

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

256

Introduccin a Oracle 10g: SQL Fundamentals II

Sintaxis de la Funcin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
.

Sintaxis de la Funcin REGEXP

La siguiente tabla contiene descripciones de los trminos mostrados en la sintaxis de la


diapositiva.
srcstr

Valor de bsqueda

pattern

Expresin normal

occurrence

Incidencia que se buscar

position

Punto de partida de la bsqueda

return_option

Posicin inicial o final de la incidencia

replacestr

Cadena de caracteres que sustituye al patrn

match_option

Opcin para cambiar la correspondencia por defecto; puede


incluir uno o ms de los siguientes valores:
c utiliza una correspondencia sensible a
maysculas/minsculas (por defecto)
I utiliza una correspondencia no sensible a
maysculas/minsculas
n permite el operador de correspondencia con cualquier
carcter
m trata la cadena de origen como varias lneas

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

257

Introduccin a Oracle 10g: SQL Fundamentals II

Realizacin de Bsquedas Bsicas

SELECT first_name, last_name


FROM employees
WHERE REGEXP_LIKE (first_name, '^Ste(v|ph)en$');

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Ejemplo de REGEXP_LIKE

En esta consulta, en la tabla EMPLOYEES, se muestran todos los empleados cuyos nombres
contienen Steven o Stephen. En la expresin utilizada,
'^Ste(v|ph)en$' :
^ indica el inicio de la sentencia
$ indica el fin de la sentencia
| indica o bien/o

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

258

Introduccin a Oracle 10g: SQL Fundamentals II

Comprobacin de la Presencia de un Patrn

SELECT street_address,
REGEXP_INSTR(street_address,'[^[:alpha:]]')
FROM
locations
WHERE
REGEXP_INSTR(street_address,'[^[:alpha:]]')> 1;

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
.

Comprobacin de la Presencia de un Patrn


En este ejemplo, la funcin REGEXP_INSTR se utiliza para buscar la calle con el fin de
encontrar la ubicacin del primer carcter no alfabtico, independientemente de si est en
maysculas o minsculas. La bsqueda se realiza slo en las calles que no empiecen por un
nmero. Observe que [:<class>:] implica una clase de carcter y se corresponde con
cualquier carcter de esa clase; [:alpha:] se corresponde con cualquier carcter alfabtico.
Se muestran los resultados.
En la expresin utilizada en la consulta '[^[:alpha:]]':
[ inicia la expresin
^ indica NO
[:alpha:] indica la clase de carcter alfabtico
] finaliza la expresin
Nota: El operador de clase de carcter POSIX le permite buscar una expresin dentro de una
lista de caracteres que sea miembro de una clase de carcter POSIX especfica. Puede utilizar
este operador para buscar un formato especfico como, por ejemplo, caracteres en mayscula, o
bien puede buscar caracteres especiales como, por ejemplo, dgitos o caracteres de puntuacin.
Se soporta todo el juego de clases de carcter POSIX. Utilice la sintaxis [:class:] donde class es
el nombre de la clase de carcter POSIX que se debe buscar. Las siguientes expresiones
normales buscan uno o ms caracteres consecutivos en maysculas: [[:upper:]]+.

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

259

Introduccin a Oracle 10g: SQL Fundamentals II

Ejemplo de Extraccin de Subcadenas

SELECT REGEXP_SUBSTR(street_address , ' [^ ]+ ')


"Road" FROM locations;

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Ejemplo de Extraccin de una Subcadena


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
mediante la funcin REGEXP_SUBSTR. En la expresin utilizada en la consulta '[^ ]+ ':
[ inicia la expresin
^ indica NO

indica espacio
] finaliza la expresin
+ indica 1 o ms

indica espacio

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

260

Introduccin a Oracle 10g: SQL Fundamentals II

Sustitucin de Patrones

SELECT REGEXP_REPLACE( country_name, '(.)',


'\1 ') "REGEXP_REPLACE"
FROM countries;

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Sustitucin de Patrones
En este ejemplo se examina COUNTRY_NAME. La base de datos Oracle reformatea este
patrn con un espacio despus de cada carcter no nulo de la cadena. Se muestran los
resultados.

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

261

Introduccin a Oracle 10g: SQL Fundamentals II

Expresiones Normales y
Restricciones de Control
ALTER TABLE emp8
ADD CONSTRAINT email_addr
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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
.

Expresiones Normales y Restricciones de Control


Las expresiones normales tambin se pueden utilizar en restricciones de control. En este
ejemplo, se agrega una restriccin de control en la columna EMAIL de la tabla EMPLOYEES.
Esto asegurar que slo se acepten las cadenas que contienen un smbolo @. Se prueba la
restriccin. La restriccin de control se viola porque la direccin de correo electrnico no
contiene el smbolo necesario. La clusula NOVALIDATE asegura que no se comprueben los
datos existentes.

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

262

Introduccin a Oracle 10g: SQL Fundamentals II

Resumen
En esta leccin, ha aprendido a utilizar el soporte de
expresiones normales en SQL y PL/SQL para buscar,
hacer corresponder y sustituir cadenas siempre en
trminos de expresiones normales.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
.

Resumen
En esta leccin, ha aprendido a utilizar las funciones de soporte de expresiones normales que
se han introducido en la base de datos Oracle 10g.

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

263

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 8: Visin General


Esta prctica cubre el uso de expresiones normales.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
.

Prctica 8: Visin General


Esta prctica cubre la bsqueda y la sustitucin de datos mediante expresiones normales.

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

264

Introduccin a Oracle 10g: SQL Fundamentals II

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

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 8-16

265

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 8 (continuacin)
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 slo las filas que se vean afectadas.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 8-17

266

Introduccin a Oracle 10g: SQL Fundamentals II

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II 8-18

267

Introduccin a Oracle 10g: SQL Fundamentals II

____________________________

Apndice A
Soluciones a la Prctica
____________________________

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
268

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 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 direccin URL en formato http://machinename:5561/isqlplus/ y
utilice la cuenta oraxx y la contrasea 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, quin 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 debera utilizar para facilitar el trabajo?
Crear un rol que contenga los privilegios del sistema y otorgar el rol a los
usuarios.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

5. Qu comando se utiliza para cambiar la contrasea?


La sentencia ALTER USER

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


otorgue acceso de consulta a su tabla DEPARTMENTS.
Team 2 executes the GRANT statement.
GRANT select
ON
departments
TO
<user1>;
Team 1 executes the GRANT statement.
GRANT select
ON
departments
TO
<user2>;
Donde user1 es el nombre del equipo 1 y user2 es el nombre del equipo 2.

7.

Consulte todas las filas de la tabla DEPARTMENTS.


SELECT
FROM

*
departments;

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

269

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 1: Soluciones (continuacin)


8. Agregue una nueva fila a su tabla DEPARTMENTS. El equipo 1 debe agregar
Education como departamento nmero 500. El equipo 2 debe agregar Human
Resources como departamento nmero 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 sinnimo 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.
CREATE SYNONYM team1
FOR <oraxx>. DEPARTMENTS;

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

10. Consulte todas las filas de la tabla DEPARTMENTS del otro equipo mediante el
sinnimo.
Team 1 executes this SELECT statement.
SELECT *
FROM
team2;
Team 2 executes this SELECT statement.
SELECT *
FROM
team1;

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

270

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 1: Soluciones (continuacin)


11. Consulte el diccionario de datos USER_TABLES para ver informacin sobre las
tablas que son de su propiedad.
SELECT
FROM

table_name
user_tables;

12. Consulte la vista de diccionario de datos ALL_TABLES para ver informacin 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>;
Team 2 revokes the privilege.
REVOKE select
ON
departments
FROM
<oraxx>;

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

14. Elimine la fila que insert en la tabla DEPARTMENTS en el paso 8 y guarde los
cambios.
Team 1 executes this INSERT statement.
DELETE FROM departments
WHERE department_id = 500;
COMMIT;
Team 2 executes this INSERT statement.
DELETE FROM departments
WHERE department_id = 510;
COMMIT;

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

271

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 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
continuacin, ejecute la sentencia en el archivo de comandos para crear la tabla.
Confirme que la tabla se ha creado.
ID

NAME

Data type

NUMBER

VARCHAR2

Length

25

Column Name
Key Type
Nulls/Unique
FK Table
FK Column

CREATE TABLE dept2


(id NUMBER(7),
name VARCHAR2(25));

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
DESCRIBE dept2

2. Rellene la tabla DEPT2 con datos de la tabla DEPARTMENTS. Incluya slo las
columnas que necesite.
INSERT INTO dept2
SELECT department_id, department_name
FROM
departments;

3. Cree la tabla EMP2 basada en el siguiente diagrama de instancia de tabla. Guarde la


sintaxis en un archivo de comandos denominado lab_02_03.sql y, a
continuacin, ejecute la sentencia en el archivo de comandos para crear la tabla.
Confirme que la tabla se ha creado.

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

272

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 2: Soluciones (continuacin)


CREATE TABLE
(id
last_name
first_name
dept_id

emp2
NUMBER(7),
VARCHAR2(25),
VARCHAR2(25),
NUMBER(7));

DESCRIBE emp2

4. Modifique la tabla EMP2 para permitir apellidos de empleado ms largos. Confirme


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


datos. (Indicacin: USER_TABLES)

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
SELECT
FROM
WHERE

table_name
user_tables
table_name IN ('DEPT2', 'EMP2');

6. Cree la tabla EMPLOYEES2 basndose en la estructura de la tabla EMPLOYEES.


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

CREATE TABLE employees2 AS


SELECT employee_id id, first_name, last_name, salary,
department_id dept_id
FROM
employees;

7. Borre la tabla EMP2.

DROP TABLE emp2;

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

273

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 2: Soluciones (continuacin)


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
modificacin comprobando la descripcin de la tabla.
ALTER TABLE employees2
DROP COLUMN first_name;

DESCRIBE employees2

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

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


la modificacin comprobando la descripcin de la tabla.
ALTER TABLE employees2
SET
UNUSED (dept_id);
DESCRIBE employees2

12. Borre todas las columnas UNUSED de la tabla EMPLOYEES2. Confirme la


modificacin comprobando la descripcin de la tabla.
ALTER TABLE employees2
DROP UNUSED COLUMNS;
DESCRIBE employees2

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

274

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 2: Soluciones (continuacin)


13. Agregue una restriccin PRIMARY KEY de nivel de tabla a la tabla EMP2 en la
columna ID. Se debe asignar un nombre a la restriccin en el momento de la
creacin. Asigne a la restriccin el nombre my_emp_id_pk.
ALTER TABLE
emp2
ADD CONSTRAINT my_emp_id_pk PRIMARY KEY (id);
14. Cree una restriccin PRIMARY KEY a la tabla DEPT2 mediante la columna ID. Se
debe asignar un nombre a la restriccin en el momento de la creacin. Asigne a la
restriccin 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 restriccin el nombre
my_emp_dept_id_fk.

ALTER TABLE emp2


ADD CONSTRAINT my_emp_dept_id_fk
FOREIGN KEY (dept_id) REFERENCES dept2(id);

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

16. Confirme que las restricciones se han agregado consultando la vista USER_
CONSTRAINTS.
Tenga en cuenta los tipos y los nombres de las restricciones.
SELECT
FROM
WHERE

constraint_name, constraint_type
user_constraints
table_name IN ('EMP2', 'DEPT2');

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

object_name, object_type
user_objects
object_name LIKE 'EMP%'
object_name LIKE 'DEPT%';

Si le queda tiempo, realice el siguiente ejercicio:


18. Modifique la tabla EMP2. Agregue una columna COMISSION de tipo de datos
NUMBER, precisin 2, escala 2. Agregue una restriccin a la columna COMMISSION
que garantice que el valor de comisin es mayor que cero.
ALTER TABLE emp2
ADD commission NUMBER(2,2)
CONSTRAINT my_emp_comm_ck CHECK (commission > 0);

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

275

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 2: Soluciones (continuacin)


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

30

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

CREATE TABLE DEPT_NAMED_INDEX


(deptno NUMBER(4)
PRIMARY KEY USING INDEX
(CREATE INDEX dept_pk_idx ON
DEPT_NAMED_INDEX(deptno)),
dname VARCHAR2(30));

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

276

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 3: Soluciones
1. Ejecute el archivo de comandos lab_03_01.sql en la carpeta de prcticas 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 prcticas 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 prcticas para
crear la tabla SPECIAL_SAL.

6. Muestre la estructura de la tabla SPECIAL_SAL.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
DESC special_sal

7. a. Escriba una consulta para:


- Recuperar los detalles de identificador de empleado, fecha de contratacin,
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 dlares, insertar los detalles de identificador
de empleado y salario en la tabla SPECIAL_SAL.
- Insertar los detalles de identificador de empleado, fecha de contratacin y
salario en la tabla SAL_HISTORY.
- Insertar los detalles de identificador de empleado, identificador de supervisor y
salario en la tabla MGR_HISTORY.
INSERT ALL
WHEN SAL > 20000 THEN
INTO special_sal VALUES (EMPID, SAL)
ELSE
INTO sal_history VALUES(EMPID,HIREDATE,SAL)
INTO mgr_history VALUES(EMPID,MGR,SAL)
SELECT employee_id EMPID, hire_date HIREDATE,

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

277

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 3: Soluciones (continuacin)


salary SAL, manager_id MGR
FROM employees
WHERE employee_id < 125;
b.

Muestre los registros de la tabla SPECIAL_SAL.


SELECT * FROM

c.

Muestre los registros de la tabla SAL_HISTORY.


SELECT * FROM

d.

special_sal;

sal_history;

Muestre los registros de la tabla MGR_HISTORY.


SELECT * FROM mgr_history;
Ejecute el archivo de comandos lab_03_08a.sql en la carpeta
de prcticas para crear la tabla SALES_SOURCE_DATA.

8. a.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
b.

Ejecute el archivo de comandos lab_03_08b.sql en la carpeta de


prcticas para insertar registros en la tabla SALES_SOURCE_DATA.

c.

Muestre la estructura de la tabla SALES_SOURCE_DATA.


DESC sales_source_data

d.

Muestre los registros de la tabla SALES_SOURCE_DATA.


SELECT * FROM SALES_SOURCE_DATA;

e.

Ejecute el archivo de comandos lab_03_08c.sql en la carpeta


de prcticas para crear la tabla SALES_INFO.

f.

Muestre la estructura de la tabla SALES_INFO.


DESC sales_info

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

278

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 3: Soluciones (continuacin)


g.
Escriba una consulta para:
- Recuperar los detalles de identificador de empleado, identificador de semana,
ventas el lunes, ventas el martes, ventas el mircoles, ventas el jueves y ventas
el viernes de la tabla SALES_SOURCE_DATA.
- Crear tal transformacin que cada registro recuperado de la tabla
SALES_SOURCE_DATA se convierta en varios registros para la tabla
SALES_INFO.
Indicacin: Utilice una sentencia INSERT de pivoting.
INSERT
INTO
INTO
INTO
INTO

ALL
sales_info VALUES (employee_id, week_id, sales_MON)
sales_info VALUES (employee_id, week_id, sales_TUE)
sales_info VALUES (employee_id, week_id, sales_WED)
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;
Muestre los registros de la tabla SALES_INFO.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

h.

SELECT * FROM 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 electrnico
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 emp_dir. Para ello, puede utilizar el archivo de comandos
lab_03_09.sql.

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

279

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 3: Soluciones (continuacin)


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 continuacin, ejecute el archivo de comandos lab_03_10.sql para crear la tabla


EMP_HIST.
a. Aumente el tamao de la columna de correo electrnico a 45.
b. Fusione los datos de la tabla EMP_DATA creada en la ltima prctica en los datos de
la tabla EMP_HIST. Supongamos que los datos de la tabla externa EMP_DATA son
los ms actualizados. Si una fila de la tabla EMP_DATA se corresponde con la tabla
EMP_HIST, actualice la columna de correo electrnico de la tabla EMP_HIST para
hacerla corresponder con la fila de la tabla EMP_DATA. Si una fila de la tabla
EMP_DATA no encuentra correspondencia, insrtela en la tabla EMP_HIST. Se
considera que las filas se corresponden cuando el nombre y el apellido del empleado
son idnticos.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
MERGE INTO EMP_HIST f USING EMP_DATA h
ON (f.first_name = h.first_name
AND f.last_name = h.last_name)
WHEN MATCHED THEN
UPDATE SET f.email = h.email
WHEN NOT MATCHED THEN
INSERT (f.first_name
, f.last_name
, f.email)
VALUES (h.first_name
, h.last_name
, h.email);

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

280

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 3: Soluciones (continuacin)


c. Recupere las filas de EMP_HIST despus de la fusin.
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 continuacin,
cambie el departamento de Kochhar a 50 y valide el cambio. Realice un seguimiento
de los cambios efectuados en Kochhar mediante la funcin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II A-14

281

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 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 estn 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 funcin
GROUPING para determinar si los valores NULL de las columnas correspondientes a
las expresiones GROUP BY los genera la operacin ROLLUP.

SELECT manager_id MGR ,job_id JOB,


sum(salary),GROUPING(manager_id),GROUPING(job_id)
FROM
employees
WHERE manager_id < 120
GROUP BY ROLLUP(manager_id,job_id);

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

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 estn 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
SELECT manager_id, job_id, sum(salary)
FROM
employees
WHERE manager_id < 120
GROUP BY CUBE(manager_id, job_id);

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

282

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 4: Soluciones (continuacin)


4. Observe la salida de la pregunta 3. Escriba una consulta mediante la funcin
GROUPING para determinar si los valores NULL en las columnas correspondientes a
las expresiones GROUP BY los genera la operacin 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
GROUP BY
GROUPING SETS ((department_id, manager_id, job_id),
(department_id, job_id),(manager_id,job_id));

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II A-16

283

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 5: Soluciones
1. Modifique la sesin 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 sesin para definir el valor del parmetro TIME_ZONE en el offset
de zona horaria US/Pacific-New.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

ALTER SESSION SET TIME_ZONE = '-7:00';

c. Muestre los valores de CURRENT_DATE, CURRENT_TIMESTAMP y


LOCALTIMESTAMP para esta sesin.
Nota: La salida puede ser diferente, segn la fecha en que se ejecute el comando.
SELECT CURRENT_DATE, CURRENT_TIMESTAMP,
LOCALTIMESTAMP FROM DUAL;

d. Modifique la sesin para definir el valor del parmetro TIME_ZONE en el offset


de zona horaria Singapore.
ALTER SESSION SET TIME_ZONE = '+8:00';

e. Muestre los valores de CURRENT_DATE, CURRENT_TIMESTAMP y


LOCALTIMESTAMP para esta sesin.
Nota: La salida podra ser diferente, segn la fecha en que se ejecute el comando.
SELECT CURRENT_DATE, CURRENT_TIMESTAMP,
LOCALTIMESTAMP FROM DUAL;

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

284

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 5: Soluciones (continuacin)


Nota: Observe en la prctica anterior que CURRENT_DATE,
CURRENT_TIMESTAMP y LOCALTIMESTAMP son todos sensibles a la zona
horaria de la sesin.
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 sesin para definir NLS_DATE_FORMAT en DD-MON-YYYY.

ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY';

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

6. Examine y ejecute el archivo de comandos lab_05_06.sql para crear la tabla


SAMPLE_DATES y rellenarla.
a.

Seleccione en la tabla y vea los datos.

SELECT * FROM sample_dates;

b.

Modifique el tipo de datos de la columna DATE_COL y cmbielo a


TIMESTAMP. Seleccione en la tabla para ver los datos.

ALTER TABLE sample_dates MODIFY date_col TIMESTAMP;


SELECT * FROM sample_dates;

c.

Intente modificar el tipo de datos de la columna DATE_COL y cmbielo a


TIMESTAMP WITH TIME ZONE. Qu sucede?
ALTER TABLE sample_dates MODIFY date_col
TIMESTAMP WITH TIME ZONE;

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
WITH TIMEZONE mediante la sentencia ALTER.

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

285

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 5: Soluciones (continuacin)


7. Cree una consulta para recuperar apellidos de la tabla EMPLOYEES y calcule el estado
de revisin. Si el ao de contratacin fue 2000, muestre Needs Review para el
estado de revisin, si no, muestre not this year!. Asigne a la columna de estado
de revisin el nombre Review. Ordene los resultados por la columna HIRE_DATE.
Indicacin: Utilice una expresin CASE con la funcin EXTRACT para calcular el
estado de revisin.

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 nmero de aos de servicio para
cada empleado. Si el empleado lleva contratado cinco aos o ms, imprima 5 years
of service. Si el empleado lleva contratado 10 aos o ms, imprima 10 years
of service. Si el empleado lleva contratado 15 aos o ms, 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.
Indicacin: Utilice TO_YMINTERVAL y expresiones CASE.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
SELECT e.last_name, hire_date, sysdate,
(CASE
WHEN (sysdate -TO_YMINTERVAL('15-0'))>=
hire_date THEN
'15 years of service'
WHEN (sysdate -TO_YMINTERVAL('10-0'))>=
hire_date
THEN '10 years of service'
WHEN (sysdate - TO_YMINTERVAL('5-0'))>=
hire_date
THEN '5 years of service'
ELSE 'maybe next year!'
END) AS "Awards"
FROM
employees e;

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

286

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 6: Soluciones
1. Escriba una consulta para mostrar el apellido, el nmero de departamento y el salario
de cualquier empleado cuyo nmero de departamento y salario se correspondan con el
nmero de departamento y el salario de cualquier empleado que gane una comisin.
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 nmero de departamento y el salario de cualquier empleado


cuyo salario y comisin se correspondan con el salario y la comisin de cualquier
empleado con el identificador de ubicacin 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)
FROM employees e, departments d
WHERE e.department_id = d.department_id
AND d.location_id = 1700);

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

3. Cree una consulta para mostrar el apellido, la fecha de contratacin y el salario de


todos los empleados que tengan el mismo salario y la misma comisin que Kochhar.
Nota: No muestre a Kochhar en el juego de resultados.

SELECT last_name, hire_date, salary


FROM
employees
WHERE (salary, NVL(commission_pct,0)) IN
(SELECT salary, NVL(commission_pct,0)
FROM
employees
WHERE last_name = 'Kochhar')
AND last_name != 'Kochhar';

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

287

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 6: Soluciones (continuacin)


4. Cree una consulta para mostrar los empleados que ganen un salario que sea ms 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
FROM locations
WHERE city LIKE 'T%'));

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

6. Escriba una consulta para buscar todos los empleados que ganen ms 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.

SELECT e.last_name ename, e.salary salary,


e.department_id deptno, AVG(a.salary) dept_avg
FROM
employees e, employees a
WHERE e.department_id = a.department_id
AND
e.salary > (SELECT AVG(salary)
FROM
employees
WHERE department_id = e.department_id )
GROUP BY e.last_name, e.salary, e.department_id
ORDER BY AVG(a.salary);

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

288

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 6: Soluciones (continuacin)


7. Busque todos los empleados que no sean supervisores.
a. Hgalo 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? Cmo o por qu no?
SELECT
FROM
WHERE
NOT IN

outer.last_name
employees outer
outer.employee_id
(SELECT inner.manager_id
FROM
employees inner);

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Esta solucin alternativa no es adecuada. La subconsulta selecciona un valor NULL, as que


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
que haya valores NULL que formen parte del juego de valores, no utilice NOT IN como
sustituto de NOT EXISTS.
8. Escriba una consulta para mostrar los apellidos de los empleados que ganen menos
que el salario medio en sus departamentos.
SELECT last_name
FROM
employees outer
WHERE outer.salary < (SELECT AVG(inner.salary)
FROM employees inner
WHERE inner.department_id
= outer.department_id);

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

289

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 6: Soluciones (continuacin)


9. Escriba una consulta para mostrar los apellidos de los empleados que tienen uno o
ms colegas en su departamento con fechas de contratacin posteriores pero salarios
ms 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,


(SELECT department_name
FROM departments d
WHERE
e.department_id =
d.department_id ) department
FROM employees e
ORDER BY department;

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

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
compaa. Utilice la clusula WITH para escribir esta consulta. Asigne a la consulta el
nombre SUMMARY.
WITH
summary 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)
SELECT department_name, dept_total
FROM summary
WHERE dept_total > ( SELECT SUM(dept_total) * 1/8
FROM summary )
ORDER BY dept_total DESC;

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

290

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 7: Soluciones
1. Observe los siguientes ejemplos de salida. Son resultado de una consulta jerrquica?
Explique por qu o por qu no.
Imagen 1: No es una consulta jerrquica; el informe simplemente se
clasifica en orden descendente por SALARY.
Imagen 2: No es una consulta jerrquica; hay dos tablas implicadas.
Imagen 3: S, definitivamente se trata de una consulta jerrquica, ya que
muestra la estructura de rbol que representa la lnea 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;

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

3. Cree un informe que muestre la jerarqua de los supervisores del empleado Lorentz.
Muestre primero el supervisor inmediato.
SELECT last_name
FROM employees
WHERE last_name != 'Lorentz'
START WITH last_name = 'Lorentz'
CONNECT BY PRIOR manager_id = employee_id;

4. Cree un informe con sangrado que muestre la jerarqua 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.
COLUMN name FORMAT A20
SELECT LPAD(last_name, LENGTH(last_name)+(LEVEL*2)2,'_')
name,manager_id mgr, department_id deptno
FROM employees
START WITH last_name = 'Kochhar'
CONNECT BY PRIOR employee_id = manager_id
/
COLUMN name CLEAR

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

291

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 7: Soluciones (continuacin)


Si le queda tiempo, realice los siguientes ejercicios:
5. Genere un organigrama de la compaa que muestre la jerarqua de los supervisores.
Parta de la persona de nivel ms alto, excluya a todas las personas con el identificador
de puesto IT_PROG, a De Haan y a los empleados que estn 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II A-25

292

Introduccin a Oracle 10g: SQL Fundamentals II

Prctica 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 visualizacin.
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 slo las filas que se vean afectadas.

SELECT REGEXP_REPLACE (street_address, 'St$',


'Street') FROM locations
WHERE REGEXP_LIKE (street_address, 'St');

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II A-26

293

Introduccin a Oracle 10g: SQL Fundamentals II

_____________________

Apndice B
Descripciones de
Tablas y Datos
_____________________

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
294

Introduccin a Oracle 10g: SQL Fundamentals II

DIAGRAMA DE RELACIONES DE ENTIDADES

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II B-2

295

Introduccin a Oracle 10g: SQL Fundamentals II

Tablas del Esquema


SELECT * FROM tab;

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II B-3

296

Introduccin a Oracle 10g: SQL Fundamentals II

Tabla REGIONS
DESCRIBE regions

SELECT * FROM regions;

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II B-4

297

Introduccin a Oracle 10g: SQL Fundamentals II

Tabla COUNTRIES
DESCRIBE countries

SELECT * FROM countries;

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II B-5

298

Introduccin a Oracle 10g: SQL Fundamentals II

Tabla LOCATIONS
DESCRIBE locations;

SELECT * FROM locations;

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II B-6

299

Introduccin a Oracle 10g: SQL Fundamentals II

Tabla DEPARTMENTS
DESCRIBE departments

SELECT * FROM departments;

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II B-7

300

Introduccin a Oracle 10g: SQL Fundamentals II

Tabla JOBS
DESCRIBE jobs

SELECT * FROM jobs;

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II B-8

301

Introduccin a Oracle 10g: SQL Fundamentals II

Tabla EMPLOYEES
DESCRIBE employees

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II B-9

302

Introduccin a Oracle 10g: SQL Fundamentals II

Tabla EMPLOYEES
Las cabeceras de las columnas COMMISSION_PCT, MANAGER_ID y DEPARTMENT_ID
estn 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 pgina.
SELECT * FROM employees;

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II B-10

303

Introduccin a Oracle 10g: SQL Fundamentals II

Tabla EMPLOYEES (continuacin)

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II B-11

304

Introduccin a Oracle 10g: SQL Fundamentals II

Tabla EMPLOYEES (continuacin)

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II B-12

305

Introduccin a Oracle 10g: SQL Fundamentals II

Tabla JOB_HISTORY
DESCRIBE job_history

SELECT * FROM job_history;

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II B-13

306

Introduccin a Oracle 10g: SQL Fundamentals II

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II B-14

307

Introduccin a Oracle 10g: SQL Fundamentals II

Escritura de Archivos de Comandos Avanzados

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
308

Introduccin a Oracle 10g: SQL Fundamentals II

Objetivos
Al finalizar este apndice, debera 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Objetivos
En este apndice, aprender a escribir un archivo de comandos SQL para generar un archivo
de comandos SQL.

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

309

Introduccin 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 recopilacin de tablas y vistas que
contienen informacin de base de datos
Oracle Server lo crea y lo mantiene
SQL

Diccionario de datos

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Archivo de comandos SQL

Uso de SQL para Generar SQL


SQL puede ser una potente herramienta para generar otras sentencias SQL. En la mayora de
los casos, esto implica la escritura de un archivo de comandos. Puede utilizar SQL desde
SQL para:
Evitar codificacin repetida
Acceder a informacin del diccionario de datos
Borrar o volver a crear objetos de base de datos
Generar predicados dinmicos que contengan parmetros de tiempo de ejecucin
Los ejemplos utilizados en esta leccin implican la seleccin de informacin del diccionario
de datos. El diccionario de datos es una recopilacin de tablas y vistas que contienen
informacin sobre la base de datos. Oracle Server crea y mantiene esta recopilacin. Todas las
tablas de diccionario de datos son propiedad del usuario SYS. La informacin almacenada en
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
informacin de auditora. Hay cuatro categoras de vistas de diccionario de datos. Cada
categora tiene prefijos distintos que reflejan el uso para el que se ha concebido.
Prefijo
USER_
ALL_
DBA_
V$_

Descripcin

Contiene detalles de objetos propiedad del usuario


Contiene detalles de objetos para los que se le han otorgado derechos de acceso al usuario, adems de
objetos propiedad del usuario
Contiene detalles de usuarios con privilegios DBA para acceder a cualquier objeto de la base de datos
Informacin almacenada sobre rendimiento y bloqueo de servidor de bases de datos; slo disponible
para el DBA
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II C-3

310

Introduccin a Oracle 10g: SQL Fundamentals II

Creacin de un Archivo de Comandos Bsico

SELECT 'CREATE TABLE ' || table_name ||


'_test ' || 'AS SELECT * FROM '
|| table_name ||' WHERE 1=2;'
AS "Create Table Script"
FROM
user_tables;

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Archivo de Comandos Bsico


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
la sintaxis para crear una tabla mediante el nombre de tabla con el sufijo _test y slo con la
estructura de la tabla existente correspondiente. El nombre de tabla antiguo se obtiene a partir
de la columna TABLE_NAME de la vista de diccionario de datos USER_TABLES.
El paso siguiente es mejorar el informe para automatizar el proceso.
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:
USER_TABLES: Muestra la descripcin de las tablas propiedad del usuario
USER_OBJECTS: Muestra todos los objetos propiedad del usuario
USER_TAB_PRIVS_MADE: Muestra todos los permisos para objetos propiedad del
usuario
USER_COL_PRIVS_MADE: Muestra todos los permisos para columnas de objetos
propiedad del usuario

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

311

Introduccin a Oracle 10g: SQL Fundamentals II

Control del Entorno

SET ECHO OFF


SET FEEDBACK OFF
SET PAGESIZE 0

Defina variables del


sistema en los valores
adecuados.

SPOOL dropem.sql
SENTENCIA SQL
SPOOL OFF

SET FEEDBACK ON
SET PAGESIZE 24
SET ECHO ON

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Vuelva a definir las


variables del sistema
en el valor por defecto.

Control del Entorno


Para ejecutar las sentencias SQL que se generan, las debe capturar en un archivo de spool que
se puede ejecutar a continuacin. Tambin debe planificar una limpieza de la salida que se
genera y asegurarse de suprimir elementos como, por ejemplo, cabeceras, mensajes de
feedback, ttulos superiores, etc. Para ello, puede utilizar comandos de iSQL*Plus.

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

312

Introduccin 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
SET ECHO ON

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

La Imagen Completa
La salida del comando de la diapositiva se guarda en un archivo denominado dropem.sql
mediante la opcin de salida File de iSQL*Plus. El archivo contiene los siguientes datos.
Este archivo ya se puede iniciar desde iSQL*Plus. Para ello, localice el archivo de comandos,
crguelo y ejectelo.

Nota: Por defecto, los archivos se envan a la cola de espera a la carpeta ORACLE_HOME\
ORANT\BIN en Windows NT.

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

313

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

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

SET PAGESIZE 24
SET HEADING ON ECHO ON FEEDBACK ON

Volcado del Contenido de una Tabla en un Archivo


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
puede ejecutar para rellenar la tabla en caso de que se haya borrado dicha tabla por accidente.
El ejemplo de la diapositiva genera sentencias INSERT para la tabla DEPARTMENTS_TEST,
capturadas en el archivo data.sql mediante la opcin de salida File de iSQL*Plus.
El contenido del archivo de comandos data.sql es el siguiente:
INSERT INTO departments_test VALUES
(10, 'Administration', 1700);
INSERT INTO departments_test VALUES
(20, 'Marketing', 1800);
INSERT INTO departments_test VALUES
(50, 'Shipping', 1500);
INSERT INTO departments_test VALUES
(60, 'IT', 1400);
...

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

314

Introduccin a Oracle 10g: SQL Fundamentals II

Volcado del Contenido de una Tabla en


un Archivo
Origen

Resultado

'''X'''

'X'

''''

'

''''||department_name||''''

'Administration'

''', '''

','

''');'

');

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Volcado del Contenido de una Tabla en un Archivo (continuacin)


Posiblemente le ha llamado la atencin el gran nmero de comillas simples que hay en la
diapositiva de la pgina anterior. Un juego de cuatro comillas simples genera una comilla
simple en la sentencia final. Adems, recuerde que los valores de caracteres y de fecha deben
ir entre comillas.
Dentro de una cadena, para mostrar una comilla simple, le debe poner como prefijo otra
comilla simple. Por ejemplo, en el quinto ejemplo de la diapositiva, las comillas son para toda
la cadena. La segunda comilla acta como prefijo para mostrar la tercera comilla. As, el
resultado es una comilla simple seguida del parntesis y seguido del punto y coma.

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

315

Introduccin a Oracle 10g: SQL Fundamentals II

Generacin de un Predicado Dinmico

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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Generacin de un Predicado Dinmico


El ejemplo de la diapositiva genera una sentencia SELECT que recupera datos de todos los
empleados de un departamento que se contrataron un da especfico. El archivo de comandos
genera la clusula WHERE dinmicamente.
Nota: Una vez volcada la variable de usuario, debe utilizar el comando UNDEFINE para
suprimirlo.
La primera sentencia SELECT le pide que introduzca el nmero de departamento. Si no
introduce ningn nmero de departamento, la funcin DECODE lo considera nulo y se pedir
al usuario la fecha de contratacin. Si no introduce ninguna fecha de contratacin, la funcin
DECODE la considera nula y la clusula WHERE dinmica que se genera ser tambin nula, lo
que hace que la segunda sentencia SELECT recupere todas las filas de la tabla EMPLOYEES.
Nota: La variable NEW_V[ALUE] especifica una variable para contener un valor de
columna. Puede hacer referencia a la variable en comandos TTITLE. Utilice NEW_VALUE
para mostrar valores de columna o la fecha en el ttulo superior. Debe incluir la columna en
un comando BREAK con la accin SKIP PAGE. El nombre de variable no puede contener
una almohadilla (#). NEW_VALUE resulta til para informes maestro/detalle en los que hay un
nuevo registro maestro para cada pgina.

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

316

Introduccin a Oracle 10g: SQL Fundamentals II

Generacin de un Predicado Dinmico (continuacin)


Nota: Aqu, la fecha de contratacin 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:

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Se genera el siguiente valor para MY_COL:

Cuando se ejecuta el segundo ejemplo de la diapositiva, se genera la siguiente salida:

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

317

Introduccin a Oracle 10g: SQL Fundamentals II

Resumen
En este apndice, 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Resumen
SQL se puede utilizar para generar archivos de comandos SQL. Estos archivos de comandos
se pueden utilizar para evitar una codificacin repetida, borrar o volver a crear objetos,
obtener ayuda del diccionario de datos y generar predicados dinmicos que contengan
parmetros de tiempo de ejecucin.
Se pueden utilizar comandos de iSQL*Plus para capturar los informes generados por las
sentencias SQL y limpiar la salida que se genera como, por ejemplo, mediante la supresin de
cabeceras, mensajes de feedback, etc.

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

318

Introduccin a Oracle 10g: SQL Fundamentals II

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II C-12

319

Introduccin a Oracle 10g: SQL Fundamentals II

Componentes de la Arquitectura Oracle

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
320

Introduccin a Oracle 10g: SQL Fundamentals II

Objetivos
Al finalizar este apndice, debera estar capacitado
para:
Describir la arquitectura de Oracle Server y sus
componentes principales
Mostrar las estructuras implicadas en la conexin
de un usuario a una instancia Oracle
Enumerar las etapas de procesamiento:

Consultas
Sentencias DML
Validaciones

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Objetivos
En este apndice se presenta la arquitectura de Oracle Server. Para ello, se describen las
estructuras de archivos, procesos y memoria implicados en el establecimiento de una
conexin a base de datos y en la ejecucin de un comando SQL.

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

321

Introduccin a Oracle 10g: SQL Fundamentals II

Arquitectura de la Base de Datos Oracle:


Visin General
La base de datos Oracle consta de dos componentes
principales:
Base de datos o estructuras fsicas
Instancia o estructuras de memoria

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Arquitectura de la Base de Datos Oracle: Visin General


La base de datos Oracle consta de dos componentes principales: La instancia y la base de
datos propiamente dicha.
La base de datos se compone de archivos fsicos como, por ejemplo:
- Archivo de control, donde se almacena la configuracin de la base de datos
- Archivos redo log que tienen informacin necesaria para la recuperacin de la base
de datos
- Archivos de datos, donde se almacenan todos los datos
- Archivo de parmetros, que contiene los parmetros que controlan el tamao y las
propiedades de una instancia
- Archivo de contraseas, que contiene la contrasea del superusuario o SYSDBA
La instancia se compone de la SGA (rea Global del Sistema) y los procesos del
servidor que realizan tareas dentro de la base de datos.

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

322

Introduccin a Oracle 10g: SQL Fundamentals II

Arquitectura Fsica de la Base de Datos

Archivos de control

Archivos de datos

Archivos redo log en lnea

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Archivo de
parmetros

Archivo de
contraseas

Archivos log
archivados

Arquitectura Fsica de la Base de Datos


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,
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.
Archivos de datos: Estos archivos contienen los datos de la base de datos.
Archivos redo log en lnea: Estos archivos permiten la recuperacin de la instancia de
la base datos. Si la base de datos fallase sin perder ningn archivo de datos, la instancia
podr recuperar la base de datos con la informacin de estos archivos.
Hay otros archivos que no forman parte oficialmente de la base de datos pero que son
importantes para la correcta ejecucin de la base de datos. stos son:
Archivo de parmetros: Se utiliza para definir cmo se configurar la instancia al
iniciarse.
Archivo de contraseas: Este archivo permite a los usuarios conectarse a la base de
datos de manera remota y realizar tareas administrativas.
Archivos log archivados: Estos archivos contienen un historial continuado del redo
generado por la instancia. Estos archivos permiten la recuperacin de la base de datos.
Mediante estos archivos y una copia de seguridad de la base de datos, se puede
recuperar un archivo de datos perdido.

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

323

Introduccin a Oracle 10g: SQL Fundamentals II

Archivos de control

Contienen informacin de la estructura fsica de la


base de datos
Se multiplexan para proteger contra prdidas
Se leen en la etapa de montaje

Archivos de control

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Archivos de control
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 fsicos que componen la base de datos.
Al agregar archivos adicionales a la base de datos, el archivo de control se actualiza
automticamente.
La ubicacin de los archivos de control se especifica en un parmetro de inicializacin.
Para protegerse de un fallo de la base de datos debido a la prdida del archivo de control,
debera multiplexar el archivo de control en al menos tres dispositivos fsicos distintos. Si
especifica varios archivos a travs del parmetro de inicializacin, el servidor de bases de
datos Oracle puede mantener varias copias del archivo de control.

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

324

Introduccin a Oracle 10g: SQL Fundamentals II

Archivos Redo Log

Registran los cambios realizados en la base de datos


Se multiplexan para proteger contra prdidas
Buffer de
redo log
LGWR
(Escritor
de Log)

Grupo 2

Grupo 3

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Grupo 1

Archivos Redo Log


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
la base de datos de la prdida de integridad debida a fallos del sistema provocados por cortes
elctricos, fallos de disco, etc. Los archivos redo log se deben multiplexar para asegurarse de
que la informacin almacenada en ellos no se perder en caso de que se produzca un fallo
de disco.
El redo log se compone de grupos de archivos redo log. Un grupo consiste en un archivo redo
log y sus copias multiplexadas. Se dice que cada copia idntica es un miembro de ese grupo y
cada grupo se identifica con un nmero. LGWR (Proceso de escritor de log) escribe registros
redo del buffer de redo log en un grupo de redo log hasta que se rellene el archivo o se solicite
una operacin de cambio de log. A continuacin, cambia y se escribe en los archivos del
grupo siguiente. Los archivos redo log se utilizan de forma circular.

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

325

Introduccin a Oracle 10g: SQL Fundamentals II

Tablespaces y Archivos de Datos

Los tablespaces constan de uno o ms archivos


de datos.
Los archivos de datos pertenecen a un solo
tablespace.

Archivo de
datos 1

Archivo de
datos 2

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Tablespace USERS

Tablespaces y Archivos de Datos


Una base de datos se divide en unidades de almacenamiento lgicas denominadas tablespaces,
que se pueden utilizar para agrupar estructuras lgicas relacionadas. Cada base de datos se
divide lgicamente en uno o ms tablespaces. Se crean uno o ms archivos de datos
explcitamente para cada tablespace para almacenar fsicamente los datos de todas las
estructuras lgicas de un tablespace.
Nota: Tambin 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
smallfile (por defecto) pueden contener varios archivos de datos, pero los archivos no
pueden ser tan grandes. Para obtener ms informacin sobre tablespaces bigfile, consulte
Database Administrators Guide.

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

326

Introduccin a Oracle 10g: SQL Fundamentals II

Segmentos, Extensiones y Bloques

Los segmentos existen dentro de un tablespace.


Los segmentos se componen de una recopilacin de
extensiones.
Las extensiones son una recopilacin de bloques de
datos.
Los bloques de datos se asignan a bloques de sistema
operativo.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Segmento

Extensiones

Bloques
de datos

Bloques de
sistema operativo

Segmentos, Extensiones y Bloques


Los objetos de base de datos como por ejemplo, tablas e ndices, se almacenan en tablespaces
como segmentos. Cada segmento contiene una o ms extensiones. Una extensin consiste en
bloques de datos contiguos, lo que significa que cada extensin slo puede existir en un
archivo de datos. Los bloques de datos son la unidad ms pequea de E/S de la base de datos.
Cuando la base de datos solicita un juego de bloques de datos del sistema operativo, ste lo
asigna al bloque de sistema operativo real del dispositivo de almacenamiento. Por esto, no es
necesario conocer la direccin fsica de ninguno de los datos de la base de datos. Esto tambin
significa que un archivo de datos se puede segmentar o duplicar en varios discos.
El tamao del bloque de datos se puede definir en el momento de la creacin de la base de
datos. El tamao por defecto de 8 K es adecuado para la mayora de bases de datos. Si la base
de datos soporta una aplicacin de almacn de datos que tiene tablas e ndices grandes, puede
resultar conveniente un bloque mayor. Si la base de datos soporta una aplicacin transaccional
en la que las lecturas y escrituras son muy aleatorias, puede resultar ms adecuado especificar
un tamao de bloque menor. El tamao mximo de bloque depende del sistema operativo. El
tamao mnimo de bloque es 2 K y se debera utilizar en raras ocasiones (o nunca).
Puede tener tablespaces con diferentes tamaos de bloque. Generalmente, esto slo se debera
utilizar para soportar tablespaces transportables. Para obtener detalles, consulte Database
Administrators Guide.

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

327

Introduccin a Oracle 10g: SQL Fundamentals II

Gestin de Instancias Oracle


SGA
Pool
compartido

Pool para
Streams

Pool grande

Pool Java

Cach de
buffers de la
base de datos

Buffer de
redo log

SMON
(Monitor
del
Sistema)

PMON
(Monitor
de
Procesos)

Punto de
control
CKPT

DBW0
(Escritor de
Base de
Datos)

LGWR
(Escritor
de Log)

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

ARC0
(Proceso de
Archivado)

Gestin de Instancias Oracle


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
SGA (rea Global del Sistema) y procesos en segundo plano.
La instancia est inactiva (no existente) hasta que se inicia. Cuando se inicia la instancia, se
lee un archivo de parmetros de inicializacin y la instancia se configura de la manera
correspondiente.
Una vez iniciada la instancia y abierta la base de datos, los usuarios pueden acceder a la base
de datos.

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

328

Introduccin a Oracle 10g: SQL Fundamentals II

Estructuras de Memoria Oracle

Proceso
del
servidor 1

PGA

Proceso
del
servidor 2

PGA

Proceso en
segundo
plano

PGA

SGA
Pool para
Streams

Pool grande

Pool Java

Cach de
buffers de la
base de datos

Buffer de
redo log

Pool
compartido

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Estructuras de Memoria Oracle


Las estructuras de memoria bsicas asociadas a una instancia Oracle son:
SGA (rea Global del Sistema): Compartida por el servidor y los procesos en
segundo plano
PGA (rea Global de Programas): Privada para cada servidor y cada proceso en
segundo plano; hay una PGA para cada proceso
La SGA (rea Global del Sistema) es un rea de memoria compartida que contiene datos e
informacin de control para la instancia.
La SGA se compone de las siguientes estructuras de datos:
Cach de buffers de base de datos: Almacena en cach bloques de datos recuperados
de la base de datos
Buffer de redo log: Almacena en cach la informacin de redo (utilizada para la
recuperacin de la instancia) hasta que se pueda escribir en los archivos redo log fsicos
almacenados en disco
Pool compartido: Almacena varias construcciones que se pueden compartir entre
usuarios
Pool grande: rea opcional utilizada para almacenar en buffer solicitudes grandes
de E/S
Pool Java: Utilizado para el cdigo Java especfico de sesin 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

Introduccin a Oracle 10g: SQL Fundamentals II

Estructuras de Memoria Oracle (continuacin)


Al iniciar la instancia mediante Enterprise Manager o SQL*Plus, se muestra la memoria
asignada para la SGA.
Con la infraestructura dinmica de SGA, el tamao 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
parmetros de memoria. Sin embargo, a medida que aumenta el uso de la base de datos, puede
resultar necesario modificar los valores de los parmetros de memoria.
Oracle proporciona alertas y asesores para identificar problemas de tamao de memoria y
para ayudar a determinar los valores adecuados para los parmetros de memoria.
Una PGA (rea Global de Programas) es una regin de memoria que contiene datos e
informacin 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 slo la puede leer y escribir el cdigo de Oracle que acte 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, informacin enlazada y
estructuras de memoria de tiempo de ejecucin. Cada sesin que emite una sentencia
SQL tiene un rea SQL privada.
Memoria de sesin: La memoria asignada para retener las variables de sesin y otra
informacin relacionada con la sesin.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-11

330

Introduccin 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

PMON
Monitor de
procesos

SMON
Monitor del
sistema

CKPT
Punto de
control

LGWR
Escritor
de Log

ARC0
Proceso de
Archivado

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

DBW0
Escritor de
base
de datos

Procesos en segundo plano

Procesos Oracle
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 aplicacin.
Oracle tambin crea un juego de procesos en segundo plano para una instancia que
interactan entre s y con el sistema operativo para gestionar las estructuras de memoria,
realizar E/S asncronamente para escribir datos en disco y realizar tareas de mantenimiento
general.
Los procesos en segundo plano que estn presentes dependen de las funciones que se estn
utilizando en la base de datos. Los procesos en segundo plano ms comunes son los
siguientes:
SMON (Monitor del sistema): Realiza una recuperacin de fallo cuando se inicia la
instancia despus de un fallo
PMON (Monitor de procesos): Realiza una limpieza de procesos cuando falla un
proceso del usuario
DBWn (Escritor de base de datos): Escribe bloques modificados de la cach de
buffers de base de datos a los archivos en disco
CKPT (Punto de control): Seala DBWn en puntos de control y actualiza todos los
archivos de datos y los archivos de control de la base de datos para indicar el punto de
control ms 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 estn llenos o se produce un cambio de log
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-12

331

Introduccin a Oracle 10g: SQL Fundamentals II

Otras Estructuras Fsicas Clave

Archivo de
parmetros

Archivo de
contraseas

Base de datos

Archivos
log archivados

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Otros Archivos Clave


Oracle Server tambin utiliza otros archivos que no forman parte de la base de datos:
El archivo de parmetros define las caractersticas de una instancia Oracle. Por ejemplo,
contiene los parmetros que especifican el tamao de las estructuras de memoria en
la SGA.
El archivo de contraseas autentica los usuarios a los que se les permite iniciar y cerrar
una instancia Oracle.
Los archivos redo log archivados son copias offline de los archivos redo log que pueden
ser necesarios para recuperarse de los fallos del medio fsico.

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

332

Introduccin a Oracle 10g: SQL Fundamentals II

Procesamiento de una Sentencia SQL

Conexin a una instancia mediante:


El proceso del usuario
El proceso del servidor

Los componentes de Oracle Server que se utilicen


dependern del tipo de sentencia SQL:
Las consultas devuelven filas
Cambios de log de sentencias DML
La validacin garantiza la recuperacin de la transaccin

Algunos componentes de Oracle Server no participan


en el procesamiento de las sentencias SQL.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Componentes que se Utilizan para Procesar SQL


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
instancia Oracle. Estos procesos no forman parte de la instancia Oracle, aunque son
necesarios para procesar una sentencia SQL.
Algunos de los procesos en segundo plano, las estructuras SGA y los archivos de base de
datos se utilizan para procesar sentencias SQL. Dependiendo del tipo de sentencia SQL, se
utilizan diferentes componentes:
Las consultas necesitan un procesamiento adicional para devolver las filas al usuario.
Las sentencias DML (Lenguaje de Manipulacin de Datos) necesitan procesamiento
adicional para registrar los cambios efectuados en los datos.
La validacin del procesamiento asegura que se puedan recuperar los datos modificados
en una transaccin.
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
recuperar la base de datos.
El proceso en segundo plano opcional, ARC0, se utiliza para asegurar la recuperacin de una
base de datos de produccin.

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

333

Introduccin a Oracle 10g: SQL Fundamentals II

Conexin a una Instancia


Usuario

Servidor
Oracle Server
Servidor

Usuario

Cliente
Servidor de aplicaciones

Servidor

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Usuario

Servidor

Explorador

Procesos que se Utilizan para Conectarse a una Instancia


Antes que los usuarios puedan enviar sentencias SQL a Oracle Server, se deben conectar a
una instancia.
El usuario inicia una herramienta como iSQL*Plus, o bien ejecuta una aplicacin que se haya
desarrollado con una herramienta como Oracle Forms. Esta aplicacin o herramienta se
ejecutar en un proceso del usuario.
En la configuracin ms bsica, cuando un usuario se conecta a Oracle Server, se crea un
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
del usuario en el cliente. El proceso del servidor ejecuta las sentencias SQL en nombre del
usuario.

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

334

Introduccin a Oracle 10g: SQL Fundamentals II

Procesos que se Utilizan para Conectarse a una Instancia (continuacin)


Conexin
Una conexin es una ruta de comunicacin 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
aplicacin o una herramienta que accede a la base de datos en ese sistema. Se establece
la ruta de comunicacin mediante los mecanismos de comunicacin entre procesos
disponibles en el sistema operativo del host.
El usuario inicia la aplicacin o la herramienta en un equipo local y se conecta a travs
de la red al equipo que ejecuta la instancia Oracle. En esta configuracin, conocida
como cliente/servidor, el software de red se utiliza para establecer la comunicacin entre
el usuario y Oracle Server.
En una conexin de tres capas, el equipo del usuario se comunica a travs de la red con
un servidor de aplicaciones o de red, que se conecta a travs de una red a la mquina que
ejecuta la instancia Oracle. Por ejemplo, el usuario ejecuta un explorador en un equipo
de red para utilizar una aplicacin 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 sesin es una conexin especfica de un usuario a Oracle Server. La sesin se inicia
cuando Oracle Server valida al usuario, y finaliza cuando el usuario se desconecta o cuando se
produce una terminacin anormal. Un usuario de base de datos determinado puede realizar
muchas sesiones simultneas si dicho usuario se conecta desde distintas herramientas,
aplicaciones o terminales al mismo tiempo. Excepto en el caso de algunas herramientas de
administracin de base de datos especializadas, el inicio de una sesin de base de datos
requiere que Oracle Server est disponible.
Nota: El tipo de conexin que se explica aqu, donde hay una correspondencia uno a uno
entre un proceso del usuario y del servidor, se denomina conexin de servidor dedicado.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-16

335

Introduccin a Oracle 10g: SQL Fundamentals II

Procesamiento de una Consulta

Anlisis:
Busca una sentencia idntica
Comprueba la sintaxis, los nombres de objetos y
los privilegios
Bloquea los objetos que se utilizan durante el
anlisis
Crea y almacena el plan de ejecucin

Ejecucin: Identifica las filas seleccionadas


Recuperacin: Devuelve filas al proceso del
usuario

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Pasos para el Procesamiento de Consultas


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
xito o un fallo, una consulta puede devolver una o miles de filas.
Las etapas principales en el procesamiento de una consulta son tres:
Anlisis
Ejecucin
Recuperacin
Durante la etapa de anlisis, la sentencia SQL se transfiere del proceso del usuario al del
servidor, y se carga una representacin analizada de la sentencia en un rea SQL compartida.
Durante el anlisis, el proceso del servidor realiza las siguientes funciones:
Busca una copia existente de la sentencia SQL en el pool compartido
Valida la sentencia SQL comprobando su sintaxis
Realiza bsquedas en el diccionario de datos para validar las definiciones de tabla y
columna
La ejecucin ejecuta la sentencia mediante el mejor enfoque del optimizador y la
recuperacin vuelve a recuperar las filas para el usuario.

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

336

Introduccin a Oracle 10g: SQL Fundamentals II

Pool Compartido

La cach de biblioteca contiene el texto de la sentencia


SQL, el cdigo analizado y el plan de ejecucin.
La cach del diccionario de datos contiene las
definiciones y privilegios de tabla, columna y otros
objetos.
SHARED_POOL_SIZE especifica el tamao del pool
compartido.

Pool compartido
Cach de
biblioteca

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Cach de
diccionario
de datos

Componentes del Pool Compartido


Durante la etapa de anlisis, 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
componentes principales:
Cach de biblioteca
Cach de diccionario de datos
Cach de Biblioteca
La cach de biblioteca almacena informacin acerca de las ltimas sentencias SQL que se
hayan utilizado en una estructura de la memoria denominada rea SQL compartida. El rea
SQL compartida contiene:
El texto de la sentencia SQL
El rbol de anlisis: Versin compilada de la sentencia
El plan de ejecucin: Los pasos que se deben seguir al ejecutar la sentencia
El optimizador es la funcin de Oracle Server que determina el plan de ejecucin ptimo.
Si se vuelve a ejecutar una sentencia SQL y un rea SQL compartida ya dispone del plan de
ejecucin de la sentencia, el proceso del servidor no necesitar analizar la sentencia. La cach
de biblioteca mejora el rendimiento de las aplicaciones que reutilizan sentencias SQL
reduciendo el tiempo de anlisis 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

Introduccin a Oracle 10g: SQL Fundamentals II

Componentes del Pool Compartido (continuacin)


Cach del Diccionario de Datos
La cach del diccionario de datos, tambin conocida como la cach del diccionario o cach de
filas, es una recopilacin de las definiciones de uso ms reciente de la base de datos. Incluye
informacin sobre archivos de base de datos, tablas, ndices, columnas, usuarios, privilegios y
otros objetos de base de datos.
Durante la fase de anlisis, el proceso del servidor busca la informacin 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
informacin en los archivos de datos.
Especificacin del Tamao del Pool Compartido
El parmetro de inicializacin SHARED_POOL_SIZE especifica el tamao del pool
compartido.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-19

338

Introduccin a Oracle 10g: SQL Fundamentals II

Cach de Buffers de Base de Datos

Almacena los bloques de uso ms reciente


Tamao de un buffer basado en DB_BLOCK_SIZE
Nmero de buffers que define DB_BLOCK_BUFFERS

Cach de
buffers de
base de datos

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Funcin de la Cach de Buffers de Base de Datos


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
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
encontrar el bloque en la memoria, no necesitarn lecturas fsicas. Oracle Server utiliza, como
mnimo, 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.
Especificacin del Tamao de la Cach de Buffers de la Base de Datos
El tamao de cada buffer de la cach de buffers equivale al tamao de un bloque de Oracle y
lo especifica el parmetro DB_BLOCK_SIZE. El nmero de buffers equivale al valor del
parmetro DB_BLOCK_BUFFERS.

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

339

Introduccin a Oracle 10g: SQL Fundamentals II

PGA (rea Global de Programas)

No compartido
Slo puede escribirlo el proceso del servidor
Contiene:

rea de ordenacin
Informacin de sesin
Estado del cursor
Espacio de la pila

Proceso del
servidor

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
PGA

Componentes del rea Global de Programas


Una PGA (rea Global de Programas) es una regin de la memoria que contiene datos e
informacin de control para un proceso del servidor. Es una memoria no compartida creada
por Oracle cuando se inicia un proceso del servidor. El acceso a ella es exclusivo del proceso
del servidor, y slo puede leerla y escribir en ella el cdigo de Oracle Server que acte en su
nombre. La memoria PGA asignada por cada proceso del servidor adjunta a una instancia
Oracle se conoce como la memoria PGA agregada asignada por la instancia.
En una configuracin de servidor dedicado, la PGA del servidor incluye los siguientes
componentes:
rea de ordenacin: Se utiliza para cualquier ordenacin necesaria para procesar la
sentencia SQL
Informacin de sesin: Incluye los privilegios de usuario y las estadsticas de
rendimiento de la sesin
Estado del cursor: Indica la etapa en el procesamiento de las sentencias SQL que la
sesin utiliza en ese momento
Espacio de la pila: Contiene otras variables de la sesin
La PGA se asigna cuando se crea un proceso y se libera cuando ste se termina.

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

340

Introduccin a Oracle 10g: SQL Fundamentals II

Procesamiento de una Sentencia DML


Proceso
del usuario

SGA
Cach de
buffers de
base de
datos

UPDATE
employees ...

4
Proceso
del servidor

Pool compartido

Archivos
de datos

Buffer de
redo log

3
Archivos
de control

Archivos
redo log

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de datos

Pasos para el Procesamiento DML


Una sentencia DML (Lenguaje de Manipulacin de Datos) slo requiere dos fases de
procesamiento:
La etapa de anlisis es la misma que la que se utiliza para procesar una consulta.
La ejecucin requiere un procesamiento adicional para efectuar cambios de datos.
Fase de Ejecucin DML
Para ejecutar una sentencia DML:
Si los bloques de datos y de rollback no estn todava en la cach de buffers, el proceso
del servidor los lee en los archivos de datos para la cach de buffers.
El proceso del servidor coloca bloqueos en las filas que se van a modificar.
En el buffer de redo log, el proceso del servidor registra los cambios que se deben
efectuar en el rollback y en los datos.
Los cambios del bloque de rollback registran los valores de los datos antes de que se
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.
Los cambios de los bloques de datos registran los nuevos valores de los datos.

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

341

Introduccin a Oracle 10g: SQL Fundamentals II

Pasos para el Procesamiento DML (continuacin)


Fase de Ejecucin DML (continuacin)
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 informacin de ubicacin de filas.
Como los cambios realizados en los bloques slo se registran en las estructuras de la memoria
y no se escriben en el disco inmediatamente, un error en el equipo que ocasione la prdida de
la SGA puede hacer que se pierdan tambin estos cambios.

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-23

342

Introduccin a Oracle 10g: SQL Fundamentals II

Buffer de Redo Log

LOG_BUFFER define su tamao


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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Caractersticas del Buffer de Redo Log


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
tiene las siguientes caractersticas:
El parmetro LOG_BUFFER define su tamao en bytes.
Registra el bloque que se modifica, la ubicacin del cambio y el nuevo valor en una
entrada de redo. Una entrada de redo no distingue el tipo de bloque que se cambia, slo
registra los bytes que se cambian en el bloque.
El buffer de redo log se utiliza de forma secuencial, y los cambios que lleve a cabo una
transaccin se pueden intercalar con los efectuados por otras transacciones.
Se trata de un buffer circular que se reutiliza despus de llenarlo, aunque nicamente
cuando las entradas de redo antiguas se hayan registrado en los archivos redo log.

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

343

Introduccin a Oracle 10g: SQL Fundamentals II

Segmento de Rollback

Imagen antigua

Segmento de
rollback

Imagen
nueva
Tabla

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Sentencia DML

Segmento de Rollback
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:
Deshacer los cambios si se hace rollback de la transaccin
Proporcionar consistencia de lectura al asegurarse de que otras transacciones no vean los
cambios no validados realizados por la sentencia DML
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
datos, mientras que los bloques de rollback se introducen en el buffer de base de datos a
medida que se necesiten. El DBA crea los segmentos de rollback.
Los cambios realizados en los segmentos de rollback se registran en el buffer de redo log.

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

344

Introduccin a Oracle 10g: SQL Fundamentals II

Procesamiento COMMIT
1

Instancia
SGA

Proceso
del servidor

4
3

Cach de
buffers de
base de
datos

Pool compartido
Buffer de
redo log

LGWR

Proceso
del usuario

Archivos
de datos

Archivos
de control

Archivos
redo log

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de datos

Validacin (COMMIT) Rpida

Oracle Server utiliza un mecanismo de validacin rpido que garantiza que los cambios
validados se puedan recuperar en caso de fallo de la instancia.
Nmero de Cambio del Sistema
Siempre que se valida una transaccin, Oracle Server asigna un SCN (nmero de cambio del
sistema) de validacin a la transaccin. 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
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
depender de la fecha ni de la hora del sistema operativo.
Pasos para el Procesamiento de COMMIT
A continuacin, se muestran los pasos que se deben seguir cuando se emite COMMIT:
El proceso del servidor coloca un registro de validacin, junto con el SCN, en el buffer
de redo log.
LGWR realiza una escritura contigua de todas las entradas de buffers de redo log hasta
el registro de validacin (incluido) en los archivos redo log. Despus, Oracle Server
puede garantizar que los cambios no se perdern si falla una instancia.

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

345

Introduccin a Oracle 10g: SQL Fundamentals II

Validacin (COMMIT) Rpida (continuacin)


Pasos para el Procesamiento de COMMIT (continuacin)
Se informa al usuario de que COMMIT ha finalizado.
El proceso del servidor registra la informacin para indicar que la transaccin 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 despus de la validacin.
Ventajas de la Validacin (COMMIT) Rpida

El mecanismo de validacin rpida asegura la recuperacin 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 ms rpidas que las escrituras de
bloques en los archivos de datos.
En los archivos log slo se escribe la informacin mnima necesaria para registrar los
cambios, mientras que la escritura en los archivos de datos requerira la escritura de
bloques completos de datos.
Si hay mltiples transacciones que solicitan su validacin 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, slo ser necesaria
una escritura sncrona por cada transaccin. Si se lleva a cabo el transporte, puede haber
menos de una escritura sncrona por transaccin.
Como el buffer de redo log se puede vaciar antes de COMMIT, el tamao de la
transaccin no afecta a la cantidad de tiempo necesaria para una operacin
COMMIT real.
Nota: Al hacer rollback de una transaccin, no se dispara la escritura en disco de LGWR.
Oracle Server siempre hace rollback de los cambios no validados cuando se recupera de
fallos. En caso de que se produzca un fallo despus 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 transaccin.

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-27

346

Introduccin a Oracle 10g: SQL Fundamentals II

Resumen

En este apndice, ha aprendido a:


Identificar los archivos de la base de datos:
Archivos de datos, archivos de control y archivos
redo log en lnea
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:
Anlisis, ejecucin, recuperacin

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

Resumen
Archivos de la Base de Datos Oracle
La base de datos Oracle incluye los siguientes archivos:
Archivos de control: Poseen la informacin necesaria para verificar la integridad de la
base de datos, incluidos los nombres de los dems archivos de la base de datos (Los
archivos de control suelen estar duplicados).
Archivos de datos: Poseen los datos de la base de datos, incluidos tablas, ndices,
segmentos de rollback y segmentos temporales
Redo logs en lnea: Contienen los cambios realizados en los archivos de datos (Los
redo logs en lnea se utilizan en la recuperacin y suelen estar duplicados).
Otros archivos que se suelen utilizar con la base de datos son:
Archivo de parmetros: Define las caractersticas de una instancia Oracle
Archivo de contraseas: Autentica los usuarios con privilegios de la base de datos
Redo logs archivados: Son copias de seguridad de los redo logs en lnea

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

347

Introduccin a Oracle 10g: SQL Fundamentals II

Resumen (continuacin)
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 ms recientemente y los datos de uso ms reciente del diccionario de datos
Cach de buffers de base de datos: Almacena los datos de uso ms 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 produccin 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 lnea
SMON (Monitor del sistema): Comprueba la consistencia e inicia la recuperacin 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 informacin de estado de base de
datos despus de un punto de control
ARC0 (Proceso de archivado): Hace una copia de seguridad del redo log en lnea para
asegurar la recuperacin despus de un fallo del medio fsico (Este proceso es opcional,
aunque se incluye normalmente en una instancia de produccin).
Dependiendo de la configuracin, la instancia puede incluir tambin otros procesos.
Pasos para el Procesamiento de Sentencias SQL
Los pasos que se utilizan para procesar una sentencia SQL son:
Anlisis: Compila la sentencia SQL
Ejecucin: Identifica las filas seleccionadas o aplica cambios DML a los datos
Recuperacin: Devuelve las filas consultadas por una sentencia SELECT

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-29

348

Introduccin a Oracle 10g: SQL Fundamentals II

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II D-30

349

Introduccin a Oracle 10g: SQL Fundamentals II

_________

ndice
_________

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
350

Introduccin a Oracle 10g: SQL Fundamentals II

A
ACCESS PARAMETERS 02-33, 02-35
Activacin de Restricciones 02-15, 02-16
Actualizacin Correlacionada 06-17, 06-18
Adicin 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
Clasificacin de Filas 07-10
Clusula WITH 06-22, 06-23, 06-24
Columna Compuesta 04-17, 04-19, 04-23
Comparaciones entre No Pares 06-04
Comparaciones entre Pares 06-04, 06-25
CONNECT BY 06-07, 07-0507-14
CONNECT BY PRIOR 07-05 07-14
Consulta de Versiones 03-32
Consulta de Versiones de Flashback 02-32
Consulta Externa 03-07, 06-08, 06-10, 06-12, 06-13, 06-14
Consulta Interna 06-08, 06-10, 06-10, 06-12, 06-14, 06-15
Consultas Jerrquicas 03-05
Correlacin 06-13
Crear Base de Datos 05-09, C-03
Crear ndice 02-20, 02-21, 02-23, 02-38, 02-39
CUBE 04-06,, 04-24
CURRENT_DATE 05-05, 05-06, 05-06, 05-15, 05-34, 05-35
CURRENT_TIMESTAMP 05-05, 05-07, 05-08, 05-17, 05-34, 05-35

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

D
DBTIMEZONE 05-04, 05-09, 05-26, 05-34
DEFAULT DIRECTORY 02-33, 02-35
Depurar 02-26, 02-28
Desactivacin de Restricciones 02-15
Desplazamiento por el rbol 07-07...07-09
DROP TABLE 02-26, 02-28, C-02, C-06

E
Eliminacin del rbol 07-13, 07-14
EXIST 06-14,, 06-16, 06-20, 06-21, 06-24, 06-26, 06-27
EXTRACT 05-25

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

351

Introduccin a Oracle 10g: SQL Fundamentals II

F
Fecha/Hora 05-0505-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
Funcin de Fecha/Hora 05-34, 05-35
Funciones de Conversin 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,

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

I
ndices Basados en Funciones 02-23, 02-24
Informe en Estructura de rbol 07-02
Informes de Datos Derivados de Varias Tablas 04-09
INSERT 01-12, 01-15, 01-18, 02-06, 02-31, 03-03,, 03-06, 03-11,, 03-30
INSERT ALL Incondicional 02-19
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
L
LEVEL 07-05, 07-10, 07-11, 07-14,
LOCALTIMESTAMP 05-05, 05-08, 05-08, 05-34, 05-35
LPAD 07-11
M
MERGE 03-27...03-30
Metacaracteres 08-04...08-06
Modificacin de una Columna 02-06
N
NLS_Date_Language 05-29
Nodo Raz 07-10
Nodo Secundario 07-10
NOT EXIST 01-16, 06-14, 06-16
NOT IN 03-11, 06-05, 06-06, 06-16

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

352

Introduccin 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
Relacin Principal-Secundario 07-04
Restriccin 01-17, 02-07, 02-1002-20, 06-07, 08-1, C-03
Restricciones de Control 08-13
Restricciones Diferidas 02-13
Restricciones en Cascada 02-18, 02-19
ROLLUP 04-06 ... 04-23

g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu

S
Seguimiento de Cambios 02-31
SESSIONTIMEZONE 05-06 ,, 05-09, 05-26
SET TIME_ZONE 05-04, 05-06 ,, 05-09, 05-17
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
Subconsulta Correlacionada 06-10 06-13
Subconsulta Correlacionada para Actualizar Fila 06-17, 06-18
Subconsulta Correlacionada para Suprimir 06-20, 06-21
Subconsulta Escalar 06-07...06-09
Subconsultas de Varias Columnas 06-03, 06-07
Sustitucin de Patrones 08-12
T
Tabla Externa 02-29, 02-31, 02-35, 02-37
TIMESTAMP 05-10...05-17
TIMESTAMP WITH LOCAL TIMEZONE 05-16, 05-17
TIMESTAMP WITH TIME ZONE 05-15
TO_DSINTERVAL 05-30
TO_YMINTERVAL 05-31
TZ_OFFSET 05-26, 05-34
U
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

Introduccin 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
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II ndice-5

354

Introduccin a Oracle 10g: SQL Fundamentals II

B
g
10
e I
cl I
ra ls
O ta o
n
n
os e m
at m u
D da Al
n
l
de Fu de
e
a
as L
SQ Gu
Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II ndice-6

355

S-ar putea să vă placă și