base de datos oracle 10g conceptos fundamentales de sql ii

354
8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 1/354 Base de Datos Oracle 10 : Conceptos Fundamentales de SQL II Guía del Alumno • Volumen 1 Introducción a Oracle 10g: SQL Fundamentals II 1

Upload: diego-torres-valencia

Post on 08-Apr-2018

584 views

Category:

Documents


29 download

TRANSCRIPT

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 1/354

Base de Datos Oracle 10g :Conceptos Fundamentales

de SQL II

Guía del Alumno • Volumen 1

Introducción a Oracle 10g: SQL Fundamentals II

1

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 2/354

Prefacio

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

1 Control de Acceso de UsuariosObjetivos 1-2

Control de Acceso de Usuarios 1-3Privilegios 1-4Privilegios del Sistema 1-5Creación de Usuarios 1-6Privilegios del Sistema de Usuario 1-7Otorgamiento de Privilegios del Sistema 1-8¿Qué es un Rol? 1-9Creación y Otorgamiento de Privilegios a un Rol 1-10Cambio de Contraseñas 1-11Privilegios de Objeto 1-12

Otorgamiento de Privilegios de Objeto 1-14Transferencia de Privilegios 1-15Confirmación de Privilegios Otorgados 1-16Revocación de Privilegios de Objeto 1-17Resumen 1-19Práctica 1: Visión General 1-20

2 Gestión de Objetos de EsquemaObjetivos 2-2Sentencia ALTER TABLE 2-3Adición de una Columna 2-5Modificación de una Columna 2-6Borrado de una Columna 2-7Opción SET UNUSED 2-8Adición de una Sintaxis de Restricción 2-10Adición de una Restricción 2-11ON DELETE CASCADE 2-12Diferir Restricciones 2-13Borrado de una Restricción 2-14Desactivación de Restricciones 2-15

Contenido

iii

Introducción a Oracle 10g: SQL Fundamentals II

2

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 3/354

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

Resumen 2-37Práctica 2: Visión General 2-38

3 Manipulación de Grandes Juegos de DatosObjetivos 3-2Uso de Subconsultas para Manipular Datos 3-3Copia de Filas de Otra Tabla 3-4Inserción mediante una Subconsulta como Destino 3-5Recuperación de Datos con una Subconsulta como Origen 3-7Actualización de Dos Columnas con una Subconsulta 3-8Actualización de Filas Basándose en Otra Tabla 3-9Supresión de Filas Basándose en Otra Tabla 3-10Uso de las Palabras Clave WITH CHECK OPTION en Sentencias DML 3-11Visión General de la Función de Valor por Defecto Explícito 3-12Uso de Valores Por Defecto Explícitos 3-13Visión General de Sentencias INSERT de Varias Tablas 3-14Tipos de Sentencias INSERT de Varias Tablas 3-16Sentencias INSERT de Varias Tablas 3-17INSERT ALL Incondicional 3-19INSERT ALL Condicional 3-20INSERT FIRST Condicional 3-22INSERT de Pivoting 3-24Sentencia MERGE 3-27Sintaxis de la Sentencia MERGE 3-28Fusión de Filas 3-29Seguimiento de Cambios en los Datos 3-31Ejemplo de Consulta de Versiones de Flashback 3-32Cláusula VERSIONS BETWEEN 3-34Resumen 3-35Práctica 3: Visión General 3-36

iv

Introducción a Oracle 10g: SQL Fundamentals II

3

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 4/354

4 Generación de Informes mediante la Agrupación de Datos RelacionadosObjetivos 4-2Revisión de Funciones de Grupo 4-3

Revisión de la Cláusula GROUP BY 4-4Revisión de la Cláusula HAVING 4-5GROUP BY con los Operadores ROLLUP y CUBE 4-6Operador ROLLUP 4-7Operador ROLLUP: Ejemplo 4-8Operador CUBE 4-9Operador CUBE: Ejemplo 4-10Función GROUPING 4-11Función GROUPING: Ejemplo 4-12GROUPING SETS 4-13

GROUPING SETS: Ejemplo 4-15Columnas Compuestas 4-17Columnas Compuestas: Ejemplo 4-19Agrupamientos Concatenados 4-21Agrupamientos Concatenados: Ejemplo 4-22Resumen 4-23Práctica 4: Visión General 4-24

5 Gestión de Datos en Zonas Horarias DiferentesObjetivos 5-2Zonas Horarias 5-3Parámetro de Sesión TIME_ZONE 5-4CURRENT_DATE, CURRENT_TIMESTAMP y LOCALTIMESTAMP 5-5CURRENT_DATE 5-6CURRENT_TIMESTAMP 5-7LOCALTIMESTAMP 5-8DBTIMEZONE y SESSIONTIMEZONE 5-9Tipo de Datos TIMESTAMP 5-10Tipos de Datos TIMESTAMP 5-11Campos TIMESTAMP 5-12Diferencia entre DATE y TIMESTAMP 5-13

Tipo de Datos TIMESTAMP WITH TIME ZONE 5-14TIMESTAMP WITH TIMEZONE: Ejemplo 5-15TIMESTAMP WITH LOCAL TIMEZONE 5-16TIMESTAMP WITH LOCAL TIMEZONE: Ejemplo 5-17Tipos de Datos INTERVAL 5-18Campos INTERVAL 5-20Tipo de Datos INTERVAL YEAR TO MONTH 5-21INTERVAL YEAR TO MONTH: Ejemplo 5-22Tipo de Datos INTERVAL DAY TO SECOND 5-23

v

Introducción a Oracle 10g: SQL Fundamentals II

4

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 5/354

Tipo de Datos INTERVAL DAY TO SECOND: Ejemplo 5-24EXTRACT 5-25TZ_OFFSET 5-26

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

6 Recuperación de Datos mediante SubconsultasObjetivos 6-2

Subconsultas de Varias Columnas 6-3Comparaciones de Columnas 6-4Subconsulta de Comparación entre Pares 6-5Subconsulta de Comparación entre No Pares 6-6Expresiones de Subconsultas Escalares 6-7Subconsultas Escalares: Ejemplos 6-8Subconsultas Correlacionadas 6-10Uso de Subconsultas Correlacionadas 6-12Uso del Operador EXISTS 6-14Búsqueda de Empleados que Tengan al Menos una Persona a sus Órdenes 6-15Búsqueda de Todos los Departamentos que No Tengan Empleados 6-16Consulta Correlacionada: UPDATE 6-17Uso de Consultas Correlacionadas: UPDATE 6-18Consulta Correlacionada: DELETE 6-20Uso de Consultas Correlacionadas: DELETE 6-21Cláusula WITH 6-22Cláusula WITH: Ejemplo 6-23Resumen 6-25Práctica 6: Visión General 6-27

7 Recuperación Jerárquica

Objetivos 7-2Ejemplo de Datos de la Tabla EMPLOYEES 7-3Estructura de Árbol Natural 7-4Consultas Jerárquicas 7-5Desplazamiento por el Árbol 7-6Desplazamiento por el Árbol: De Abajo Arriba 7-8Desplazamiento por el Árbol: De Arriba Abajo 7-9Clasificación de Filas con la Pseudocolumna LEVEL 7-10Formato de Informes Jerárquicos mediante LEVEL y LPAD 7-11Eliminación de Ramas 7-13

vi

Introducción a Oracle 10g: SQL Fundamentals II

5

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 6/354

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

8 Soporte de Expresiones NormalesObjetivos 8-2Visión General de Expresiones Normales 8-3Metacaracteres 8-4Uso de Metacaracteres 8-5Funciones de Expresiones Normales 8-7Sintaxis de la Función REGEXP 8-8Realización de Búsquedas Básicas 8-9Comprobación de la Presencia de un Patrón 8-10Ejemplo de Extracción de Subcadenas 8-11

Sustitución de Patrones 8-12Expresiones Normales y Restricciones de Control 8-13Resumen 8-14Práctica 8: Visión General 8-15

Apéndice A: Soluciones a la Práctica

Apéndice B: Descripciones de Tabla

Apéndice C: Escritura de Archivos de Comandos AvanzadosObjetivos C-2Uso de SQL para Generar SQL C-3

Creación de un Archivo de Comandos Básico C-4Control del Entorno C-5La Imagen Completa C-6Volcado del Contenido de una Tabla en un Archivo C-7Generación de un Predicado Dinámico C-9Resumen C-11

Apéndice D: Componentes de la Arquitectura OracleObjetivos D-2Arquitectura de la Base de Datos Oracle: Visión General D-3

Arquitectura Física de la Base de Datos D-4Archivos de Control D-5Archivos Redo Log D-6Tablespaces y Archivos de Datos D-7Segmentos, Extensiones y Bloques D-8Gestión de Instancias Oracle D-9Estructuras de Memoria Oracle D-10Procesos Oracle D-12Otras Estructuras Físicas Clave D-13Procesamiento de una Sentencia SQL D-14

vii

Introducción a Oracle 10g: SQL Fundamentals II

6

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 7/354

Conexión a una Instancia D-15Procesamiento de una Consulta D-17Pool Compartido D-18

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

Índice

Prácticas Adicionales

Soluciones a las Prácticas Adicionales

viii

Introducción a Oracle 10g: SQL Fundamentals II

7

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 8/354

Prefacio

Introducción a Oracle 10g: SQL Fundamentals II

8

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 9/354

Prefacio - 2

Introducción a Oracle 10g: SQL Fundamentals II

9

Page 10: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 10/354

Prefacio - 3

Perfil

Antes de Empezar Este Curso

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

Requisitos

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

Organización de Este Curso

Base de Datos Oracle 10g: Conceptos Fundamentales de SQL II es un curso dirigido por un instructor 

que ofrece clases teóricas y ejercicios prácticos. Las demostraciones en línea y las sesiones de prácticas

escritas refuerzan los conceptos y los conocimientos introducidos.

Introducción a Oracle 10g: SQL Fundamentals II

10

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 11/354

Prefacio - 4

Publicaciones Relacionadas

Publicaciones Adicionales

• Boletines de versión de sistema

• Guías de usuario y de instalación

• Archivos read-me

• Artículos de IOUG (International Oracle User’s Group)

• Oracle Magazine

Introducción a Oracle 10g: SQL Fundamentals II

11

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 12/354

Prefacio - 5

Convenciones Tipográficas

Convenciones Tipográficas del Texto

Convención Elemento Ejemplo

Negrita Frases y palabras enfatizadas

sólo en el contenido Web

Para navegar dentro de esta aplicación, no

haga clic en los botones Back y Forward.

Cursiva

negrita 

Términos de glosario (si hay

algún glosario) 

El algoritmo inserta la clave nueva. 

Corchetes Nombres de tecla Pulse [Enter].

Mayúsculas

y minúsculas 

Botones,

casillas de control,

disparadores,ventanas 

Haga clic en el botón Executable.

Active la casilla de control Registration

Required.

Asigne un disparador When-Validate-Item.

Abra la ventana Master Schedule. 

Corchetes

angulares

Rutas de acceso de menú Seleccione File > Save.

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

teclas:

[Alt], [F], [D]

Introducción a Oracle 10g: SQL Fundamentals II

12

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 13/354

Prefacio - 6

Convenciones Tipográficas (continuación)

Convenciones Tipográficas del Texto (continuación)

Convención Objeto o Término Ejemplo

Courier New,

sensible a

mayúsculas/m

inúsculas

Salida de código,

elementos de código

SQL y PL/SQL,

elementos de código

Java, nombres de

directorio, nombres

de archivo,

contraseñas,

nombres de ruta de

acceso, direccionesURL,

datos introducidos

por el usuario,

nombres de usuario

Salida de código: debug.seti (‘I’,300);

Elementos de código SQL: Utilice el comando SELECT 

para visualizar la información almacenada en la columna

last_name de la tabla emp.

Elementos de código Java: La programación Java afecta a

las clases String y StringBuffer.

Nombres de directorio: bin (DOS), $FMHOME (UNIX)

Nombres de archivo: Busque el archivo init.ora.Contraseñas: Utilice la contraseña tiger.

Nombres de ruta de acceso: Abra

c:\my_docs\projects.

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

Datos introducidos por el usuario: Introduzca 300.

Nombres de usuario: Conéctese como scott.

Mayúsculas

iniciales

Etiquetas de gráficos

(siempre que el

término no sea un

nombre propio)

Dirección de cliente (excepto Oracle Payables)

Cursiva Frases y palabras

enfatizadas en

publicaciones

impresas, títulos de

libros y cursos,

variables

No guarde los cambios en la base de datos.

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

SQL Language Reference Manual. 

Introduzca [email protected] , donde user_id  

es el nombre de usuario.

Signos más Combinaciones deteclas

Mantenga pulsadas las teclas siguientes:[Control] + [Alt] + [Supr]

Comillas Títulos de capítulo y

de lección en

referencias cruzadas,

elementos de

interfaz con

nombres largos que

sólo tienen las

iniciales enmayúsculas

Este tema se trata en la Unidad II, Lección 3, “Trabajo con

Objetos”.

Seleccione el componente “Include a reusable module

component” y haga clic en Finish.

Utilice la propiedad “WHERE clause of query”.

Introducción a Oracle 10g: SQL Fundamentals II

13

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 14/354

Prefacio - 7

Convenciones Tipográficas (continuación)

Convenciones Tipográficas de las Rutas de Acceso de Navegación

Este curso utiliza rutas de acceso de navegación simplificadas, como la del siguiente ejemplo, para guiarlo

a través de las aplicaciones Oracle.

Ejemplo:

Invoice Batch Summary

(N) Invoice > Entry > Invoice Batches Summary (M) Query > Find (B) Approve

Esta ruta de acceso simplificada significa lo siguiente:

1. (N) En la ventana del navegador, seleccione Invoice > Entry > Invoice Batches Summary.

2. (M) En el menú, seleccione Query > Find.

3. (B) Haga clic en el botón Approve.

Notación:

(N) = Navegador (I) = Icono(M) = Menú (H) = Enlace de hipertexto

(S) = Separador (B) = Botón

Introducción a Oracle 10g: SQL Fundamentals II

14

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 15/354

Prefacio - 8

Introducción a Oracle 10g: SQL Fundamentals II

15

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 16/354

Introducción

Introducción a Oracle 10g: SQL Fundamentals II

16

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 17/354

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

Objetivos

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

• Mostrar los objetivos del curso

• Describir las tablas de ejemplo utilizadas en el curso

Introducción a Oracle 10g: SQL Fundamentals II

17

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 18/354

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

Objetivos del Curso

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

• Utilizar técnicas SQL avanzadas de recuperación

de datos para recuperar datos de tablas de base

de datos

• Aplicar técnicas avanzadas en una práctica que

simule la vida real

Introducción a Oracle 10g: SQL Fundamentals II

18

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 19/354

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

Visión General del Curso

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

recuperación de datos como:

• Funciones de fecha/hora

• GROUPING SETS y operadores ROLLUP y CUBE

• Consultas jerárquicas

• Subconsultas correlacionadas

• Inserciones de varias tablas

• Operación de fusión (merge)

• Tablas externas

• Uso de expresiones normales

Introducción a Oracle 10g: SQL Fundamentals II

19

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 20/354

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

Aplicación del Curso

EMPLOYEES DEPARTMENTS

COUNTRIESREGIONS

LOCATIONS

Tablas Utilizadas en el Curso

En el curso, se utilizan las siguientes tablas:

EMPLOYEES: La tabla EMPLOYEES contiene información sobre todos los empleados como

nombre y apellido, identificador de puesto, salario, fecha de contratación, identificador de

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

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

departamento, nombre de departamento, identificador de supervisor e identificador de ubicación.

Esta tabla es la tabla de clave primaria de la tabla EMPLOYEES.LOCATIONS: Esta tabla contiene información de la ubicación de departamentos. Contiene

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

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

tabla COUNTRIES.

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

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

tabla LOCATIONS.

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

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

Introducción a Oracle 10g: SQL Fundamentals II

20

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 21/354

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

Resumen

En esta lección, ha aprendido lo siguiente:

• Objetivos del curso

• Tablas de ejemplo utilizadas en el curso

Introducción a Oracle 10g: SQL Fundamentals II

21

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 22/354

Control de Acceso de Usuarios

Introducción a Oracle 10g: SQL Fundamentals II

22

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 23/354

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

Objetivos

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

• Diferenciar los privilegios del sistema de los de

objeto

• Otorgar privilegios en tablas

• Ver privilegios en el diccionario de datos

• Otorgar roles

• Distinguir entre privilegios y roles

Objetivos

En esta lección, aprenderá a controlar el acceso a base de datos para objetos específicos y a

agregar nuevos usuarios con diferentes niveles de privilegios de acceso.

Introducción a Oracle 10g: SQL Fundamentals II

23

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 24/354

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

Control de Acceso de Usuarios

Administrador 

de la base

de datos

Usuarios

Nombre de usuario y contraseña

Privilegios

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 específicos de la base de datos

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

• Crear sinónimos para objetos de base de datos

La seguridad de base de datos se puede clasificar en dos categorías: seguridad del sistema yseguridad 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 contraseña, 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.

Introducción a Oracle 10g: SQL Fundamentals II

24

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 25/354

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 26/354

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

Privilegios del Sistema

• Hay más de 100 privilegios disponibles.

• El administrador de la base de datos tiene

privilegios del sistema de alto nivel para tareas

como, por ejemplo:

– Creación de usuarios nuevos

– Eliminación de usuarios

– Eliminación de tablas– Realización de copias de seguridad de tablas

Privilegios del Sistema

Los usuarios y los roles tienen a su disposición más de 100 privilegios del sistema distintos.

Los privilegios del sistema suelen ser proporcionados por el administrador de la base de datos.

Privilegios de DBA Típicos

Privilegio del Sistema Operaciones Autorizadas

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

usuarios de OracleDROP USER La persona a la que se otorga el privilegio puede borrar otro

usuario.

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

de cualquier esquema.

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

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

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

vistas o instantáneas en cualquier esquema.

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

cualquier esquema.

Introducción a Oracle 10g: SQL Fundamentals II

26

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 27/354

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 28/354

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

Privilegios del Sistema de Usuario

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

privilegios del sistema específicos.

• Un desarrollador de aplicaciones, por ejemplo,

puede tener los siguientes privilegios del sistema:

– CREATE SESSION 

– CREATE TABLE

– CREATE SEQUENCE

– CREATE VIEW 

– CREATE PROCEDURE

GRANT privilege [, privilege...]TO user [, user| role, PUBLIC ...];

Privilegios de Usuario Típicos

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

En la sintaxis:

privilege es el privilegio del sistema que se va a otorgar 

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

de PUBLIC, designa que el privilegio se otorga a todos

los usuarios

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

SESSION_PRIVS.

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 función o un paquete en el esquema

del usuario

Introducción a Oracle 10g: SQL Fundamentals II

28

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 29/354

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

Otorgamiento de Privilegios del Sistema

El DBA puede otorgar privilegios del sistema específicos

a un usuario.

GRANT create session, create table,create sequence, create view 

TO scott;Grant succeeded.

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.

Introducción a Oracle 10g: SQL Fundamentals II

29

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 30/354

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

¿Qué es un Rol?

Asignación de privilegios

sin un rol

Asignación de privilegios

con un rol

Privilegios

Usuarios

Gestor 

¿Qué es un Rol?

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

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

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 aplicación de base de datos.

Creación y Asignación de un Rol

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

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.

Introducción a Oracle 10g: SQL Fundamentals II

30

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 31/354

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

Creación y Otorgamiento de Privilegios a un Rol

• Cree un rol

• Otorgue privilegios a un rol

• Otorgue un rol a usuarios

CREATE ROLE manager;Role created.

GRANT create table, create view TO manager;Grant succeeded.

GRANT manager TO DE HAAN, KOCHHAR;Grant succeeded.

Creación de un Rol

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

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

Kochhar ya pueden crear tablas y vistas.

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

Introducción a Oracle 10g: SQL Fundamentals II

31

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 32/354

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

Cambio de Contraseñas

• El DBA crea la cuenta de usuario e inicializa la

contraseña.

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

ALTER USER HRIDENTIFIED BY employ;

User altered.

Cambio de Contraseñas

El DBA crea una cuenta e inicializa una contraseña para cada usuario. La contraseña se puede

cambiar mediante la sentencia ALTER USER.

Sintaxis

ALTER USER user IDENTIFIED BY password;

En la sintaxis:

user  es el nombre del usuario

password  especifica la nueva contraseña

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

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

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

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

cambiar la contraseña de un usuario cuando éste está conectado. Este comando no está

disponible en iSQL*Plus.

Introducción a Oracle 10g: SQL Fundamentals II

32

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 33/354

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

Privilegios de Objeto

Privilegios

de Objeto Tabla Vista Secuencia Procedimiento

ALTER √ √

DELETE √ √

EXECUTE √

INDEX √

INSERT √ √

REFERENCES √

SELECT √ √ √

UPDATE √ √

Privilegios de Objeto

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

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

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 especificación de un subjuego de columnas que se puedan actualizar. Para

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

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

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

Introducción a Oracle 10g: SQL Fundamentals II

33

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 34/354

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

Privilegios de Objeto

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

• Un propietario tiene todos los privilegios en el objeto.

• Un propietario puede otorgar privilegios específicos

en el objeto del que es propietario.

GRANT object_priv [(columns )]ON  object

TO {user |role|PUBLIC}[WITH GRANT OPTION];

Otorgamiento de Privilegios de Objeto

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

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

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 quién 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

otorgarprivilegios de objeto a otros usuarios y roles

Introducción a Oracle 10g: SQL Fundamentals II

34

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 35/354

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

Otorgamiento de Privilegios de Objeto

• Otorgue privilegios de consulta en la tabla EMPLOYEES.

• Otorgue privilegios para actualizar columnas

específicas para usuarios y roles.

GRANT selectON employeesTO sue, rich;Grant succeeded.

GRANT update (department_name, location_id)ON departmentsTO scott, manager;Grant succeeded.

Instrucciones• Para otorgar privilegios en un objeto, éste debe estar en el esquema o le deben haber 

otorgado los privilegios de objeto con la cláusula WITH GRANT OPTION.

• 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 automáticamente 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 columnasespecíficas 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 sinónimo para la tabla y emitir una sentencia SELECTdesde el sinónimo:

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.

Introducción a Oracle 10g: SQL Fundamentals II

35

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 36/354

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

Transferencia de Privilegios

• Autorice a un usuario a transferir privilegios.

• Permita a todos los usuarios del sistema consultar datos de la tabla DEPARTMENTS de Alice.

GRANT select, insertON departmentsTO scottWITH GRANT OPTION;Grant succeeded.

GRANT selectON alice.departmentsTO PUBLIC;Grant succeeded.

Palabras Clave WITH GRANT OPTION 

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

la cláusula 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 también que Scott

puede otorgar a otros estos privilegios.

Palabra Clave PUBLICUn 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.

Introducción a Oracle 10g: SQL Fundamentals II

36

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 37/354

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 38/354

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

Revocación de Privilegios de Objeto

• Utilice la sentencia REVOKE para revocar privilegios

otorgados a otros usuarios.

• También se revocan los privilegios otorgados aotros mediante la cláusula WITH GRANT OPTION .

REVOKE {privilege [, privilege...]|ALL}ON object

FROM {user[, user...]|role|PUBLIC}[CASCADE CONSTRAINTS];

Revocación 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 revocarán 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 restricción de integridad referencial realizada

en el objeto CONSTRAINTS mediante el privilegio REFERENCESPara obtener más información, consulte Oracle Database 10g SQL Reference.

Nota: Si revoca los privilegios de un usuario que debe dejar la compañía, 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 acción no afectará a los privilegios del

sistema otorgados por este usuario a otros usuarios.

Introducción a Oracle 10g: SQL Fundamentals II

38

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 39/354

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

Revocación de Privilegios de Objeto

Como usuario Alice, revoque los privilegios SELECT e

INSERT otorgados al usuario Scott en la tabla

DEPARTMENTS.

REVOKE select, insertON departmentsFROM scott;

Revoke succeeded.

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

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 cláusula WITH GRANT OPTION, ese

usuario también puede otorgar el privilegio con la cláusula 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 revocarán en cascada todos los privilegios

otorgados.

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

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

privilegio SELECT con la cláusula 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 también se revocan.

Introducción a Oracle 10g: SQL Fundamentals II

39

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 40/354

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

Resumen

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

sentencias que controlan el acceso a la base de datos

y a objetos de base de datos.

Sentencia Acción

CREATE USER Crea un usuario (la suele realizar un DBA)

GRANT Otorga a otros usuarios privilegios paraacceder a objetos

CREATE ROLE Crea una recopilación de privilegios (la suele

realizar un DBA)

ALTER USER Cambia la contraseña de un usuario

REVOKE Elimina privilegios en un objeto de usuarios

Resumen

Los DBA establecen la seguridad de base de datos inicial para los usuarios asignándoles

privilegios.

• El DBA crea usuarios que deben tener una contraseña. El DBA es responsable además

de establecer los privilegios iniciales del sistema para un usuario.

• 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

recopilación de privilegios del sistema o de objeto a varios usuarios. Los roles facilitan

el mantenimiento del otorgamiento y de la revocación de privilegios.

• Los usuarios pueden cambiar la contraseña 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.

Introducción a Oracle 10g: SQL Fundamentals II

40

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 41/354

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

Práctica 1: Visión General

Esta práctica cubre los temas siguientes:

• Otorgamiento a otros usuarios de privilegios de

su tabla

• Modificación de la tabla de otro usuario a través

de los privilegios que se le han otorgado

• Creación de sinónimos

• Consulta de las vistas de diccionario de datos

relacionadas con privilegios

Práctica 1: Visión General

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

de base de datos.

Introducción a Oracle 10g: SQL Fundamentals II

41

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

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 42/354

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

Práctica 1

Para contestar a la pregunta 6 y a las posteriores, se deberá conectar a la base de datos

mediante iSQL*Plus. Para ello, inicie el explorador Internet Explorer desde el escritorio del

cliente. Introduzca la dirección URL en formato http://machinename:5561/isqlplus/  y utilice

la cuenta oraxx y la contraseña y el identificador de servicio correspondientes (en formato

Tx) que le proporcione el instructor para conectarse a la base de datos.

1. ¿Qué privilegio se debe otorgar a un usuario para conectarse a Oracle Server? ¿Se trata

de un privilegio de objeto o del sistema?

_____________________________________________________________________ 

2. ¿Qué privilegio se debe otorgar a un usuario para crear tablas?

_____________________________________________________________________ 

3. Si crea una tabla, ¿quién puede transferir privilegios a otros usuarios en su tabla?

_____________________________________________________________________ 

4. Usted es el DBA. Está creando muchos usuarios que requieren los mismos privilegios

del sistema.¿Qué debería utilizar para facilitar el trabajo?

_____________________________________________________________________ 

5. ¿Qué comando se utiliza para cambiar la contraseña?

_____________________________________________________________________ 

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.

Introducción a Oracle 10g: SQL Fundamentals II

42

Page 43: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 43/354

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

Práctica 1 (continuación)

8. Agregue una nueva fila a su tabla DEPARTMENTS. El equipo 1 debe agregar Education

como número de departamento 500. El equipo 2 debe agregar Human Resources como

número de departamento 510. Consulte la tabla del otro equipo.

9. Cree un sinónimo para la tabla DEPARTMENTS del otro equipo.

10. Consulte todas las filas de la tabla DEPARTMENTS del otro equipo mediante el sinónimo.

Team 1 SELECT statement results:

Team 2 SELECT statement results:

Introducción a Oracle 10g: SQL Fundamentals II

43

Page 44: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 44/354

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

Práctica 1 (continuación)

11. Consulte el diccionario de datos USER_TABLES para ver información sobre las tablas

que son de su propiedad.

12. Consulte la vista de diccionario de datos ALL_TABLES para ver información sobre todas

las tablas a las que puede acceder. Excluya las tablas de su propiedad.

Nota: La lista que obtenga puede que no coincida exactamente con la que se muestra a

continuación.

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.

Introducción a Oracle 10g: SQL Fundamentals II

44

Page 45: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 45/354

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

Introducción a Oracle 10g: SQL Fundamentals II

45

Page 46: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 46/354

Gestión de Objetos de Esquema

Introducción a Oracle 10g: SQL Fundamentals II

46

Page 47: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 47/354

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

Objetivos

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

• Agregar restricciones

• Crear índices

• Crear índices mediante la sentencia CREATETABLE

• Crear índices basados en funciones

• Borrar columnas y definir columnas como UNUSED

• Realizar operaciones FLASHBACK

• Crear y utilizar tablas externas

Objetivos

Esta lección contiene información sobre la creación de índices y restricciones, así como sobre

la modificación de objetos existentes. También recibirá información sobre tablas externas y la

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

clave primaria.

Introducción a Oracle 10g: SQL Fundamentals II

47

Page 48: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 48/354

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

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

Sentencia ALTER TABLE

Después de crear una tabla, puede que necesite cambiar la estructura de tabla porque ha

omitido una columna, se debe cambiar la definición de columna o debe eliminar columnas.

Puede hacerlo mediante la sentencia ALTER TABLE.

Introducción a Oracle 10g: SQL Fundamentals II

48

Page 49: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 49/354

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

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

ALTER TABLE table

DROP (column );

Sentencia ALTER TABLE (continuación)

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 modificación

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

Introducción a Oracle 10g: SQL Fundamentals II

49

Page 50: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 50/354

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

Adición de una Columna

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

• La nueva columna se convierte en la última.

ALTER TABLE dept80ADD (job_id VARCHAR2(9));Table altered.

Instrucciones para Agregar una Columna• Puede agregar o modificar columnas.

• No puede especificar dónde 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 columnaNOT NULL

obligatoria a una

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

una tabla vacía.

Introducción a Oracle 10g: SQL Fundamentals II

50

Page 51: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 51/354

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

Modificación de una Columna

• Puede cambiar el tipo de datos de una columna,su tamaño y el valor por defecto.

• Un cambio en el valor por defecto sólo afecta a lassiguientes inserciones en la tabla.

ALTER TABLE dept80MODIFY (last_name VARCHAR2(30));Table altered.

Modificación de una Columna

Puede modificar una definición de columna mediante la sentencia ALTER TABLE con la

cláusula MODIFY. La modificación de columnas puede incluir cambios en el tipo de datos de

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

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

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

• Puede reducir el ancho de una columna si:

- La columna contiene sólo valores nulos

- La tabla no tiene ninguna fila

- La reducción 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 sólo valores nulos. La excepción

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 sólo si la columna contiene valores nulos o

si no cambia el tamaño.

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

Introducción a Oracle 10g: SQL Fundamentals II

51

Page 52: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 52/354

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

Borrado de una Columna

Utilice la cláusula DROP COLUMN para borrar lascolumnas de la tabla que ya no necesite.

ALTER TABLE dept80DROP COLUMN job_id;Table altered.

Borrado de una Columna

Puede borrar una columna de una tabla mediante la sentencia ALTER TABLE con la cláusula

DROP COLUMN.

Instrucciones• La columna puede contener o no datos.

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

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

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

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

índice a menos que se agregue la opción 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

partición de una tabla particionada o las columnas que forman parte de la clave primaria de

una tabla organizada por índice.

Introducción a Oracle 10g: SQL Fundamentals II

52

Page 53: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 53/354

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

Opción SET UNUSED

• Utilice la opción SET UNUSED para marcar una o máscolumnas como no utilizadas.

• Utilice la opción DROP UNUSED COLUMNS para eliminar las columnas marcadas como no utilizadas.

ALTER TABLE <table_name>SET UNUSED(<column_name>);

ALTER TABLE <table_name>

SET UNUSED COLUMN <column_name>;

OR

ALTER TABLE <table_name>DROP UNUSED COLUMNS;

Opción SET UNUSED

La opción SET UNUSED marca una o más columnas como no utilizadas para que se puedan

borrar cuando la demanda de recursos del sistema sea menor. La especificación de esta

cláusula no elimina realmente las columnas de destino de cada fila de la tabla (es decir, no

restaura el espacio en disco que utilizan estas columnas). Por lo tanto, el tiempo de respuesta

es más rápido que si ejecuta la cláusula 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. Además los nombres y

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

DESCRIBE y puede agregar una nueva columna a la tabla con el mismo nombre que una

columna no utilizada. La información SET UNUSED se almacena en la vista de diccionario

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.

Introducción a Oracle 10g: SQL Fundamentals II

53

Page 54: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 54/354

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

Opción DROP UNUSED COLUMNS

DROP UNUSED COLUMNS elimina de la tabla todas las columnas marcadas actualmente

como no utilizadas. Puede utilizar esta sentencia si desea reclamar el espacio en disco

adicional de las columnas no utilizadas en la tabla. Si la tabla no contiene tablas no utilizadas,

la sentencia no devuelve ningún error.

ALTER TABLE dept80SET UNUSED (last_name);Table altered.

ALTER TABLE dept80DROP UNUSED COLUMNS;Table altered.

Introducción a Oracle 10g: SQL Fundamentals II

54

Page 55: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 55/354

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

Adición de una Sintaxis de Restricción

Utilice la sentencia ALTER TABLE para:

• Agregar o borrar una restricción, pero sin modificar su estructura

• Activar o desactivar restricciones

• Agregar una restricción NOT NULL mediante lacláusula MODIFY

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

Adición de una Restricción

Puede agregar una restricción para tablas existentes mediante la sentencia ALTER TABLEcon la cláusula ADD.

En la sintaxis:

table es el nombre de la tabla

constraint es el nombre de la restricción

type es el tipo de restricción

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

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

a las restricciones, el sistema los generará.

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

estructura.

• Puede agregar una restricción NOT NULL a una columna existente mediante la cláusula

MODIFY de la sentencia ALTER TABLE.

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

un valor para todas las filas.

Introducción a Oracle 10g: SQL Fundamentals II

55

Page 56: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 56/354

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

Adición de una Restricción

Agregue una restricción FOREIGN KEY a la tabla EMP2que indique que ya debe existir un supervisor comoempleado válido en la tabla EMP2.

ALTER TABLE emp2modify employee_id Primary Key;Table altered.

ALTER TABLE emp2ADD CONSTRAINT emp_mgr_fkFOREIGN KEY(manager_id)REFERENCES emp2(employee_id);

Table altered.

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

El primer ejemplo de la diapositiva modifica la tabla EMP2 para agregar una restricción

PRIMARY KEY en la columna EMPLOYEE_ID. Observe que, como no se proporciona un

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

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

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

Introducción a Oracle 10g: SQL Fundamentals II

56

Page 57: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 57/354

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

ON DELETE CASCADE

Suprima las filas secundarias al suprimir una claveprincipal.

ALTER TABLE Emp2 ADD CONSTRAINT emp_dt_fkFOREIGN KEY (Department_id)REFERENCES departments ON DELETE CASCADE);Table altered.

ON DELETE CASCADE

La acción ON DELETE CASCADE permite que se supriman los datos de clave principal a los

que se hace referencia desde la tabla secundaria, pero no que se actualicen. Cuando se

suprimen los datos de la clave principal, también se suprimen todas las filas de la tabla

secundaria que dependen de los valores de la clave principal suprimida. Para especificar esta

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

restricción FOREIGN KEY.

Introducción a Oracle 10g: SQL Fundamentals II

57

Page 58: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 58/354

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

ALTER SESSION SET CONSTRAINTS= IMMEDIATE

SET CONSTRAINTS dept2_id_pk IMMEDIATE

ALTER TABLE dept2ADD CONSTRAINT dept2_id_pkPRIMARY KEY (department_id)

DEFERRABLE INITIALLY DEFERRED

Diferir Restricciones

Las restricciones pueden tener estos atributos:

• DEFERRABLE o NOT DEFERRABLE

• INITIALLY DEFERRED o INITIALLY IMMEDIATE

Diferir restricciones en elmomento de la creación

Cambio de todas lasrestricciones para una sesión

Cambio de un atributoespecífico de restricción

Diferir Restricciones

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

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

de la validación. Si se viola una restricción diferida, la validación provoca que se haga rollback 

de la transacción. Si una restricción es inmediata (no diferida), se comprueba al final de cada

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

provoca una acción (por ejemplo, DELETE CASCADE), esa acción se toma siempre como

parte de la sentencia que la provocó, independientemente de que la restricción sea diferida o

inmediata. Utilice la restricción SET CONSTRAINTS para especificar, para una transacción en

particular, si se comprueban las restricciones diferibles después de cada sentencia DML o en el

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

índice no único para esa restricción.

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

inicialmente inmediatas. Estos atributos pueden ser diferentes para cada restricción.

Supuesto de uso: La política de la compañía dicta que el número de departamento 40 se

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

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

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

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

Introducción a Oracle 10g: SQL Fundamentals II

58

Page 59: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 59/354

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

Borrado de una Restricción

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

• Elimine la restricción PRIMARY KEY en la tabla DEPT2y borre la restricción FOREIGN KEY asociada en lacolumna EMP2.DEPARTMENT_ID.

ALTER TABLE emp2DROP CONSTRAINT emp_mgr_fk;Table altered.

ALTER TABLE dept2DROP PRIMARY KEY CASCADE;Table altered.

Borrado de una Restricción

Para borrar una restricción, puede identificar el nombre de restricción desde las vistas de

diccionario de datos USER_CONSTRAINTS y USER_CONS_COLUMNS. Utilice a

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

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

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 restricción

constraint es el nombre de la restricción

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

disponible en el diccionario de datos.

Introducción a Oracle 10g: SQL Fundamentals II

59

Page 60: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 60/354

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

Desactivación de Restricciones

• Ejecute la cláusula DISABLE de la sentencia ALTERTABLE para desactivar una restricción de integridad.

• Aplique la opción CASCADE para desactivar lasrestricciones de integridad dependientes.

ALTER TABLE emp2DISABLE CONSTRAINT emp_dt_fk;

Table altered.

Desactivación de una Restricción

Puede desactivar una restricción sin borrarla ni volverla a crear mediante la sentencia ALTERTABLE con la cláusula DISABLE.

Sintaxis

ALTER TABLE table

DISABLE CONSTRAINT constraint [CASCADE];

En la sintaxis:

table es el nombre de la tablaconstraint es el nombre de la restricción

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

ALTER TABLE.

• La cláusula CASCADE desactiva las restricciones de integridad dependientes.

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

Introducción a Oracle 10g: SQL Fundamentals II

60

Page 61: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 61/354

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

Activación de Restricciones

• Active una restricción de integridad actualmentedesactivada en la definición de tabla mediante lacláusula ENABLE.

• Se crea automáticamente un índice UNIQUE siactiva una restricción UNIQUE o PRIMARY KEY.

ALTER TABLE emp2ENABLE CONSTRAINT emp_dt_fk;Table altered.

Activación de una Restricción

Puede activar una restricción sin borrarla ni volverla a crear mediante la sentencia ALTERTABLE con la cláusula ENABLE.

SintaxisALTER TABLE tableENABLE CONSTRAINT constraint;

En la sintaxis:

table es el nombre de la tablaconstraint es el nombre de la restricción

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

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

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

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

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

Introducción a Oracle 10g: SQL Fundamentals II

61

Page 62: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 62/354

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

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

Instrucciones (continuación)• La activación de una restricción de clave primaria que se hubiese desactivado con la

opción CASCADE no activa las claves ajenas que sean dependientes de la clave

primaria.

• Para activar una restricción UNIQUE o PRIMARY KEY, debe disponer de losprivilegios necesarios para crear un índice en la tabla.

Introducción a Oracle 10g: SQL Fundamentals II

62

Page 63: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 63/354

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

Restricciones en Cascada

• La cláusula CASCADE CONSTRAINTS se utilizajunto con la cláusula DROP COLUMN .

• La cláusula CASCADE CONSTRAINTS borra todaslas restricciones de integridad referencial quehacen referencia a las claves única y primariadefinidas en las columnas borradas.

• La cláusula CASCADE CONSTRAINTS también borratodas las restricciones de varias columnasdefinidas en las columnas borradas.

Restricciones en Cascada

Esta sentencia ilustra el uso de la cláusula 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 restricción de varias columnas ck1hace referencia a col1.

Introducción a Oracle 10g: SQL Fundamentals II

63

Page 64: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 64/354

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

Restricciones en Cascada

Ejemplo:

ALTER TABLE emp2DROP COLUMN employee_id CASCADE CONSTRAINTS;Table altered.

ALTER TABLE test1

DROP (pk, fk, col1) CASCADE CONSTRAINTS;Table altered.

Restricciones en Cascada (continuación)

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

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

primaria para la tabla EMP2:ALTER TABLE emp2 DROP COLUMN employee_id CASCADE CONSTRAINTS;

Si se borran también 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 restricción referencial de otras tablas hace referencia a la columna PK, es

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

TEST1 creada en la página anterior:

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

Introducción a Oracle 10g: SQL Fundamentals II

64

Page 65: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 65/354

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

Visión General de Índices

Los índices se crean:

• Automáticamente– Creación de PRIMARY KEY

– Creación de UNIQUE KEY

• Manualmente– Sentencia CREATE INDEX

– Sentencia CREATE TABLE

Visión General de ÍndicesSe pueden crear dos tipos de índices. Un tipo es el índice único. Oracle Server crea

automáticamente un índice único si se define una columna o un grupo de columnas en una

tabla para tener una restricción PRIMARY KEY o UNIQUE. El nombre del índice es el

nombre que se asigna a la restricción.

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

recuperación.

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

CREATE INDEX.

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

Nota: Puede crear manualmente un índice único, pero se recomienda que cree una restricción

única, lo que crea implícitamente un índice único.

Introducción a Oracle 10g: SQL Fundamentals II

65

Page 66: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 66/354

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

.

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_NAMEFROM USER_INDEXESWHERE TABLE_NAME = 'NEW_EMP';

CREATE INDEX con Sentencia CREATE TABLE

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

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

nombres a los índices en el momento de la creación de la clave primaria para que sean

diferentes al nombre de la restricción PRIMARY KEY. El siguiente ejemplo muestra el

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

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_NAMEFROM USER_INDEXESWHERE TABLE_NAME = 'EMP_UNNAMED_INDEX';

Introducción a Oracle 10g: SQL Fundamentals II

66

Page 67: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 67/354

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

CREATE INDEX con Sentencia CREATE TABLE (continuación)

Observe que Oracle Server asigna un nombre genérico al índice que se crea para la columna

PRIMARY KEY.

También puede utilizar un índice existente para la columna PRIMARY KEY, por ejemplo

cuando espera una carga grande de datos y desea acelerar la operación. Le conviene

desactivar las restricciones durante la carga y activarlas después, en cuyo caso el hecho detener un índice único en la clave primaria seguirá haciendo que se verifiquen los datos durante

la carga. Así pues, puede crear primero un índice no único en la columna designada como

PRIMARY KEY, crear a continuación la columna PRIMARY KEY y especificar que debería

utilizar el índice existente. Los siguientes ejemplos ilustran el proceso:

Paso 1: Creación de la Tabla

CREATE TABLE NEW_EMP2

( employee_id NUMBER(6)

first_name VARCHAR2(20),last_name VARCHAR2(25)

);

Paso 2: Creación del ÍndiceCREATE INDEX emp_id_idx2 ON

new_emp2(employee_id);

Paso 3: Creación de la Clave PrimariaALTER TABLE new_emp2 ADD PRIMARY KEY (employee_id) USING INDEX

emp_id_idx2;

Introducción a Oracle 10g: SQL Fundamentals II

67

Page 68: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 68/354

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

Índices Basados en Funciones

• Un índice basado en funciones se basa enexpresiones.

• La expresión del índice se genera a partir decolumnas de tablas, constantes, funciones SQL yfunciones definidas por el usuario.

CREATE INDEX upper_dept_name_idx

ON dept2(UPPER(department_name));

Index created.

SELECT *FROM dept2WHERE 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 búsquedas no sensibles a mayúsculas/minúsculas. 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 función en particular se utiliza en una

consulta. Por ejemplo, la siguiente sentencia puede utilizar el índice, pero sin la cláusula

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

SELECT *FROM employeesWHERE UPPER (last_name) IS NOT NULLORDER BY UPPER (last_name);

Nota: Se debe definir el parámetro de inicialización QUERY_REWRITE_ENABLED en TRUEpara que se utilice un índice basado en funciones.

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

Introducción a Oracle 10g: SQL Fundamentals II

68

Page 69: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 69/354

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

Eliminación de un Índice

• Elimine un índice del diccionario de datosmediante el comando DROP INDEX.

• Elimine el índice UPPER_DEPT_NAME_IDX deldiccionario de datos.

• Para borrar un índice, debe ser el propietario delíndice o tener el privilegio DROP ANY INDEX.

DROP INDEX upper_dept_name_idx;Index dropped.

DROP INDEX index ;

Eliminación de un Índice

Los índices no se pueden modificar. Para cambiar un índice, debe borrarlo y volverlo a crear.

Para eliminar una definición de índice del diccionario de datos, emita la sentencia DROPINDEX. Para borrar un índice, debe ser el propietario del índice o tener el privilegio DROPANY INDEX.

En la sintaxis:

index  es el nombre del índice

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

Introducción a Oracle 10g: SQL Fundamentals II

69

Page 70: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 70/354

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

DROP TABLE …PURGE

DROP TABLE dept80 PURGE;

DROP TABLE …PURGE

La base de datos Oracle 10g presenta una nueva función para borrar tablas. Al borrar una

tabla, la base de datos no libera inmediatamente el espacio asociado a la tabla. En su lugar, la

base de datos cambia el nombre de la tabla y la coloca en una papelera de reciclaje, de donde

se podrá recuperar después con la sentencia FLASHBACK TABLE si se da cuenta de que

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 cláusula PURGE como se

muestra en la sentencia de la diapositiva.

Especifique PURGE sólo 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 utilización de esta cláusula es equivalente a borrar primero la tabla y purgarla después de

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

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 cláusula PURGE, ni

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

estaba disponible en versiones anteriores.

Introducción a Oracle 10g: SQL Fundamentals II

70

Page 71: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 71/354

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

Sentencia FLASHBACK TABLE

• Herramienta de reparación para modificacionesaccidentales de tabla– Restaura una tabla a un punto anterior en el tiempo

– Ventajas: Facilidad de uso, disponibilidad yejecución rápida

– Se realiza in situ

• Sintaxis:

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

Sentencia FLASHBACK TABLEUtilidad de Reparación de AutoservicioLa base de datos Oracle 10g proporciona un nuevo comando DDL de SQL, FLASHBACKTABLE, para restaurar el estado de una tabla a un punto anterior en el tiempo en el caso deque la haya suprimido o modificado de forma accidental. El comando FLASHBACK TABLEes una herramienta de reparación de autoservicio para restaurar datos de una tabla junto conlos atributos asociados como, por ejemplo, índices o vistas. Esto se consigue cuando la base

de datos está online haciendo rollback sólo de los cambios posteriores en la tabla en cuestión.

Si se compara con mecanismos de recuperación tradicionales, esta función ofrece ventajassignificativas, como la facilidad de uso, la disponibilidad y una recuperación más rápida.También libera al DBA del trabajo de encontrar y restaurar propiedades específicas deaplicación. La función de flashback en tabla no se ocupa de la corrupción física provocada por 

un disco en mal estado.

SintaxisPuede llamar a una operación de flashback en tabla en una o más tablas, incluso en tablas dediferentes esquemas. Para especificar el punto en el tiempo al que desea revertir, proporcioneun registro de hora válido. Por defecto, los disparadores de base de datos están desactivados

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

la cláusula ENABLE TRIGGERS.Nota: Para obtener más información sobre la semántica de flashback y de papelera de

reciclaje, consulte Oracle Database Administrator’s Reference 10g Release 1 (10.1).

Introducción a Oracle 10g: SQL Fundamentals II

71

Page 72: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 72/354

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

Sentencia FLASHBACK TABLE

DROP TABLE emp2;Table dropped

FLASHBACK TABLE emp2 TO BEFORE DROP;Flashback complete

SELECT original_name, operation, droptime,FROM recyclebin;

Sentencia FLASHBACK TABLE (continuación)

Sintaxis y Ejemplos (continuación)

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

información 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 específicamente de la papelera

de reciclaje o hasta que se produce una situación poco probable en la que las deba purgar labase 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 colocarán en la papelera

de reciclaje y se purgarán todos los objetos de la papelera de reciclaje.

Puede purgar la papelera de reciclaje con la siguiente sentencia:

PURGE RECYCLEBIN;

Introducción a Oracle 10g: SQL Fundamentals II

72

Page 73: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 73/354

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

Tablas Externas

Tablas Externas

Una tabla externa es una tabla de sólo lectura cuyos metadatos se almacenan en la base de

datos pero cuyos datos se almacenan fuera de la base de datos. Esta definición de tabla

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 sólo 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.

Introducción a Oracle 10g: SQL Fundamentals II

73

Page 74: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 74/354

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

Tablas Externas (continuación)

Oracle Server proporciona dos controladores de acceso principales para las tablas externas.

Uno de ellos es el controlador de acceso de cargador (u ORACLE_LOADER), que se utiliza

para leer datos de archivos externos cuyo formato se puede interpretar mediante la utilidad

SQL*Loader. Observe que no se soporta toda la funcionalidad de SQL*Loader con tablas

externas.El controlador de acceso ORACLE_DATAPUMP se puede utilizar para importar y exportar 

datos mediante un formato independiente de la plataforma. El controlador de acceso

ORACLE_DATAPUMP escribe filas de una sentencia SELECT que se cargarán en una tabla

externa como parte de la sentencia CREATE TABLE...ORGANIZATIONEXTERNAL...AS SELECT. Puede utilizar SELECT para leer datos de ese archivo de

datos. También puede crear una definición de tabla externa en otro sistema y utilizar ese

archivo de datos. Esto permite que se muevan datos entre bases de datos Oracle.

Introducción a Oracle 10g: SQL Fundamentals II

74

Page 75: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 75/354

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

Creación de un Directorio para la Tabla Externa

Cree un objeto DIRECTORY que se corresponda con eldirectorio del sistema de archivos en el que reside elorigen de datos externo.

CREATE OR REPLACE DIRECTORY emp_dirAS '/…/emp_dir';

GRANT READ ON DIRECTORY emp_dir TO hr;

Ejemplo de Creación de una Tabla ExternaUtilice 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 elque reside un origen de datos externo. Puede utilizar nombres de directorio al hacer referenciaa un origen de datos externo, en lugar de predefinir el nombre de ruta de acceso de sistemaoperativo, para obtener una mayor flexibilidad en la gestión de archivos.

Debe tener privilegios del sistema CREATE ANY DIRECTORY para crear directorios. Al

crear un directorio, se le otorgan automáticamente los privilegios de objeto READ y WRITE, y

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

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

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

Además, es necesario un privilegio WRITE cuando el marco de tablas externas se utilice paradescargar datos.

Oracle proporciona además el tipo ORACLE_DATAPUMP, con el que se pueden descargar datos (es decir, leer datos de una tabla de la base de datos e insertarlos en una tabla externa) yrecargarlos después en una base de datos Oracle. Se trata de una operación que sólo se realiza

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

Introducción a Oracle 10g: SQL Fundamentals II

75

Page 76: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 76/354

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

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

Sintaxis

CREATE [OR REPLACE] DIRECTORY AS 'path_name';

En la sintaxis:

OR REPLACE Especifique OR REPLACE para volver a crear el objeto de

base de datos de directorio si ya existe. Puede utilizar esta

cláusula para cambiar la definición de un directorio existente

sin borrar, volver a crear y volver a otorgar privilegios de

objeto de base de datos anteriormente otorgados en el

directorio. Los usuarios a los que se otorgaron privilegios

anteriormente en un directorio redefinido pueden seguir 

accediendo al directorio sin necesidad de que se vuelvan a

otorgar los privilegios.

directory Especifique el nombre del objeto de directorio que se va a

crear. La longitud máxima del nombre de directorio es de

30 bytes. No se puede cualificar un objeto de directorio con un

nombre de esquema.

'path_name' Especifique el nombre de ruta de acceso completa del

directorio de sistema operativo en el resultado. Observe que el

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

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

CREATE TABLE extract_emps

ORGANIZATION EXTERNAL (TYPE ORACLE_DATAPUMPDEFAULT DIRECTORY …ACCESS PARAMETERS (… )LOCATION (…)

PARALLEL 4

REJECT LIMIT UNLIMITEDAS

SELECT * FROM …;

Introducción a Oracle 10g: SQL Fundamentals II

76

Page 77: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 77/354

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

Creación de una Tabla Externa

CREATE TABLE <table_name>( <col_name> <datatype>, … )

ORGANIZATION EXTERNAL(TYPE <access_driver_type>DEFAULT DIRECTORY <directory_name>ACCESS PARAMETERS

(… ) )LOCATION ('<location_specifier>') )

REJECT LIMIT [0 | <number> | UNLIMITED];

Creación de una Tabla Externa

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

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

en el diccionario de datos que se pueden utilizar para acceder a datos externos. Utilice la

cláusula ORGANIZATION para especificar el orden en que se almacenarán las filas de datos

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

de sólo lectura y que está ubicada fuera de la base de datos. Observe que los archivos externos

deben existir ya fuera de la base de datos.

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

controlador de acceso es la API (interfaz de programación 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 opción es ORACLE_DATAPUMP.

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

de base de datos Oracle que se correspondan con directorios del sistema de archivos en los

que puedan residir orígenes de datos externos.

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

controlador de acceso específico para esta tabla externa.

Introducción a Oracle 10g: SQL Fundamentals II

77

Page 78: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 78/354

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

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

Utilice la cláusula LOCATION para especificar un localizador externo para cada origen de

datos externo. Normalmente, <location_specifier> es un archivo, pero no

necesariamente.

La cláusula REJECT LIMIT le permite especificar cuántos errores de conversión se pueden

producir durante una consulta de los datos externos antes de que se devuelva un error Oracle yse aborte la consulta. El valor por defecto es 0.

Introducción a Oracle 10g: SQL Fundamentals II

78

Page 79: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 79/354

Page 80: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 80/354

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

Ejemplo de Creación de una Tabla Externa mediante el Controlador de AccesoORACLE_LOADER (continuación)

En el ejemplo, se ofrece la especificación TYPE sólo para ilustrar su uso. ORACLE_LOADERes el controlador de acceso por defecto si no se especifica. La opción ACCESS PARAMETERSproporciona valores a los parámetros del controlador de acceso especificado. Estos valores los

interpreta el controlador de acceso, no Oracle Server.

La cláusula PARALLEL permite que cinco servidores de ejecución en paralelo exploren

simultáneamente los orígenes (archivos) de datos externos cuando se ejecuta la sentencia

INSERT INTO TABLE. Por ejemplo, si se especifica PARALLEL=5, puede haber más de un

servidor de ejecución en paralelo trabajando en un origen de datos. Como las tablas externas

pueden ser muy grandes, por motivos de rendimiento, es recomendable especificar la cláusula

PARALLEL o una indicación paralela para la consulta.

La cláusula REJECT LIMIT especifica que si se producen más de 200 errores de conversión

durante una consulta de los datos externos, se aborta la consulta y se devuelve un error. Estos

errores de conversión pueden surgir cuando el controlador de acceso intenta transformar los

datos del archivo de datos para que coincidan con la definición de tabla externa.Cuando el comando CREATE TABLE se haya ejecutado correctamente, se puede describir la

tabla externa OLDEMP y se puede consultar como una tabla relacional.

Introducción a Oracle 10g: SQL Fundamentals II

80

Page 81: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 81/354

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

Consulta de Tablas Externas

SELECT *FROM oldemp

emp.datOLDEMP

Consulta de Tablas Externas

Una tabla externa no describe ningún dato que esté almacenado en la base de datos. Tampoco

describe cómo se almacenan los datos en el origen externo. En realidad, describe cómo debe

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 definición 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 descripción de los datos del origen de datos está separada de la

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

el número de columnas de la tabla. Además, 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 definición de la tabla externa.

Introducción a Oracle 10g: SQL Fundamentals II

81

Page 82: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 82/354

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

Resumen

En esta lección ha aprendido a:

• Agregar restricciones

• Crear índices

• Crear una restricción de tabla primaria medianteun í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

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 mecánica FLASHBACK para restaurar tablas. Utilice la cláusula

external_table para crear una tabla externa, que es una tabla de sólo lectura cuyos

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.

Introducción a Oracle 10g: SQL Fundamentals II

82

Page 83: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 83/354

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

Práctica 2: Visión General

Esta práctica cubre los temas siguientes:

• Modificación de tablas

• Adición de columnas

• Borrado de columnas

• Creación de índices

• Creación de tablas externas

Práctica 2: Visión General

En esta práctica, utilizará el comando ALTER TABLE para modificar columnas y agregar 

restricciones. Utilizará el comando CREATE INDEX para crear índices al crear una tabla,

junto con el comando CREATE TABLE. Creará tablas externas. Borrará columnas y utilizará

la operación FLASHBACK.

Introducción a Oracle 10g: SQL Fundamentals II

83

Page 84: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 84/354

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

Práctica 2

1. Cree la tabla DEPT2 basada en el siguiente gráfico de instancia de tabla. Guarde la

sintaxis en un archivo de comandos denominado lab02_01.sql y, a continuación,

ejecute la sentencia en el archivo de comandos para crear la tabla. Confirme que la tabla

se ha creado.

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

columnas que necesite.

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

sintaxis en un archivo de comandos denominado lab02_03.sql y, a continuación,

ejecute la sentencia en el archivo de comandos para crear la tabla. Confirme que la tabla

se ha creado.

Column Name ID NAME

Key Type

Nulls/Unique

FK Table

FK Column

Data type NUMBER VARCHAR2

Length 7 25

Column Name ID LAST_NAME FIRST_NAME DEPT_ID

Key Type

Nulls/Unique

FK Table

FK Column

Data type NUMBER VARCHAR2 VARCHAR2 NUMBER

Length 7 25 25 7

Introducción a Oracle 10g: SQL Fundamentals II

84

Page 85: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 85/354

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

Práctica 2 (continuación)

4. Modifique la tabla EMP2 para permitir apellidos de empleado más largos. Confirme la

modificación.

5. Confirme que las tablas DEPT2 y EMP2 se han almacenado en el diccionario de datos.

(Indicación: USER_TABLES)

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

Incluya sólo las columnas EMPLOYEE_ID, FIRST_NAME, LAST_NAME, SALARY y

DEPARTMENT_ID. Asigne a las columnas de la nueva tabla los nombres ID,

FIRST_NAME, LAST_NAME, SALARY y DEPT_ID, respectivamente.

7. Borre la tabla EMP2.

8. Consulte la papelera de reciclaje para comprobar si está la tabla.

9. Anule el borrado de la tabla EMP2.

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

comprobando la descripción de la tabla.

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

modificación comprobando la descripción de la tabla.12. Borre todas las columnas UNUSED de la tabla EMPLOYEES2. Confirme la modificación

comprobando la descripción de la tabla.

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

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

Asigne a la restricción el nombre my_emp_id_pk.

Introducción a Oracle 10g: SQL Fundamentals II

85

Page 86: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 86/354

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

Práctica 2 (continuación)14. Cree una restricción PRIMARY KEY a la tabla DEPT2 mediante la columna ID. Se

debe asignar un nombre a la restricción en el momento de la creación. Asigne a la

restricción el nombre my_dept_id_pk.

15. Agregue una referencia de clave ajena en la tabla EMP2 que asegure que el empleado no

está asignado a un departamento inexistente. Asigne a la restricción el nombre

my_emp_dept_id_fk.

16. Confirme que las restricciones se han agregado consultando la vista

USER_CONSTRAINTS. Tenga en cuenta los tipos y los nombres de las restricciones.

17. Muestre los tipos y los nombres de objeto de la vista del diccionario de datos

USER_OBJECT para las tablas EMP2 y DEPT2. Observe que se han creado tablasnuevas 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, precisión 2, escala 2. Agregue una restricción a la columna COMMISSIONque garantice que el valor de comisión 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 gráfico de instancia de

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

Column Name Deptno Dname

Primary Key Yes

Data Type Number VARCHAR2

Length 4 30

Introducción a Oracle 10g: SQL Fundamentals II

86

Page 87: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 87/354

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

Introducción a Oracle 10g: SQL Fundamentals II

87

Page 88: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 88/354

Page 89: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 89/354

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

Objetivos

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

• Manipular datos mediante subconsultas

• Describir las funciones de las inserciones devarias tablas

• Utilizar los siguientes tipos de inserciones devarias tablas

– INSERT incondicional

– INSERT de pivoting

– ALL INSERT condicional

– FIRST INSERT condicional

• Fusionar filas en una tabla

• Hacer un seguimiento de los cambios en datosdurante un período de tiempo

Objetivos

En esta lección aprenderá a manipular datos en la base de datos Oracle mediante subconsultas.

También recibirá información sobre sentencias de inserciones de varias tablas, la sentencia

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

Introducción a Oracle 10g: SQL Fundamentals II

89

Page 90: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 90/354

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

Uso de Subconsultas para Manipular Datos

Puede utilizar subconsultas en sentencias DML para:

• Copiar datos de una tabla a otra

• Recuperar datos de una vista en línea

• Actualizar datos en una tabla basándose en los

valores de otra tabla

• Suprimir filas de una tabla basándose en filas de

otra tabla

Uso de Subconsultas para Manipular Datos

Las subconsultas se pueden utilizar para recuperar datos de una tabla que podrá utilizar como

entrada en una inserción (INSERT) en una tabla diferente. Así, le resultará fácil copiar 

grandes volúmenes de datos de una tabla a otra con una sola sentencia SELECT. De forma

parecida, puede utilizar subconsultas para realizar actualizaciones y supresiones masivas en la

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

en la cláusula FROM de una sentencia SELECT. Esto se conoce como vista en línea.

Introducción a Oracle 10g: SQL Fundamentals II

90

Page 91: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 91/354

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

Copia de Filas de Otra Tabla

• Escriba la sentencia INSERT con una subconsulta.

• No utilice la cláusula VALUES.• Haga corresponder el número de columnas de la

cláusula INSERT con el de la 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.

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 cláusula 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 número de columnas y los tipos de datos de la lista de columnas de la cláusula INSERT se

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

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

INSERT INTO EMPL3SELECT *FROM employees;

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

Introducción a Oracle 10g: SQL Fundamentals II

91

Page 92: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 92/354

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

Inserción mediante una Subconsulta como Destino

INSERT INTO

(SELECT employee_id, last_name,

email, hire_date, job_id, salary,

department_id

FROM empl3

WHERE department_id = 50)

VALUES (99999, 'Taylor', 'DTAYLOR',

TO_DATE('07-JUN-99', 'DD-MON-RR'),

'ST_CLERK', 5000, 50);

1 row created.

Inserción mediante una Subconsulta como Destino

Puede utilizar una subconsulta en lugar del nombre de tabla en la cláusula INTO de la

sentencia INSERT.

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

de columnas de la cláusula 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 aplicación de las subconsultas evita tener que crear una vista únicamente para realizar 

una inserción (INSERT).

Introducción a Oracle 10g: SQL Fundamentals II

92

Page 93: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 93/354

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

Inserción mediante una Subconsulta como Destino

Verifique el resultado.

SELECT employee_id, last_name, email, hire_date,

job_id, salary, department_id

FROM employees

WHERE department_id = 50;

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

El ejemplo muestra los resultados de la subconsulta que se utilizó para identificar la tabla para

la sentencia INSERT.

Introducción a Oracle 10g: SQL Fundamentals II

93

Page 94: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 94/354

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

Recuperación de Datos con una

Subconsulta como Origen

SELECT a.last_name, a.salary,

a.department_id, b.salavg

FROM employees a, (SELECT department_id,

AVG(salary) salavg

FROM employees

GROUP BY department_id) b

WHERE a.department_id = b.department_id

AND a.salary > b.salavg;

Recuperación de Datos con una Subconsulta como OrigenPuede utilizar una subconsulta en la cláusula FROM de una sentencia SELECT, lo cual es muy

parecido al uso de las vistas. Una subconsulta en la cláusula FROM de una sentencia SELECTse denomina también vista en línea. Una subconsulta en la cláusula FROM de una sentencia

SELECT define un origen de datos para una sentencia SELECT en particular y sólo para esa

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

salarios, los números de departamento y los salarios medios de todos los empleados que ganan

más que el salario medio en su departamento. La subconsulta de la cláusula FROM se

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

Introducción a Oracle 10g: SQL Fundamentals II

94

Page 95: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 95/354

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

Actualización de Dos Columnas con

una Subconsulta

Actualice el puesto y el salario del empleado 114 para

hacerlos corresponder con los del empleado 205.

UPDATE empl3

SET job_id = (SELECT job_id

FROM employees

WHERE employee_id = 205),

salary = (SELECT salary

FROM employees

WHERE employee_id = 205)

WHERE employee_id = 114;

1 row updated.

Actualización de Dos Columnas con una Subconsulta

Para actualizar varias columnas en la cláusula SET de una sentencia UPDATE, puede escribir 

varias subconsultas.

SintaxisUPDATE table

SET column =(SELECT column

FROM table

WHERE condition)[ ,column =

(SELECT column

FROM table

WHERE condition)][WHERE condition ] ;

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

Introducción a Oracle 10g: SQL Fundamentals II

95

Page 96: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 96/354

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

Actualización de Filas Basándose

en Otra Tabla

Utilice subconsultas en sentencias UPDATE para

actualizar las filas de una tabla basándose en los

valores de otra tabla.

UPDATE empl3

SET department_id = (SELECT department_id

FROM employees

WHERE employee_id = 100)WHERE job_id = (SELECT job_id

FROM employees

WHERE employee_id = 200);

1 row updated.

Actualización de Filas Basándose 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 basándose en los valores de la tabla

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

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

empleado 100.

Introducción a Oracle 10g: SQL Fundamentals II

96

Page 97: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 97/354

Page 98: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 98/354

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

Uso de la Palabra Clave WITH CHECK OPTION 

en Sentencias DML

• Se utiliza una subconsulta para identificar la tabla y

las columnas de la sentencia DML.

• Las palabras clave WITH CHECK OPTION le prohíben

cambiar las filas que no están en la subconsulta.

INSERT INTO (SELECT employee_id, last_name, email,

hire_date, job_id, salary

FROM empl3

WHERE department_id = 50

WITH CHECK OPTION)

VALUES (99998, 'Smith', 'JSMITH',

TO_DATE('07-JUN-99', 'DD-MON-RR'),

'ST_CLERK', 5000);

INSERT INTO

*

ERROR at line 1:

ORA-01402: view WITH CHECK OPTION where-clause violation

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 estén incluidas en la subconsulta.

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

identifica filas que están 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 inserción de esta fila da como resultado un identificador de departamento nulo, que no está

en la subconsulta.

Introducción a Oracle 10g: SQL Fundamentals II

98

Page 99: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 99/354

Page 100: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 100/354

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

Uso de Valores Por Defecto Explícitos

• DEFAULT con INSERT:

• DEFAULT con UPDATE:

INSERT INTO deptm3

(department_id, department_name, manager_id)

VALUES (300, 'Engineering', DEFAULT);

UPDATE deptm3SET manager_id = DEFAULT

WHERE department_id = 10;

Uso de Valores Por Defecto Explícitos

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

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

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 ningún 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 enun valor por defecto para el departamento 10. Si no se ha definido ningún 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 lección titulada “Creating and Managing Tables”.

Introducción a Oracle 10g: SQL Fundamentals II

100

Page 101: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 101/354

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

Visión General de Sentencias INSERT de

Varias Tablas

Table_a

Table_b

Table_c

INSERT ALL

INTO table_a VALUES(…,…,…)

INTO table_b VALUES(…,…,…)

INTO table_c VALUES(…,…,…)

SELECT …

FROM sourcetabWHERE …;

Visión 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 evaluación de una subconsulta en una o más tablas.

Las sentencias INSERT de varias tablas pueden desempeñar un papel muy útil en el supuesto

de un almacén de datos. Debe cargar el almacén de datos con regularidad para que pueda

cumplir su propósito de facilitar el análisis de negocio. Para ello, se deben extraer y copiar 

datos de uno o más sistemas operativos al almacén de datos. El proceso de extracción de datos

del sistema de origen y su transferencia al almacén de datos se suele denominar ETL (siglas

de extraction, transformation, and loading, o extracción, transformación y carga).

Durante la extracción, se deben identificar y extraer los datos deseados de diferentes orígenes

como, por ejemplo, aplicaciones y sistemas de bases de datos. Después de la extracción, los

datos se deben transportar físicamente 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 través 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 delas técnicas para implementar transformaciones de datos SQL.

Introducción a Oracle 10g: SQL Fundamentals II

101

Page 102: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 102/354

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

Visión General de Sentencias INSERT de

Varias Tablas

• La sentencia INSERT…SELECT se puede utilizar para

insertar filas en varias tablas como parte de una única

sentencia DML.

• Las sentencias INSERT de varias tablas se pueden

utilizar en sistemas de almacenes de datos para

transferir datos de uno o más orígenes operativos a

un juego de tablas destino.• Proporcionan una mejora significativa del

rendimiento en:

– DML único frente a varias sentencias INSERT…SELECT

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

Visión General de Sentencias INSERT de Varias Tablas (continuación)

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 ... SELECTindependientes, procesando los mismos datos de origen n veces y aumentando la carga de

trabajo de transformación 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 más

rápido.

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 más relacional. Para implementar esta funcionalidad de forma alternativa, había que

escribir varias sentencias INSERT.

Introducción a Oracle 10g: SQL Fundamentals II

102

Page 103: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 103/354

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

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

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 cláusulas para indicar el tipo de inserción (INSERT) que se ejecutará.

Introducción a Oracle 10g: SQL Fundamentals II

103

Page 104: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 104/354

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

Sentencias INSERT de Varias Tablas

• Sintaxis

• conditional_insert_clause

INSERT [ALL] [conditional_insert_clause]

[insert_into_clause values_clause] (subquery)

[ALL] [FIRST]

[WHEN condition THEN] [insert_into_clause values_clause][ELSE] [insert_into_clause values_clause]

Sentencias INSERT de Varias Tablas

La diapositiva muestra el formato genérico para las sentencias INSERT de varias tablas.

INSERT Incondicional:ALL into_clause

Especifique ALL seguido de varias cláusulas insert_into_clauses para realizar una

inserción 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 cláusula conditional_insert_clause para realizar una inserción

(INSERT) condicional de varias tablas. Oracle Server filtra cada cláusula insert_into_clause a través de la condición WHEN correspondiente, lo que determina si se ejecutará

insert_into_clause. Una única sentencia INSERT de varias tablas puede contener 

hasta 127 cláusulas WHEN.

INSERT Condicional: ALL

Si especifica ALL, Oracle Server evalúa cada cláusula WHEN independientemente de los

resultados de la evaluación de cualquier otra cláusula WHEN. Para cada cláusula WHEN cuya

condición se evalúe como verdadera, Oracle Server ejecuta la lista correspondiente de

cláusulas INTO.

Introducción a Oracle 10g: SQL Fundamentals II

104

Page 105: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 105/354

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

Sentencias INSERT de Varias Tablas (continuación)

INSERT Condicional:FIRST

Si especifica FIRST, Oracle Server evalúa cada cláusula WHEN en el orden en que aparece

en la sentencia. Si la primera cláusula WHEN se evalúa como verdadera, Oracle Server 

ejecuta la cláusula INTO correspondiente y salta las cláusulas WHEN siguientes para la fila

especificada.INSERT Condicional: Cláusula ELSE

Para una fila especificada, si no se evalúa ninguna cláusula WHEN como verdadera:

• Si ha especificado una cláusula ELSE, Oracle Server ejecuta la lista de cláusulas

INTO asociadas a la cláusula ELSE.

• Si no ha especificado una cláusula ELSE, Oracle Server no realiza ninguna acción

para esa fila.

Restricciones en Sentencias INSERT de Varias Tablas

• Se pueden realizar sentencias INSERT de varias tablas sólo en tablas, no en vistas ni

en vistas materializadas.

• No se puede realizar una inserción (INSERT) de varias tablas en una tabla remota.• No se puede especificar una expresión de recopilación de tablas al realizar una

inserción (INSERT) de varias tablas.

• En una inserción (INSERT) de varias tablas, no se pueden combinar todas las

cláusulas insert_into_clauses para especificar más de 999 columnas de

destino.

Introducción a Oracle 10g: SQL Fundamentals II

105

Page 106: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 106/354

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

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

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

contratación, salario e identificador de supervisor de los empleados cuyo identificador de

empleado es mayor que 200 en la tabla EMPLOYEES. Los detalles de identificador de

empleado, fecha de contratación 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 más

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

Introducción a Oracle 10g: SQL Fundamentals II

106

Page 107: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 107/354

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

INSERT ALL Condicional

• Seleccione los valores EMPLOYEE_ID, HIRE_DATE,

SALARY y MANAGER_ID de la tabla EMPLOYEES de los

empleados cuyo EMPLOYEE_ID sea mayor que 200.

• Si SALARY es mayor que 10.000 dólares, inserte

estos valores en la tabla SAL_HISTORY mediante una

sentencia INSERT condicional de varias tablas.

• Si MANAGER_ID es mayor que 200, inserte estosvalores en la tabla MGR_HISTORY mediante una

sentencia INSERT condicional de varias tablas.

INSERT ALL Condicional

En la diapositiva se especifica la sentencia con un problema para una sentencia INSERT ALLcondicional. La solución a este problema se muestra en la página siguiente.

Introducción a Oracle 10g: SQL Fundamentals II

107

Page 108: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 108/354

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

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.

INSERT ALL Condicional (continuación)

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 contratación, salario e identificador de supervisor de los

empleados cuyo identificador de empleado es mayor que 200 en la tabla EMPLOYEES. Los

detalles de identificador de empleado, fecha de contratación 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

restricción más a las filas que se recuperan mediante la sentencia SELECT. De las filas

recuperadas mediante la sentencia SELECT, sólo aquéllas en las que el valor de la columna

SAL sea mayor que 10000 se insertarán en la tabla SAL_HISTORY y, de forma parecida, sólo

las filas en las que el valor de la columna MGR sean mayor que 200 se insertarán 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 sólo 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.

Introducción a Oracle 10g: SQL Fundamentals II

108

Page 109: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 109/354

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

INSERT FIRST Condicional

• Seleccione DEPARTMENT_ID , SUM(SALARY) yMAX(HIRE_DATE) en la tabla EMPLOYEES.

• Si SUM(SALARY) es mayor que 25.000 dólares, inserte

estos valores en SPECIAL_SAL mediante una sentencia

FIRST INSERT condicional de varias tablas

• Si la primera cláusula WHEN se evalúa como verdadera,

se deben saltar las cláusulas WHEN siguientes para

esta fila.• En las filas que no satisfacen la primera condición

WHEN , realice inserciones en las tablas HIREDATE_

HISTORY_00, HIREDATE_HISTORY_99 o HIREDATE_

HISTORY, basándose en el valor de la columna HIRE_

DATE mediante una sentencia INSERT condicional devarias tablas.

INSERT FIRST Condicional

En la diapositiva se especifica la sentencia con un problema para una sentencia FIRSTINSERT condicional. La solución a este problema se muestra en la página siguiente.

Introducción a Oracle 10g: SQL Fundamentals II

109

Page 110: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 110/354

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

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)

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

INSERT FIRST Condicional (continuación)

El ejemplo de la diapositiva inserta filas en más de una tabla mediante una única sentencia

INSERT. La sentencia SELECT recupera los detalles de identificador de departamento,

salario total y fecha de contratación máxima de cada departamento de la tabla EMPLOYEES.

Esta sentencia INSERT se conoce como FIRST INSERT condicional, ya que se realiza una

excepción para los departamentos cuyo salario total sea mayor que 25.000 dólares. La

condición WHEN ALL > 25000 se evalúa en primer lugar. Si el salario total de un

departamento es mayor que 25.000 dólares, el registro se inserta en la tabla SPECIAL_SAL,

independientemente de la fecha de contratación. Si esta primera cláusula WHEN se evalúa

como verdadera, Oracle Server ejecuta la cláusula INTO correspondiente y salta las cláusulas

WHEN siguientes para esta fila.

Para las filas que no satisfacen la primera condición WHEN (WHEN SAL > 25000), el resto de

las condiciones se evalúa 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, basándose 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.

Introducción a Oracle 10g: SQL Fundamentals II

110

Page 111: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 111/354

Page 112: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 112/354

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

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.

INSERT de Pivoting (continuación)

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 día de la semana, durante una semana con un identificador de

semana en particular.

DESC SALES_SOURCE_DATA

Introducción a Oracle 10g: SQL Fundamentals II

112

Page 113: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 113/354

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

INSERT de Pivoting (continuación)

SELECT * FROM SALES_SOURCE_DATA;

DESC SALES_INFO

SELECT * FROM sales_info;

Observe en el ejemplo anterior que mediante una inserción (INSERT) de pivoting, una fila de

la tabla SALES_SOURCE_DATA se convierte en cinco registros de la tabla relacional,

SALES_INFO.

Introducción a Oracle 10g: SQL Fundamentals II

113

Page 114: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 114/354

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

Sentencia MERGE

• Permite actualizar o insertar datos condicionalmente

en una tabla de base de datos

• Realiza una actualización (UPDATE) si existe la fila y

una inserción (INSERT) si es una fila nueva:

– Evita actualizaciones separadas

– Aumenta el rendimiento y la facilidad de uso

– Es útil en aplicaciones de almacenes de datos

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 decisión de actualizar, insertar o

suprimir en la tabla destino se basa en una condición de la cláusula 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 cláusula DELETE de la cláusula

merge_update_clause, también debe tener el privilegio de objeto

DELETEen 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 fácil de utilizar y se expresa de forma más sencilla como una única

sentencia SQL.

La sentencia MERGE es adecuada en diferentes aplicaciones de almacén de datos. Por 

ejemplo, en una aplicación de almacén de datos, es posible que necesite trabajar con datos

procedentes de varios orígenes, algunos de los cuales pueden estar duplicados. Con la

sentencia MERGE, puede agregar o modificar filas condicionalmente.

Introducción a Oracle 10g: SQL Fundamentals II

114

Page 115: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 115/354

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

Sintaxis de la Sentencia MERGE

Puede insertar o actualizar filas condicionalmente enuna 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 );

Fusión de Filas

Puede actualizar filas existentes e insertar nuevas filas condicionalmente mediante la

sentencia MERGE.

En la sintaxis:

Cláusula INTO especifica la tabla destino que se va a actualizar o en la que se va

a insertar 

Cláusula USING identifica el origen de los datos que se van a actualizar o insertar;

puede ser una tabla, una vista o una subconsulta

Cláusula ON condición según la cual la operación MERGE actualiza o inserta

WHEN MATCHED | indica al servidor cómo responder a los resultados de la condición

de unión

WHEN NOT MATCHED

Para obtener más información, consulte Oracle Database 10g SQL Reference, “MERGE”.

Introducción a Oracle 10g: SQL Fundamentals II

115

Page 116: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 116/354

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

Fusión de Filas

Inserte o actualice las filas de la tabla EMPL3 para que

se corresponda con la tabla EMPLOYEES.

MERGE INTO empl3 c

USING employees e

ON (c.employee_id = e.employee_id)

WHEN MATCHED THEN 

UPDATE SET

c.first_name = e.first_name,

c.last_name = e.last_name,

...

c.department_id = e.department_id

WHEN NOT MATCHED THEN 

INSERT VALUES(e.employee_id, e.first_name, e.last_name,

e.email, e.phone_number, e.hire_date, e.job_id,

e.salary, e.commission_pct, e.manager_id,

e.department_id);

Ejemplo de Fusión de Filas

MERGE INTO empl3 cUSING employees eON (c.employee_id = e.employee_id)

WHEN MATCHED THENUPDATE 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 THENINSERT 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);

Introducción a Oracle 10g: SQL Fundamentals II

116

Page 117: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 117/354

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

Fusión de Filas

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

TRUNCATE TABLE empl3;

SELECT *

FROM empl3;

no rows selected

SELECT *

FROM empl3;

20 rows selected.

Ejemplo de Fusión de Filas (continuación)

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 evalúa la condición c.employee_id = e.employee_id. Como la tabla EMPL3está vacía, la condición devuelve false (no hay correspondencias). La lógica recae en la

cláusula WHEN NOT MATCHED y el comando MERGE inserta las filas de la tabla

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 EMPL3se actualizarían para corresponderse con la tabla EMPLOYEES.

Introducción a Oracle 10g: SQL Fundamentals II

117

Page 118: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 118/354

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

Seguimiento de Cambios en los Datos

Versiones de filas recuperadas

SELECT

Seguimiento de Cambios en los Datos

Puede suceder que, de algún modo, haya datos en la tabla que se hayan cambiadoincorrectamente. Para investigar esto, puede utilizar varias consultas de flashback para ver losdatos de filas en puntos concretos en el tiempo. Lo que es más eficaz, puede utilizar lafunción Consulta de Versiones de Flashback para ver todos los cambios efectuados en una filadurante un período de tiempo. Esta función le permite agregar una cláusula VERSIONS a unasentencia SELECT que especifique un SCN o rango de registro de hora en el que desee ver cambios en los valores de fila. La consulta también puede devolver metadatos asociadoscomo, por ejemplo, la transacción responsable del cambio.

Es más, después de identificar una transacción errónea, puede utilizar la función Consulta deVersiones de Flashback para identificar otros cambios que haya realizado la transacción.Puede utilizar entonces la función Consulta de Versiones de Flashback para restaurar la tablaa un estado anterior a la realización de los cambios.

Puede utilizar una consulta en una tabla con una cláusula VERSIONS para producir todas lasversiones de todas las filas que existen o que hayan existido entre el momento en que seemitió la consulta y los segundos undo_retention anteriores al momento actual. undo_retention es un parámetro de inicialización de ajuste automático. Una consulta queincluye una cláusula VERSIONS se conoce como consulta de versiones. Los resultados deuna consulta de versiones se comportan como si se hubiera aplicado la cláusula WHERE a lasversiones de las filas. La consulta de versiones devuelve versiones de las filas sólo en

transacciones.SCN (número de cambio del sistema): Oracle Server asigna un SCN (número de cambio delsistema) para identificar los registros de rehacer para cada transacción validada.

Introducción a Oracle 10g: SQL Fundamentals II

118

Page 119: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 119/354

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

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;

1

2

3

Ejemplo de Consulta de Versiones de FlashbackEn 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 cláusula VERSIONS no cambia el plan de la consulta. Por ejemplo, si ejecuta una consulta

en una tabla que utilice el método de acceso a índices, la misma consulta de la misma tabla con

una cláusula VERSIONS continúa utilizando el método de acceso a índices. Las versiones de

las filas devueltas por la consulta de versiones son versiones de las filas en las transacciones. La

cláusula VERSIONS no afecta al comportamiento transaccional de una consulta. Esto significa

que una consulta en una tabla con una cláusula VERSIONS sigue heredando el entorno de la

consulta de la transacción en curso.

La cláusula VERSIONS por defecto se puede especificar como VERSIONS BETWEEN{SCN|TIMESTAMP} MINVALUE AND MAXVALUE.

La cláusula VERSIONS es una extensión SQL únicamente para consultas. Puede tener 

operaciones DML y DDL que utilicen una cláusula VERSIONS dentro de las subconsultas. La

consulta de versiones recupera todas las versiones validadas de las filas seleccionadas. Los

cambios realizados por la transacción activa actual no se devuelven. La consulta de versiones

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.

Introducción a Oracle 10g: SQL Fundamentals II

119

Page 120: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 120/354

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

Ejemplo de Obtención de Versiones de Filas

El acceso a filas para una consulta de versiones se puede definir en una de las siguientes dos

categorías:

• Acceso a filas basado en ROWID: En el caso del acceso basado en ROWID, se devuelven

todas las versiones de los ROWID independientemente del contenido de las filas.

Básicamente, esto significa que se devuelven todas las versiones de la ranura del bloque

indicado por el ROWID.

• Acceso a todas las demás filas: Para el acceso a todas las demás filas, se devuelven

todas las versiones de las filas.

Introducción a Oracle 10g: SQL Fundamentals II

120

Page 121: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 121/354

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

Cláusula VERSIONS BETWEEN 

SELECT versions_starttime "START_DATE",

versions_endtime "END_DATE",

salary

FROM employees

VERSIONS BETWEEN SCN MINVALUE

AND MAXVALUE

WHERE last_name = 'Lorentz';

Cláusula VERSIONS BETWEEN 

Puede utilizar la cláusula VERSIONS BETWEEN para recuperar todas las versiones de las

filas que existen o que han existido entre el momento en que se emitió la consulta y un punto

pasado en el tiempo.

Si el momento de retención de deshacer es mejor que el momento de límite inferior/SCN de la

cláusula BETWEEN, la consulta recupera únicamente las versiones hasta el momento de

retención de deshacer. El intervalo de tiempo de la cláusula BETWEEN se puede especificar 

como intervaloSCN

o como intervalo de reloj. Este intervalo de tiempo se cierra en los

límites inferior y superior.

En el ejemplo, se recuperan los cambios de salario de Lorentz. El valor NULL para

END_DATE para la primera versión indica que se trataba de la versión existente en el

momento de la consulta. El valor NULL para START_DATE para la última versión indica que

esta versión se creó en un momento anterior a la retención de deshacer.

Introducción a Oracle 10g: SQL Fundamentals II

121

Page 122: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 122/354

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

Resumen

En esta lección ha aprendido a:

• Utilizar sentencias DML y controlar transacciones

• Describir las funciones de las inserciones de varias

tablas

• Utilizar los siguientes tipos de inserciones de varias

tablas

– INSERT incondicional

– INSERT de pivoting

– ALL INSERT condicional

– FIRST INSERT condicional

• Fusionar filas en una tabla

• Manipular datos mediante subconsultas

• Hacer un seguimiento de los cambios en datos

durante un período de tiempo

Resumen

En esta lección ha aprendido a manipular datos en la base de datos Oracle mediante subconsultas.

También ha recibido información sobre sentencias INSERT de varias tablas, la sentencia MERGEy el seguimiento de los cambios en la base de datos.

Introducción a Oracle 10g: SQL Fundamentals II

122

Page 123: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 123/354

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

Práctica 3: Visión General

Esta práctica cubre los temas siguientes:

• Realización de inserciones (INSERT) de varias

tablas

• Realización de operaciones MERGE

• Seguimiento de versiones de filas

Práctica 3: Visión General

En esta práctica, agregará filas a la tabla emp_data, actualizará y suprimirá datos de la tabla

y realizará un seguimiento de las transacciones.

Introducción a Oracle 10g: SQL Fundamentals II

123

Page 124: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 124/354

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

Práctica 3

1. Ejecute el archivo de comandos lab_03_01.sql en la carpeta de prácticas para

crear la tabla SAL_HISTORY.

2. Muestre la estructura de la tabla SAL_HISTORY.

3. Ejecute el archivo de comandos lab_03_03.sql en la carpeta de prácticas para

crear la tabla MGR_HISTORY.

4. Muestre la estructura de la tabla MGR_HISTORY.

5. Ejecute el archivo de comandos lab_03_05.sql en la carpeta de prácticas para

crear la tabla SPECIAL_SAL.

6. Muestre la estructura de la tabla SPECIAL_SAL.

7. a. Escriba una consulta para:

- Recuperar los detalles de identificador de empleado, fecha de contratación,

salario e identificador de supervisor de los empleados cuyo identificador de

empleado es menor que 125 en la tabla EMPLOYEES.

- Si el salario es mayor que 20.000 dólares, insertar los detalles de identificador 

de empleado y salario en la tabla SPECIAL_SAL.

- Insertar los detalles de identificador de empleado, fecha de contratación y

salario en la tabla SAL_HISTORY.

- Insertar los detalles de identificador de empleado, identificador de supervisor y

salario en la tabla MGR_HISTORY.

Introducción a Oracle 10g: SQL Fundamentals II

124

Page 125: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 125/354

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

Práctica 3 (continuación)b. Muestre los registros de la tabla SPECIAL_SAL.

c. Muestre los registros de la tabla SAL_HISTORY.

Introducción a Oracle 10g: SQL Fundamentals II

125

Page 126: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 126/354

Page 127: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 127/354

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

Práctica 3 (continuación)8. a. Ejecute el archivo de comandos lab_03_08a.sql en la carpeta de prácticas

para crear la tabla SALES_SOURCE_DATA.

b. Ejecute el archivo de comandos lab_03_08b.sql en la carpeta de prácticas

para insertar registros en la tabla SALES_SOURCE_DATA.

c. Muestre la estructura de la tabla SALES_SOURCE_DATA.

d. Muestre los registros de la tabla SALES_SOURCE_DATA.

e. Ejecute el archivo de comandos lab_03_08c.sql en la carpeta de prácticas

para crear la tabla SALES_INFO.

f. Muestre la estructura de la tabla SALES_INFO.

Introducción a Oracle 10g: SQL Fundamentals II

127

Page 128: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 128/354

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

Práctica 3 (continuación)g. Escriba una consulta para:

Recuperar los detalles de identificador de empleado, identificador de semana, ventas

el lunes, ventas el martes, ventas el miércoles, ventas el jueves y ventas el viernes

de la tabla SALES_SOURCE_DATA.

Crear tal transformación que cada registro recuperado de la tabla SALES_

SOURCE_DATA se convierta en varios registros para la tabla SALES_INFO.

Indicación: Utilice una sentencia INSERT de pivoting.

h. Muestre los registros de la tabla SALES_INFO.

9. Tiene almacenados los datos de empleados antiguos en un archivo plano denominado

emp.data. Desea almacenar los nombres y los identificadores de correo electrónico de

todos los empleados antiguos y actuales en una tabla. Para ello, cree primero una tabla

externa denominada EMP_DATA mediante el archivo de origen emp.dat en el directorio

emp_dir. Para ello, puede utilizar el archivo de comandos lab_03_ 09.sql.

10. A continuación, ejecute el archivo de comandos lab_03_10.sql para crear la tabla

EMP_HIST.

a. Aumente el tamaño de la columna de correo electrónico a 45.

b. Fusione los datos de la tabla EMP_DATA creada en la última práctica en los datos de

la tabla EMP_HIST. Suponga que los datos de la tabla externa EMP_DATA son losmás actualizados. Si una fila de la tabla EMP_DATA se corresponde con la tabla

EMP_HIST, actualice la columna de correo electrónico de la tabla EMP_ HISTpara hacerla corresponder con la fila de la tabla EMP_DATA. Si una fila de la tabla

EMP_DATA no encuentra correspondencia, insértela en la tabla EMP_HIST. Se

considera que las filas se corresponden cuando el nombre y el apellido del empleado

son idénticos.

c. Recupere las filas de EMP_HIST después de la fusión.

Introducción a Oracle 10g: SQL Fundamentals II

128

Page 129: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 129/354

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

Práctica 3 (continuación)

11. Cree la tabla EMP3 mediante el archivo de comandos lab_03_11.sql. En la tabla

EMP3, cambie el departamento de Kochhar a 60 y valide el cambio. A continuación,

cambie el departamento de Kochhar a 50 y valide el cambio. Realice un seguimiento de

los cambios efectuados en Kochhar mediante la función de versiones de filas.

Introducción a Oracle 10g: SQL Fundamentals II

129

Page 130: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 130/354

Generación de Informes mediante

la Agrupación de Datos Relacionados

Introducción a Oracle 10g: SQL Fundamentals II

130

Page 131: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 131/354

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

Objetivos

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

• Utilizar la operación ROLLUP para generar valores

subtotales

• Utilizar la operación CUBE para generar valores desde

varias tablas

• Utilizar la función GROUPING para identificar los

valores de fila creados por ROLLUP o CUBE

• Utilizar GROUPING SETS para generar un juego de

resultados único

Objetivos

En esta lección, aprenderá a:

• Agrupar datos para obtener:

- Valores subtotales mediante el operador ROLLUP

- Valores desde varias tablas mediante el operador CUBE

• Utilice la función GROUPING para identificar el nivel de agregación 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

Introducción a Oracle 10g: SQL Fundamentals II

131

Page 132: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 132/354

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

Revisión de Funciones de Grupo

• Las funciones de grupo operan en juegos de filas

para dar un resultado por grupo.

• Ejemplo:

SELECT [column ,] group_function(column). . .

FROM table

[WHERE condition ]

[GROUP BY group_by_expression ]

[ORDER BY column ];

SELECT AVG(salary), STDDEV(salary),

COUNT(commission_pct),MAX(hire_date)

FROM employees

WHERE job_id LIKE 'SA%';

Funciones de Grupo

Puede utilizar la cláusula GROUP BY para dividir las filas de una tabla en grupos. Puedeutilizar entonces las funciones de grupo para devolver información de resumen para cadagrupo. Las funciones de grupo pueden aparecer en listas de selección y en cláusulas ORDERBY y HAVING. Oracle Server aplica las funciones de grupo a cada grupo de filas y devuelveuna 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 sólo en valores numéricos. MAX y MIN pueden operar en valores de datosnuméricos, de carácter o de fecha. COUNT devuelve el número de filas no nulas para laexpresión específica. El ejemplo de la diapositiva calcula el salario medio, la desviaciónestándar en el salario, el número de empleados que ganan una comisión y la fecha decontratación máxima 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 función NVL. COUNT devuelve unnúmero o cero.

• Oracle Server clasifica implícitamente el juego de resultados en orden ascendente de las

columnas de agrupamiento especificadas si se utiliza una cláusula GROUP BY. Parasustituir esta clasificación por defecto, puede utilizar DESC en una cláusula ORDER BY.

Introducción a Oracle 10g: SQL Fundamentals II

132

Page 133: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 133/354

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

Revisión de la Cláusula GROUP BY

• Sintaxis:

• Ejemplo:

SELECT department_id, job_id, SUM(salary),

COUNT(employee_id)

FROM employees

GROUP BY department_id, job_id ;

SELECT [column ,]

FROM table

[WHERE condition ]

[GROUP BY group_by_expression ]

[ORDER BY column ];

group_function(column). . .

Revisión de la Cláusula GROUP BY

Oracle Server evalúa el ejemplo que se muestra en la diapositiva de la siguiente forma:

• La cláusula SELECT especifica que se deben recuperar las siguientes columnas:

- Columnas de identificador de departamento y de identificador de puesto de la tabla

EMPLOYEES

- Suma de todos los salarios y número de empleados en cada grupo que ha

especificado en la cláusula GROUP BY

• La cláusula GROUP BY especifica cómo se deben agrupar las filas en la tabla. El salario

total y el número de empleados se calculan para cada identificador de puesto dentro de

cada departamento. Las filas se agrupan por identificador de departamento y después

por puesto dentro de cada departamento.

Introducción a Oracle 10g: SQL Fundamentals II

133

Page 134: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 134/354

Page 135: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 135/354

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

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 deresultados que contiene las filas de ROLLUP y las

filas de valores derivados de varias tablas.

GROUP BY con los Operadores ROLLUP y CUBE

Especifique los operadores ROLLUP y CUBE en la cláusula GROUP BY de una consulta. El

agrupamiento con ROLLUP genera un juego de resultados que contiene las filas agrupadas

normales y las filas subtotales. La operación CUBE de la cláusula GROUP BY agrupa las filas

seleccionadas basándose en los valores de todas las combinaciones posibles de expresiones de

las especificaciones y devuelve una sola fila de información 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, asegúrese de que las columnas que vayan después de

GROUP BY tengan relaciones significativas y reales entre sí, ya que, de lo contrario, los

operadores devolverán información irrelevante.

Introducción a Oracle 10g: SQL Fundamentals II

135

Page 136: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 136/354

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

Operador ROLLUP

• ROLLUP es una extensión de la cláusula GROUP BY.

• Utilice la operación ROLLUP para generar agregados

acumulativos como, por ejemplo, subtotales.

SELECT [column ,] group_function(column). . .

FROM table

[WHERE condition ]

[GROUP BY [ROLLUP] group_by_expression ]

[HAVING having_expression ];

[ORDER BY column ];

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 estadísticas e información de resumen de los juegos de resultados. Los agregados

acumulativos se pueden utilizar en informes, diagramas y gráficos.

El operador ROLLUP crea agrupamientos moviéndose en una dirección, de derecha a

izquierda, a lo largo de la lista de columnas especificada en la cláusula GROUP BY. A

continuación, aplica la función agregada a estos agrupamientos.

Nota• Para generar subtotales en n dimensiones (es decir, n columnas de la cláusula GROUP

BY) sin un operador ROLLUP, se deben enlazar n+1 sentencias SELECT con UNION

ALL. Esto hace que la ejecución 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 generación de subtotales.

• Los subtotales y los totales se generan con ROLLUP. CUBE genera totales también, pero

acumula eficazmente en cada dirección posible, lo que genera datos de valores

derivados de varias tablas.

Introducción a Oracle 10g: SQL Fundamentals II

136

Page 137: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 137/354

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

Operador ROLLUP: Ejemplo

SELECT department_id, job_id, SUM(salary)

FROM employees

WHERE department_id < 60

GROUP BY ROLLUP(department_id, job_id);

3

1

2

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 cláusulaGROUP 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 puestoEn este ejemplo, 1 indica un grupo totalizado tanto por DEPARTMENT_ID como por 

JOB_ID, 2 indica un grupo totalizado sólo por DEPARTMENT_ID y 3 indica la suma total.

El operador ROLLUP crea subtotales que acumulan desde el nivel más detallado hasta la suma

total, después de la lista de agrupamiento especificada en la cláusula GROUP BY. Primero,

calcula los valores agregados estándar para los grupos especificados en la cláusula GROUP

BY (en el ejemplo, la suma de salarios agrupados en cada puesto de un departamento). A

continuación, va creando subtotales de mayor nivel progresivamente, de derecha a izquierda

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 cláusula GROUP BY, la operación 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 demás, filas superagregadas.

Introducción a Oracle 10g: SQL Fundamentals II

137

Page 138: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 138/354

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

Operador CUBE

• CUBE es una extensión de la cláusula GROUP BY.

• Puede utilizar el operador CUBE para generar valores

desde varias tablas con una única sentencia SELECT.

SELECT [column ,] group_function(column)...

FROM table

[WHERE condition ]

[GROUP BY [CUBE] group_by_expression ][HAVING having_expression ]

[ORDER BY column ];

Operador CUBE

El operador CUBE es un conmutador adicional de la cláusula GROUP BY de una sentenciaSELECT. 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 sólo unafracción de posibles combinaciones de subtotales, CUBE genera subtotales para todas lasposibles combinaciones de agrupamientos especificados en la cláusula GROUP BY y unasuma total.

El operador CUBE se utiliza con una función agregada para generar filas adicionales en unjuego de resultados. Las columnas incluidas en la cláusula GROUP BY son de referenciacruzada y se utilizan para generar un superjuego de grupos. La función agregada especificadaen la lista de selecciones se aplica a estos grupos para generar valores de resumen para las filassuperagregadas adicionales. El número de grupos adicionales del juego de resultados lodetermina el número de columnas incluidas en la cláusula GROUP BY.

De hecho, todas las posibles combinaciones de las columnas o las expresiones de la cláusulaGROUP BY se utilizan para generar superagregados. Si tiene n columnas o expresiones en lacláusula GROUP BY, habrá 2n posibles combinaciones superagregadas. Matemáticamente,estas combinaciones forman un cubo de n dimensiones, de ahí el nombre del operador.

Mediante la aplicación o herramientas de programación, estos valores superagregados sepueden proporcionar a diagramas y gráficos que expresarán los resultados y las relacioneseficazmente y de forma visual.

Introducción a Oracle 10g: SQL Fundamentals II

138

Page 139: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 139/354

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

Operador CUBE: Ejemplo

SELECT department_id, job_id, SUM(salary)FROM employees

WHERE department_id < 60

GROUP BY CUBE (department_id, job_id);

1

2

3

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 departamentoscuyo identificador es menor que 60) se muestra mediante la cláusula 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 sólo por JOB_ID. 3indica algunas de las filas totalizadas por DEPARTMENT_ID y JOB_ID. 4 indica algunasde las filas totalizadas sólo por DEPARTMENT_ID.

El operador CUBE también ha realizado la operación 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.Además, 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 cláusula GROUP BY) sin un operador CUBE, se deben enlazar 2n

sentencias SELECT con UNION ALL. Así pues, un informe de tres dimensiones requiere quese enlacen 23 = 8 sentencias SELECT con UNION ALL.

Introducción a Oracle 10g: SQL Fundamentals II

139

Page 140: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 140/354

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

.

Función GROUPING

La función GROUPING:

• Se utiliza con los operadores CUBE o ROLLUP

• Se utiliza para encontrar los grupos que forman elsubtotal en una fila

• Se utiliza para diferenciar los valores NULL

almacenados de los valores NULL creados por ROLLUP o CUBE

• Devuelve 0 ó 1SELECT [column,] group_function(column) .. ,

GROUPING(expr)

FROM table

[WHERE condition ]

[GROUP BY [ROLLUP][CUBE] group_by_expression ]

[HAVING having_expression ]

[ORDER BY column ];

Función GROUPING

La función GROUPING se puede utilizar con los operadores CUBE o ROLLUP para entender mejor el modo en que se ha obtenido un valor de resumen.

La función GROUPING utiliza una sola columna como argumento. El valor de expr en lafunción GROUPING se debe corresponder con una de las expresiones de la cláusula GROUPBY. La función devuelve un valor de 0 ó 1.

Los valores devueltos por la función GROUPING son útiles para:

• Determinar el nivel de agregación de un subtotal dado; es decir, el grupo o los grupos enlos que se basa el subtotal

• Identificar si un valor NULL en la columna de expresiones de una fila del juego deresultado indica:

- Un valor NULL de la tabla base (valor NULL almacenado)

- Un valor NULL creado por ROLLUP o CUBE (como resultado de una función degrupo en esa expresión)

Un valor de 0 devuelto por la función GROUPING basándose en una expresión indica una deestas posibilidades:

• Se ha utilizado la expresión 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 función GROUPING basándose en una expresión indica una deestas posibilidades:

• No se ha utilizado la expresión para calcular el valor agregado.

• El valor NULL de la columna de expresiones se crea mediante ROLLUP o CUBE comoresultado del agrupamiento.

Introducción a Oracle 10g: SQL Fundamentals II

140

Page 141: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 141/354

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

Función GROUPING: Ejemplo

SELECT department_id DEPTID, job_id JOB,

SUM(salary),

GROUPING(department_id) GRP_DEPT,

GROUPING(job_id) GRP_JOB

FROM employees

WHERE department_id < 50

GROUP BY ROLLUP(department_id, job_id);

12

3

Ejemplo de una Función 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).

Introducción a Oracle 10g: SQL Fundamentals II

141

Page 142: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 142/354

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

GROUPING SETS

• Se utiliza la sintaxis de GROUPING SETS para definir 

varios agrupamientos en la misma consulta.

• Se calculan todos los agrupamientos especificadosen la cláusula GROUPING SETS y los resultados de

agrupamientos individuales se combinan con unaoperación UNION ALL.

• Eficiencia de los juegos de agrupamientos:– Sólo se requiere una transferencia sobre la tabla base.

– No es necesario escribir sentencias UNION complejas.

– Cuantos más elementos tenga GROUPING SETS, mayor 

será la ventaja en el rendimiento.

GROUPING SETS

GROUPING SETS es una extensión adicional de la cláusula GROUP BY que se puede

utilizar para especificar varios agrupamientos de datos. Esto facilita una agregación eficiente

y, por tanto, facilita el análisis de datos en varias dimensiones.

Ahora se puede escribir una sola sentencia SELECT mediante GROUPING SETS para

especificar varios agrupamientos (que también 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 función, se requieren varias consultas combinadas junto con UNION ALL para

obtener la salida de la sentencia SELECT anterior. Un enfoque multiconsulta resultaineficiente, ya que requiere varias exploraciones de los mismos datos.

Introducción a Oracle 10g: SQL Fundamentals II

142

Page 143: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 143/354

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

GROUPING SETS (continuación)

Compare el ejemplo anterior con la siguiente alternativa:

SELECT department_id, job_id, manager_id, AVG(salary)

FROM employees

GROUP BY CUBE(department_id, job_id, manager_id);

Esta sentencia calcula los 8 (2 *2 *2) agrupamientos, aunque sólo son los grupos(department_id, job_id, manager_id), (department_id,

manager_id) y (job_id, manager_id) los que le interesan.

Otra alternativa es la siguiente sentencia:

SELECT department_id, job_id, manager_id, AVG(salary)

FROM employees

GROUP BY department_id, job_id, manager_id

UNION ALL

SELECT department_id, NULL, manager_id, AVG(salary)

FROM employees

GROUP BY department_id, manager_id

UNION ALL

SELECT NULL, job_id, manager_id, AVG(salary)

FROM employees

GROUP BY job_id, manager_id;

Esta sentencia requiere tres exploraciones de la tabla base, lo que la hace ineficiente.

CUBE y ROLLUP se pueden considerar juegos de agrupamientos con semántica muy

específica. La siguiente equivalencia lo muestra:

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

es equivalente a

GROUPING SETS

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

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

CUBE(a, b, c)

es equivalente a

Introducción a Oracle 10g: SQL Fundamentals II

143

Page 144: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 144/354

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

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

1

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

Introducción a Oracle 10g: SQL Fundamentals II

144

Page 145: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 145/354

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

GROUPING SETS: Ejemplo (continuación)

El ejemplo de la diapositiva también se puede escribir como:SELECT department_id, job_id, NULL as manager_id,

AVG(salary) as AVGSAL

FROM employees

GROUP BY department_id, job_id

UNION ALLSELECT NULL, job_id, manager_id, avg(salary) as AVGSAL

FROM employees

GROUP BY job_id, manager_id;

En ausencia de un optimizador que busque en los bloques de consulta para generar el plan de

ejecución, la consulta anterior necesitaría dos exploraciones de la tabla base, EMPLOYEES.

Esto podría resultar muy ineficiente. Por tanto, se recomienda utilizar la sentencia

GROUPING SETS.

Introducción a Oracle 10g: SQL Fundamentals II

145

Page 146: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 146/354

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

Columnas Compuestas

• Una columna compuesta es una recopilación de

columnas que se tratan como una unidad.

ROLLUP (a, , d)

• Utilice paréntesis dentro de la cláusula GROUP BY

para agrupar columnas, de modo que se tratencomo una unidad al calcular operaciones ROLLUP

o CUBE.• La utilización de columnas compuestas con

ROLLUP o CUBE provocaría el salto de la

agregación en determinados niveles.

(b,c)

Columnas Compuestas

Una columna compuesta es una recopilación de columnas que se tratan como una unidaddurante el cálculo de agrupamientos. Especifique las columnas entre paréntesis como en lasiguiente sentencia:

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

Aquí, (b, c) forma una columna compuesta y se trata como una unidad. Por lo general, lascolumnas compuestas son útiles en ROLLUP, CUBE y GROUPING SETS. Por ejemplo, enCUBE o ROLLUP, las columnas compuestas provocarían el salto de la agregación 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 setiene un alias, por ejemplo, z, para (b, c) y la expresión GROUP BY se reduce aGROUP BY ROLLUP(a, z).Nota: GROUP BY( ) normalmente es una sentencia SELECT con valores NULL para lascolumnas a y b y sólo la función agregada. Esto se utiliza generalmente para generar sumastotales.

SELECT NULL, NULL, aggregate_colFROM <table_name>

GROUP BY ( );

Introducción a Oracle 10g: SQL Fundamentals II

146

Page 147: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 147/354

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

Columnas Compuestas (continuación)

Compare esto con la operación ROLLUP normal, como en:

GROUP BY ROLLUP(a, b, c)

que seríaGROUP BY a, b, c UNION ALL

GROUP BY a, b UNION ALLGROUP BY a UNION ALL

GROUP BY ()

De forma parecida,

GROUP BY CUBE((a, b), c)

sería equivalente aGROUP BY a, b, c UNION ALL

GROUP BY a, b UNION ALL

GROUP BY c UNION ALL

GROUP BY ()

La siguiente tabla muestra una especificación de juegos de agrupamientos y la especificaciónGROUP BY equivalente.

GROUP BY a UNION ALL

GROUP BY b UNION ALL

GROUP BY ()

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

GROUP BY a UNION ALL

GROUP BY ROLLUP(b, c)

GROUP BY GROUPING SETS

(a,ROLLUP(b, c))

(La expresión GROUPING SETS tieneuna columna compuesta).

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

GROUP BY a UNION ALLGROUP BY b UNION ALL

GROUP BY b, c

GROUP BY GROUPING SETS(a, b,(b, c))(La expresión GROUPING SETS tiene una columna

compuesta).

GROUP BY a UNION ALL

GROUP BY b UNION ALL

GROUP BY c

GROUP BY GROUPING SETS(a, b, c)

Sentencias GROUP BY EquivalentesSentencias GROUPING SETS

Introducción a Oracle 10g: SQL Fundamentals II

147

Page 148: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 148/354

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

Columnas Compuestas: Ejemplo

SELECT department_id, job_id, manager_id,

SUM(salary)

FROM employees

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

2

3

4

1

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 sólo le interesan grupos específicos, no puede limitar el cálculo a esos agrupamientos sin

utilizar columnas compuestas. Con las columnas compuestas, esto es posible si se trata las

columnas JOB_ID y MANAGER_ID como una unidad durante la acumulación. Las columnas

entre paréntesis se tratan como una unidad durante los cálculos ROLLUP y CUBE. Esto se

ilustra en el ejemplo de la diapositiva. Al poner las columnas JOB_ID y MANAGER_ID entre

paréntesis, le indica a Oracle Server que trate JOB_ID y MANAGER_ID como una unidad,

que es una columna compuesta.

Introducción a Oracle 10g: SQL Fundamentals II

148

Page 149: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 149/354

Page 150: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 150/354

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

Agrupamientos Concatenados

• Los agrupamientos concatenados ofrecen una

forma concisa de generar combinaciones de

agrupamientos útiles.

• Para especificar los juegos de agrupamientosconcatenados, separe varias operaciones ROLLUP,

CUBE y juegos de agrupamientos con comas, de

modo que Oracle Server las combine en una únicacláusula GROUP BY.

• El resultado es un producto combinado de

agrupamientos de cada juego de agrupamientos.

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 continuación 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 concatenación 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

concatenación de juegos de agrupamientos, en la que cada juego de agrupamientos

define los agrupamientos necesarios para una dimensión.

Introducción a Oracle 10g: SQL Fundamentals II

150

Page 151: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 151/354

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

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

4 5

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.

Introducción a Oracle 10g: SQL Fundamentals II

151

Page 152: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 152/354

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

Resumen

En esta lección ha aprendido a utilizar:

• La operación ROLLUP para generar valores subtotales

• La operación CUBE para generar valores desde varias

tablas

• La función GROUPING para identificar los valores de

fila creados por ROLLUP o CUBE

• La sintaxis de GROUPING SETS para definir varios

agrupamientos en la misma consulta

• La cláusula GROUP BY para combinar expresiones de

diversos modos:

– Columnas compuestas

– Juegos de agrupamientos concatenados

Resumen• ROLLUP y CUBE son extensiones de la cláusula GROUP BY.

• ROLLUP se utiliza para mostrar valores subtotales y la suma total.

• CUBE se utiliza para mostrar valores desde varias tablas.

• La función GROUPING le permite determinar si una fila es un agregado generado por un

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 cláusula GROUP BY, puede combinar expresiones de varias formas:-{}-

- Para especificar columnas compuestas, se agrupan las columnas entre paréntesis,

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 cláusula GROUP BY. El resultado es un producto

combinado de agrupamientos de cada juego de agrupamientos.

Introducción a Oracle 10g: SQL Fundamentals II

152

Page 153: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 153/354

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

Práctica 4: Visión General

Esta práctica trata sobre el uso de:

• Operadores ROLLUP

• Operadores CUBE

• Funciones GROUPING

• GROUPING SETS

Práctica 4: Visión General

En esta practica, utilizará los operadores ROLLUP y CUBE como extensiones de la cláusula

GROUP BY. Utilizará también GROUPING SETS.

Introducción a Oracle 10g: SQL Fundamentals II

153

Page 154: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 154/354

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

Práctica 4

1. Escriba una consulta para mostrar lo siguiente para los empleados cuyo identificador 

de supervisor sea menor que 120:

- Identificador de supervisor 

- Identificador de puesto y salario total de todos los identificadores de puesto de

los empleados que estén a las órdenes del mismo supervisor - Salario total de esos supervisores

- Salario total de esos supervisores, independientemente de los identificadores de

puesto

Introducción a Oracle 10g: SQL Fundamentals II

154

Page 155: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 155/354

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

Práctica 4 (continuación)

2. Observe la salida de la pregunta 1. Escriba una consulta mediante la función

GROUPING para determinar si los valores NULL de las columnas correspondientes a

las expresiones GROUP BY los genera la operación ROLLUP.

Introducción a Oracle 10g: SQL Fundamentals II

155

Page 156: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 156/354

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

Práctica 4 (continuación)

3. Escriba una consulta para mostrar lo siguiente para los empleados cuyo identificador 

de supervisor sea menor que 120:

- Identificador de supervisor 

- Puesto y salarios totales de todos los puestos de empleados que estén a las

órdenes del mismo supervisor - Salario total de esos supervisores

- Valores desde varias tablas para mostrar el salario total de todos los puestos,

independientemente del supervisor 

- Salario total independientemente de todos los cargos

Introducción a Oracle 10g: SQL Fundamentals II

156

Page 157: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 157/354

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

Práctica 4 (continuación)

4. Observe la salida de la pregunta 3. Escriba una consulta mediante la función

GROUPING para determinar si los valores NULL en las columnas correspondientes a

las expresiones GROUP BY los genera la operación CUBE.

Introducción a Oracle 10g: SQL Fundamentals II

157

Page 158: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 158/354

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

Práctica 4 (continuación)

5. Mediante GROUPING SETS, escriba una consulta para mostrar los siguientes

agrupamientos:

- department_id, manager_id, job_id

- department_id, job_id

- manager_id, job_idLa consulta debe calcular la suma de los salarios para cada uno de estos grupos.

Introducción a Oracle 10g: SQL Fundamentals II

158

Page 159: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 159/354

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

Introducción a Oracle 10g: SQL Fundamentals II

159

Page 160: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 160/354

Gestión de Datos en Zonas Horarias Diferentes

Introducción a Oracle 10g: SQL Fundamentals II

160

Page 161: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 161/354

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

Objetivos

Al final de esta lección, debería estar capacitado para

utilizar las siguientes funciones de fecha/hora:

• TZ_OFFSET

• FROM_TZ

• TO_TIMESTAMP

• TO_TIMESTAMP_TZ

• TO_YMINTERVAL

• CURRENT_DATE

• CURRENT_TIMESTAMP

• LOCALTIMESTAMP

• DBTIMEZONE

• SESSIONTIMEZONE

• EXTRACT

Objetivos

Esta lección trata algunas de las funciones de fecha/hora disponibles en la base de

datos Oracle.

Introducción a Oracle 10g: SQL Fundamentals II

161

Page 162: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 162/354

Page 163: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 163/354

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

Parámetro de Sesión TIME_ZONE

TIME_ZONE se puede definir en:

• Un offset absoluto

• Zona horaria de la base de datos

• Zona horaria del sistema operativo local

• Una región especificada

ALTER SESSION SET TIME_ZONE = '-05:00';

ALTER SESSION SET TIME_ZONE = dbtimezone;

ALTER SESSION SET TIME_ZONE = local;

ALTER SESSION SET TIME_ZONE = 'America/New_York';

Parámetro de Sesión TIME_ZONE

La base de datos Oracle soporta el almacenamiento de la zona horaria en sus datos de fecha y

hora, además de en fracciones de segundo. El comando ALTER SESSION se puede utilizar 

para cambiar los valores de zona horaria en una sesión de usuario. Los valores de zona horaria

se pueden definir en un offset absoluto, una zona horaria especificada, una zona horaria de

base de datos o la zona horaria local.

Introducción a Oracle 10g: SQL Fundamentals II

163

Page 164: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 164/354

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

CURRENT_DATE, CURRENT_TIMESTAMPy LOCALTIMESTAMP

• CURRENT_DATE

– Devuelve la fecha actual del sistema– Tiene un tipo de datos DATE

• CURRENT_TIMESTAMP

– Devuelve el registro de hora actual del sistema– Tiene un tipo de datos TIMESTAMP WITH TIME ZONE

• LOCALTIMESTAMP

– Devuelve el registro de hora actual de la sesión deusuario

– Tiene un tipo de datos TIMESTAMP

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 sesión 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 número de

dígitos de la parte fraccional del campo de fecha/hora SECOND y puede ser un número en el

rango de 0 a 9. El valor por defecto es 6.

La función LOCALTIMESTAMP devuelve la fecha y la hora actuales de la zona horaria de la

sesión. La diferencia entre LOCALTIMESTAMP y CURRENT_TIMESTAMP es que

LOCALTIMESTAMP devuelve un valor TIMESTAMP, mientras que CURRENT_TIMESTAMPdevuelve un valor TIMESTAMP WITH TIME ZONE.

Estas funciones son sensibles a NLS, es decir, los resultados estarán en los formatos de

fecha/hora y de calendario NLS actuales.

Introducción a Oracle 10g: SQL Fundamentals II

164

Page 165: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 165/354

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

CURRENT_DATE

Muestre la fecha y la hora actuales de la zona horariade la sesión.

ALTER SESSION SET TIME_ZONE = '-8:0';

SELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL;

ALTER SESSION SET TIME_ZONE = '-5:0';

SELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL;

ALTER SESSION 

SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';

CURRENT_DATE

La función CURRENT_DATE devuelve la fecha actual de la zona horaria de la sesión. El valor 

de retorno es una fecha del calendario gregoriano.

Los ejemplos de la diapositiva ilustran que CURRENT_DATE es sensible a la zona horaria de

la sesión. En el primer ejemplo, la sesión se modifica para definir el parámetro TIME_ZONEen –5:0. El parámetro TIME_ZONE especifica el desplazamiento de zona horaria local por 

defecto para la sesión SQL actual. TIME_ZONE es sólo un parámetro de la sesión, y no un

parámetro de inicialización. El parámetroTIME_ZONE

se define del modo siguiente:

TIME_ZONE = '[+ | -] hh:mm'

La máscara de formato ([+ | -] hh:mm ) indica las horas y los minutos antes o después

de UTC (Hora Universal Coordinada, lo que antes se conocía como Hora del Meridiano

de Greenwich).

Observe en la salida que el valor de CURRENT_DATE cambia cuando el valor del parámetro

TIME_ZONE se cambia a –8:0 en el segundo ejemplo.

Nota: El comando ALTER SESSION define el formato de fecha de la sesión en

'DD-MON-YYYY HH24:MI:SS' que es día del mes (1-31)-nombre abreviado del mes-año con 4 dígitos hora del día (0-23):minuto (0-59):segundo (0-59).

Introducción a Oracle 10g: SQL Fundamentals II

165

Page 166: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 166/354

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

CURRENT_TIMESTAMP

Muestre la fecha y la hora fraccional actuales de lazona horaria de la sesión.

ALTER SESSION SET TIME_ZONE = '-8:0';

SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP

FROM DUAL;

ALTER SESSION SET TIME_ZONE = '-5:0';

SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP

FROM DUAL;

CURRENT_TIMESTAMP

La función CURRENT_TIMESTAMP devuelve la fecha y la hora actuales de la zona horaria

de la sesión, como valor del tipo de datos TIMESTAMP WITH TIME ZONE. El

desplazamiento de zona horaria refleja la hora local actual de la sesión SQL. La sintaxis de la

función CURRENT_TIMESTAMP es:

CURRENT_TIMESTAMP (precision)

donde precision es un argumento opcional que especifica la precisión en fracciones de

segundo del valor horario devuelto. Si omite la precisión, el valor por defecto es 6.El ejemplo de la diapositiva ilustra que CURRENT_TIMESTAMP es sensible a la zona horaria

de la sesión. En el primer ejemplo, la sesión se modifica para definir el parámetro

TIME_ZONE en –5:0. Observe en la salida que el valor de CURRENT_TIMESTAMP cambia

cuando el valor del parámetro TIME_ZONE se cambia a –8:0 en el segundo ejemplo.

Introducción a Oracle 10g: SQL Fundamentals II

166

Page 167: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 167/354

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

LOCALTIMESTAMP

• Muestre la fecha y la hora actuales en la zona horariade la sesión en un valor del tipo de datos TIMESTAMP.

• LOCALTIMESTAMP devuelve un valor TIMESTAMP,mientras que CURRENT_TIMESTAMP devuelve un valor TIMESTAMP WITH TIME ZONE.

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;

LOCALTIMESTAMP

La función LOCALTIMESTAMP devuelve la fecha y la hora actuales en la zona horaria de la

sesión. LOCALTIMESTAMP devuelve un valor TIMESTAMP. La sintaxis de la función

LOCAL_TIMESTAMP es:

LOCAL_TIMESTAMP (TIMESTAMP_precision)

donde TIMESTAMP precision es un argumento opcional que especifica la precisión en

fracciones de segundo del valor de TIMESTAMP devuelto.

Los ejemplos de la diapositiva ilustran la diferencia entre LOCALTIMESTAMP yCURRENT_TIMESTAMP. Observe que LOCALTIMESTAMP no muestra el valor de la zona

horaria, mientras que CURRENT_TIMESTAMP sí.

Introducción a Oracle 10g: SQL Fundamentals II

167

Page 168: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 168/354

Page 169: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 169/354

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

Tipo de Datos TIMESTAMP

• El tipo de datos TIMESTAMP es una extensión deltipo de datos DATE.

• Almacena el año, el mes y el día del tipo de datosDATE, más el valor de horas, minutos y segundos,así como el valor de fracciones de segundo.

• Las variaciones en TIMESTAMP son:– TIMESTAMP

[(fractional_seconds_precision)]_– TIMESTAMP

[(fractional_seconds_precision)]_WITH TIME ZONE

– TIMESTAMP

[(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 yTIMEZONE_MINUTE, y fracciones de segundo.

Nota: La precisión de fracciones de segundo especifica el número de dígitos de la parte

fraccional del campo de fecha/hora SECOND y puede ser un número del rango de 0 a 9. El

valor por defecto es 6.

Introducción a Oracle 10g: SQL Fundamentals II

169

Page 170: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 170/354

Page 171: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 171/354

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

Campos TIMESTAMP

TIMEZONE_MINUTE

De –12 a 14TIMEZONE_HOUR

De 00 a 59.9(N) donde 9(N) es la precisiónSECONDDe 00 a 59MINUTE

De 00 a 23HOUR

De 01 a 31DAY

De 01 a 12MONTH

De –4712 a 9999 (excluido el año 0)YEAR

Valores VálidosCampo de Fecha/Hora

De 00 a 59

Campos TIMESTAMP

Cada tipo de datos de fecha/hora está compuesto por varios de estos campos. Las fechas/horas

son asignables y comparables mutuamente sólo si tienen los mismos campos de fecha/hora.

Introducción a Oracle 10g: SQL Fundamentals II

171

Page 172: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 172/354

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

Diferencia entre DATE y TIMESTAMP

-- when hire_date isof type DATE

SELECT hire_date

FROM emp5;

ALTER TABLE emp5MODIFY hire_date TIMESTAMP;

SELECT hire_date

FROM emp5;

BA

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 WITHTIME ZONE a menos que la columna esté vacía.

Puede especificar la precisión en fracciones de segundo para el registro de hora. Si no se

especifica ninguna, como en el ejemplo anterior, toma el valor por defecto de 6.

Por ejemplo, la siguiente sentencia define la precisión de fracciones de segundo en 7:

ALTER TABLE emp5MODIFY 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 también contiene información adicional como horas,

minutos, segundos, a.m. y p.m. Para obtener la fecha en este formato, puede aplicar una

máscara de formato o una función al valor de fecha.

Introducción a Oracle 10g: SQL Fundamentals II

172

Page 173: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 173/354

Page 174: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 174/354

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

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;

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 realiceun pedido por Web (web_order). El registro de hora y la zona horaria del usuario querealiza el pedido se inserta basándose en el valor de CURRENT_DATE. De este modo, una

compañía basada en Web garantiza el envío y puede estimar su tiempo de entrega basándoseen la zona horaria de la persona que realiza el pedido.

Introducción a Oracle 10g: SQL Fundamentals II

174

Page 175: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 175/354

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

TIMESTAMP WITH LOCAL TIMEZONE

• TIMESTAMP WITH LOCAL TIME ZONE es otravariante de TIMESTAMP que incluye eldesplazamiento de la zona horaria en su valor.

• Los datos almacenados en la base de datos senormalizan en la zona horaria de la misma.

• El desplazamiento de zona horaria no se almacenacomo parte de los datos de columna.

• La base de datos Oracle devuelve los datos en lazona horaria de la sesión local del usuario.

• El tipo de datos TIMESTAMP WITH LOCAL TIME

ZONE se especifica así:

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 ningún literal para TIMESTAMP WITH LOCAL TIME ZONE.

Introducción a Oracle 10g: SQL Fundamentals II

175

Page 176: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 176/354

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

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;

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 días desde el valor CURRENT_TIMESTAMP cada vez que se realice un pedido. La

salida de la tabla DATE_TAB muestra que los datos se almacenan sin el offset de zona

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.

Introducción a Oracle 10g: SQL Fundamentals II

176

Page 177: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 177/354

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

Tipos de Datos INTERVAL

• Los tipos de datos INTERVAL se utilizan para almacenar 

la diferencia entre dos valores de fecha/hora.

• Hay dos clases de intervalos:

– Año-mes

– Día-hora

• La precisión del intervalo:

Es el subjuego real de campos que componen unintervalo

– Se especifica en el cualificador de intervalo

DAY, HOUR, MINUTE, SECOND confracciones de segundo

INTERVAL DAY TO SECOND

YEAR, MONTHINTERVAL YEAR TO MONTH

CamposTipo de Datos

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 año-mes e intervalos día-hora. Un

intervalo año-mes se compone de un subjuego contiguo de campos YEAR y MONTH, mientras

que un intervalo día-hora se compone de un subjuego contiguo de campos DAY, HOUR,

MINUTE y SECOND. El subjuego real de campos que componen un intervalo se denomina

precisión del intervalo y se especifica en el cualificador de intervalo. Como el número de días

de un año depende del calendario, el intervalo año-mes es dependiente de NLS, mientras que

el intervalo día-hora es independiente de NLS.

El cualificador de intervalo también puede especificar la precisión del campo inicial, que es el

número de dígitos del campo inicial o único (que en caso del campo final es SECOND)

también puede especificar la precisión de fracciones de segundo, que es el número de dígitos

de la parte fraccional del valor SECOND. Si no se especifica, el valor por defecto para la

precisión de campo inicial es de 2 dígitos y el valor por defecto para la precisión de fracciones

de segundo es de 6 dígitos

Introducción a Oracle 10g: SQL Fundamentals II

177

Page 178: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 178/354

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

Tipos de Datos INTERVAL (continuación)

INTERVAL YEAR (year_precision) TO MONTH

Este tipo de datos almacena un período de tiempo en años y meses, mientras que

year_precision es el número de dígitos del campo de fecha/hora YEAR. Los valores

aceptados son de 0 a 9. El valor por defecto es 6.

INTERVAL DAY (day_precision) TO SECOND(fractional_seconds_precision)

Este tipo de datos almacena un período de tiempo en días, horas, minutos y segundos, donde

day_precision es el número máximo de dígitos del campo de fecha/hora DAY (los

valores aceptados son de 0 a 9; el valor por defecto es 2) y fractional_seconds_precision es el número de dígitos de la parte fraccional del campo SECOND. Los valores

aceptados son de 0 a 9. El valor por defecto es 6.

Introducción a Oracle 10g: SQL Fundamentals II

178

Page 179: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 179/354

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

Campos INTERVAL

De 00 a 59.9(N) donde 9(N) es la precisiónSECOND

De 00 a 59MINUTE

HOUR

DAY

MONTH

YEAR

Campo INTERVAL

De 00 a 23

Cualquier entero positivo o negativo

De 00 a 11

Cualquier entero positivo o negativo

Valores Válidos para el Intervalo

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

precisión del elemento.

Los intervalos año-mes son asignables y comparables mutuamente sólo con otros intervalos

año-mes y los intervalos día-hora son asignables y comparables mutuamente sólo con otrosintervalos día-hora.

Introducción a Oracle 10g: SQL Fundamentals II

179

Page 180: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 180/354

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

Tipo de Datos INTERVAL YEAR TO MONTH

INTERVAL YEAR TO MONTH almacena un período detiempo mediante los campos de fecha/hora YEAR y MONTH.

• Por ejemplo:

INTERVAL YEAR [(year_precision)] TO MONTH

'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

Indicates an interval of 3 months

Tipo de Datos INTERVAL YEAR TO MONTH

INTERVAL YEAR TO MONTH almacena un período de tiempo mediante los campos de

fecha/hora YEAR y MONTH. Especifique INTERVAL YEAR TO MONTH del siguiente modo:

INTERVAL YEAR [(year_precision)] TO MONTH

donde year_precision es el número de dígitos del campo de fecha/hora YEAR. El valor 

por defecto de year_precision es 2.

Restricción: El campo inicial debe ser más significativo que el campo final. Por ejemplo,

INTERVAL '0-1' MONTH TO YEAR no es válido.

El siguiente literal INTERVAL YEAR TO MONTH indica un intervalo de 123 años

y 3 meses:

• INTERVAL '123-3' YEAR(3) TO MONTH• INTERVAL '123' YEAR(3) indica un intervalo de 123 años y 0 meses.

• INTERVAL '3' MONTH indica un intervalo de 3 meses.

Introducción a Oracle 10g: SQL Fundamentals II

180

Page 181: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 181/354

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

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;

Tipo de Datos INTERVAL YEAR TO MONTH (continuación)

INTERVAL YEAR TO MONTH almacena un período de tiempo mediante los campos de

fecha/hora YEAR y MONTH. Especifique INTERVAL YEAR TO MONTH del siguiente modo:

INTERVAL YEAR [(year_precision)] TO MONTH

donde year_precision es el número de dígitos del campo de fecha/hora YEAR. El valor 

por defecto de year_precision es 2.

Restricción: El campo inicial debe ser más significativo que el campo final. Por ejemplo,

INTERVAL '0-1' MONTH TO YEAR no es válido.

La base de datos Oracle soporta dos tipos de datos de intervalo: INTERVAL YEAR TOMONTH 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 años 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 añomediante un (-)

Introducción a Oracle 10g: SQL Fundamentals II

181

Page 182: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 182/354

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

Tipo de Datos INTERVAL DAY TO SECOND

INTERVAL DAY TO SECOND

(fractional_seconds_precision) almacena unperíodo de tiempo en días, horas, minutos y segundos.

• Por ejemplo:

INTERVAL DAY[(day_precision)] TO Second

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

Indicates an interval of 6 days and 0 hours, 0

minutes and 0 seconds

Tipo de Datos INTERVAL DAY TO SECOND

INTERVAL DAY (day_precision) TO SECOND (fractional_seconds_precision) almacena un período de tiempo en días, horas, minutos y segundos, donde

day_precision es el número máximo de dígitos del campo de fecha/hora DAY (los

valores aceptados son de 0 a 9; el valor por defecto es 2) y

fractional_seconds_precision es el número de dígitos de la parte fraccional del

campo SECOND. Los valores aceptados son de 0 a 9. El valor por defecto es 6.

En el ejemplo anterior, 6 representa el número de días y 03:30:15 indica los valores para

horas, minutos y segundos.

Introducción a Oracle 10g: SQL Fundamentals II

182

Page 183: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 183/354

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

Tipo de DatosINTERVAL 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;

Tipo de Datos INTERVAL DAY TO SECOND: Ejemplo

En el ejemplo anterior, está creando la tabla de prácticas con una columna test_time del

tipo de datos INTERVAL DAY TO SECOND. Inserte en ella a continuación el valor 

“90 00:00:00” para indicar 90 días, 0 horas, 0 minutos y 0 segundos e INTERVAL'6 03:30:16' DAY TO SECOND. La sentencia SELECT ilustra cómo se muestran estos

datos en la base de datos.

Introducción a Oracle 10g: SQL Fundamentals II

183

Page 184: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 184/354

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

EXTRACT

• Muestre el componente YEAR de SYSDATE.

• Muestre el componente MONTH de HIRE_DATE paralos empleados cuyo MANAGER_ID es 100.

SELECT EXTRACT (YEAR FROM SYSDATE) FROM DUAL;

SELECT last_name, hire_date,

EXTRACT (MONTH FROM HIRE_DATE)FROM employees

WHERE manager_id = 100;

EXTRACT

La expresión EXTRACT extrae y devuelve el valor de un campo de fecha/hora especificado de

una expresión de valor de fecha/hora o intervalo. Puede extraer cualquiera de los

componentes mencionados en la siguiente sintaxis mediante la función EXTRACT. La sintaxis

de la función 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 extracción de una fecha/hora con un valor de zona horaria, el valor devuelto está

en UTC.

En el primer ejemplo de la diapositiva, la función EXTRACT se utiliza para extraer el año

(YEAR) de SYSDATE. En el segundo ejemplo de la diapositiva, la función EXTRACT se

utiliza para extraer el mes (MONTH) de la columna HIRE_DATE de la tabla EMPLOYEES,

para los empleados que están bajo las órdenes del supervisor cuyo EMPLOYEE_ID es 100.

Introducción a Oracle 10g: SQL Fundamentals II

184

Page 185: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 185/354

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

• Muestre el offset de zona horaria para la zona horaria'US/Eastern'.

• Muestre el offset de zona horaria para la zona horaria'Canada/Yukon'.

• Muestre el offset de zona horaria para la zona horaria'Europe/London'.

TZ_OFFSET

SELECT TZ_OFFSET('US/Eastern') FROM DUAL;

SELECT TZ_OFFSET('Canada/Yukon') FROM DUAL;

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

TZ_OFFSET

La función TZ_OFFSET devuelve el offset de zona horaria correspondiente al valor 

introducido. El valor de retorno es dependiente de la fecha en la que se ejecutó la sentencia.Por ejemplo, si la función TZ_OFFSET devuelve el valor –08:00, indica que en la zona

horaria en la que se ejecutó el comando son ocho horas menos que en UTC. Puede introducir 

un nombre válido de zona horaria, un offset de zona horaria desde UTC (que simplemente sedevuelve a sí mismo) o las palabras clave SESSIONTIMEZONE o DBTIMEZONE. La sintaxis

de la función 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 compañía, Mr. Fold, desea realizar una conferencia

telefónica con el vicepresidente de operaciones canadienses y el vicepresidente de

operaciones europeas, que están en las zonas horarias Canada/Yukon y Europe/London,

respectivamente. Mr. Fold quiere conocer la hora en cada uno de estos lugares para asegurarse

de que los supervisores senior podrán asistir a la reunión. Para ayudarle, su secretario, Mr.

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 más que en UTC.

Introducción a Oracle 10g: SQL Fundamentals II

185

Page 186: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 186/354

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

TZ_OFFSET (continuación)

Para obtener un listado de valores de nombres de zona horaria válidos, puede consultar la

vista de rendimiento dinámica V$TIMEZONE_NAMES.

SELECT * FROM V$TIMEZONE_NAMES;

Introducción a Oracle 10g: SQL Fundamentals II

186

Page 187: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 187/354

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

Conversión de TIMESTAMP mediante FROM_TZ

• Muestre el valor TIMESTAMP '2000-03-28 08:00:00'

como valor TIMESTAMP WITH TIME ZONE.

• Muestre el valor TIMESTAMP '2000-03-28 08:00:00'

como valor TIMESTAMP WITH TIME ZONE para laregión de zona horaria 'Australia/North'.

SELECT FROM_TZ(TIMESTAMP

'2000-03-28 08:00:00','3:00')

FROM DUAL;

SELECT FROM_TZ(TIMESTAMP

'2000-03-28 08:00:00', 'Australia/North')

FROM DUAL;

Conversión de TIMESTAMP mediante FROM_TZ

La función FROM_TZ convierte un valor TIMESTAMP a un valor TIMESTAMP WITHTIME ZONE.

La sintaxis de la función 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

expresión de carácter que devuelve una cadena en TZR (región de zona horaria) con formato

TZD opcional. TZD es una cadena de zona horaria abreviada con información de horario deverano. TZR representa la región de zona horaria en cadenas de entrada de fecha/hora.

Algunos ejemplos son 'Australia/North', 'PST' para la hora oficial del

Pacífico/EE.UU. y 'PDT' para la hora en horario de verano del Pacífico/EE.UU., etc. Para

ver un listado de valores válidos para los elementos con formato TZR y TZD, consulte la vista

de rendimiento dinámica V$TIMEZONE_NAMES.

El ejemplo de la diapositiva convierte un valor TIMESTAMP a TIMESTAMP WITHTIME ZONE.

Introducción a Oracle 10g: SQL Fundamentals II

187

Page 188: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 188/354

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

SELECT

TO_TIMESTAMP_TZ('1999-12-01 11:00:00 -8:00',

'YYYY-MM-DD HH:MI:SS TZH:TZM')

FROM DUAL;

Conversión a TIMESTAMP medianteTO_TIMESTAMP y TO_TIMESTAMP_TZ

• Muestre la cadena de caracteres '2000-12-01 11:00:00'

como un valor TIMESTAMP.

• Muestre la cadena de caracteres '1999-12-01 11:00:00 -

8:00' como un valor TIMESTAMP WITH TIME ZONE.

SELECT TO_TIMESTAMP ('2000-12-01 11:00:00',

'YYYY-MM-DD HH:MI:SS')

FROM DUAL;

Conversión a TIMESTAMP mediante TO_TIMESTAMP y TO_TIMESTAMP_TZ

La función TO_TIMESTAMP convierte una cadena de tipo de datos CHAR, VARCHAR2,NCHAR o NVARCHAR2 a un valor del tipo de datos TIMESTAMP. La sintaxis de la funciónTO_TIMESTAMP es:

TO_TIMESTAMP (char,[fmt],['nlsparam'])

El parámetro fmt opcional especifica el formato de char si se omite. La cadena debe estar en el formato del tipo de datos TIMESTAMP. El parámetro opcional nlsparam especifica el

idioma en que se devolverán los nombres y las abreviaturas de mes y de día. Este argumento

puede tener esta forma:'NLS_DATE_LANGUAGE = language'

Si omite nlsparams, esta función utiliza el idioma de fecha por defecto para la sesión. Elejemplo de la diapositiva convierte una cadena de caracteres a un valor TIMESTAMP.

La función 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. Lasintaxis de la función TO_TIMESTAMP_TZ es:

TO_TIMESTAMP_TZ (char,[fmt],['nlsparam'])

El parámetro opcional fmt especifica el formato de char. Si se omite, una cadena debeestar en el formato por defecto del tipo de datos TIMESTAMP WITH TIME ZONE. Elejemplo de la diapositiva convierte una cadena de caracteres a un valor 

TIMESTAMP WITHTIME ZONE.

Introducción a Oracle 10g: SQL Fundamentals II

188

Page 189: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 189/354

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

Conversión de Intervalo de Tiempo conTO_YMINTERVAL

Muestre una fecha que sea posterior en un año y dosmeses a la fecha de contratación de los empleados quetrabajen 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;

Conversión de Intervalo de Tiempo con TO_YMINTERVAL

La función TO_YMINTERVAL convierte una cadena de tipo de datos CHAR, VARCHAR2,NCHAR o NVARCHAR2 a un tipo de datos INTERVAL YEAR TO MONTH. El tipo de datosINTERVAL YEAR TO MONTH almacena un período de tiempo mediante los campos defecha/hora YEAR y MONTH: El formato de INTERVAL YEAR TO MONTH es el siguiente:

INTERVAL YEAR [(year_precision)] TO MONTHdonde year_precision es el número de dígitos del campo de fecha/hora YEAR. El valor por defecto de year_precision es 2.La sintaxis de la función 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 año y dos meses a la fechade contratación del empleado que trabaja en el departamento 20 de la tabla EMPLOYEES.

También se puede realizar un cálculo inverso mediante la función TO_YMINTERVAL.Por ejemplo:

SELECT hire_date, hire_date + TO_YMINTERVAL('-02-04') ASHIRE_DATE_YMINTERVAL

FROM EMPLOYEES WHERE department_id = 20;Observe que la cadena de caracteres transferida a la función TO_YMINTERVAL tieneun valor negativo. El ejemplo devuelve una fecha anterior en dos años y cuatro meses ala fecha de contratación de los empleados que trabajan en el departamento 20 de latabla EMPLOYEES.

Introducción a Oracle 10g: SQL Fundamentals II

189

Page 190: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 190/354

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

Uso de TO_DSINTERVAL: Ejemplo

TO_DSINTERVAL: Convierte una cadena de caracteresa 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;

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 días y 10 horas a la fechade contratación.

TO_YMINTERVAL

La función 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 año y dos meses a la fechade contratación.SELECT hire_date, hire_date + TO_YMINTERVAL('01-02') ytm FROM employees;

HIRE_DATE YTM--------- ---------17-JUN-87 17-AUG-8821-SEP-89 21-NOV-9013-JAN-93 13-MAR-9403-JAN-90 03-MAR-91

21-MAY-91 21-JUL-92…

Introducción a Oracle 10g: SQL Fundamentals II

190

Page 191: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 191/354

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

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. noson válidos.

• Último domingo de octubre– La hora pasa de 02:00:00 a.m. a 01:00:01 a.m.

– Los valores entre 01:00:01 a.m. y 02:00:00 a.m. sonambiguos porque suceden dos veces.

DST (Horario de Verano)

La mayoría de las naciones occidentales adelanta el reloj una hora en los meses de verano.

Este período se denomina horario de verano. El horario de verano se extiende desde el primer 

domingo de abril al último domingo de octubre en la mayor parte de Estados Unidos, México

y Canadá. Las naciones de la Unión Europea también utilizan el horario de verano. El horario

de verano de Europa comienza una semana antes que en Norteamérica, pero termina a la vez.

La base de datos Oracle determina automáticamente, para cualquier región de zona horaria, si

el horario de verano está en vigor y devuelve los valores de hora local de la manera

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 región determinada en todos los casos,

excepto en la hora del cambio. La hora del cambio se produce durante el período en que el

horario de verano entra en vigor o deja de estar en vigor. Por ejemplo, en la región 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.

Introducción a Oracle 10g: SQL Fundamentals II

191

Page 192: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 192/354

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

DST (Horario de Verano) (continuación)

ERROR_ON_OVERLAP_TIME

ERROR_ON_OVERLAP_TIME es un parámetro de sesión para notificar al sistema que emita

un error cuando encuentre una fecha/hora que se produzca en el período superpuesto y no se

ha especificado ninguna abreviatura de zona para distinguir el período.

Por ejemplo, si el horario de verano termina el 31 de octubre, a las 02:00:01 a.m., los períodos

superpuestos serían:

• De 10/31/2004 01:00:01 a.m. a 10/31/2004 02:00:00 a.m. (EDT)

• De 10/31/2004 01:00:01 a.m. a 10/31/2004 02:00:00 a.m. (EST)

Si introduce una cadena de fecha/hora que se produce en uno de estos dos períodos, debe

especificar la abreviatura de zona horaria (por ejemplo, EDT o EST) en la cadena de entrada

para que el sistema determine el período. Sin esta abreviatura de zona horaria, el sistema hará

lo siguiente:

Si el parámetro ERROR_ON_OVERLAP_TIME es FALSE, asume que la hora de entrada es la

hora oficial (por ejemplo, EST). De lo contrario, se produce un error.

Introducción a Oracle 10g: SQL Fundamentals II

192

Page 193: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 193/354

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

Resumen

En esta lección, ha aprendido a utilizar estasfunciones:• TZ_OFFSET

• FROM_TZ

• TO_TIMESTAMP

• TO_TIMESTAMP_TZ

• TO_YMINTERVAL

• CURRENT_DATE

• CURRENT_TIMESTAMP

• LOCALTIMESTAMP

• DBTIMEZONE

• SESSIONTIMEZONE

• EXTRACT

Resumen

Esta lección ha tratado algunas de las funciones de fecha/hora disponibles en la base de

datos Oracle.

Introducción a Oracle 10g: SQL Fundamentals II

193

Page 194: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 194/354

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

Práctica 5: Visión General

Esta práctica cubre el uso de las funciones defecha/hora.

Práctica 5: Visión General

En esta práctica, mostrará los offsets de zona horaria, CURRENT_DATE, CURRENT_TIMESTAMP y LOCALTIMESTAMP. También definirá zonas horarias y utilizará la función

EXTRACT.

Introducción a Oracle 10g: SQL Fundamentals II

194

Page 195: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 195/354

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

Práctica 5

1. Modifique la sesión para definir NLS_DATE_FORMAT en DD-MON-YYYYHH24:MI:SS.

2. a. Escriba consultas para mostrar los offsets de zona horaria (TZ_OFFSET) para las

siguientes zonas horarias.

- US/Pacific-New

- Singapore

- Egypt 

b. Modifique la sesión para definir el valor del parámetro TIME_ZONE en el offset

de zona horaria US/Pacific-New.

c. Muestre los valores de CURRENT_DATE, CURRENT_TIMESTAMP y

LOCALTIMESTAMP para esta sesión.

d. Modifique la sesión para definir el valor del parámetro TIME_ZONE en el offset

de zona horaria Singapore.

e. Muestre los valores de CURRENT_DATE, CURRENT_TIMESTAMP yLOCALTIMESTAMP para esta sesión.

Nota: La salida podría ser diferente, según la fecha en que se ejecute

el comando.

Nota: Observe en la práctica anterior que CURRENT_DATE,

CURRENT_TIMESTAMP y LOCALTIMESTAMP son todos sensibles a la zona

horaria de la sesión.

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

SESSIONTIMEZONE.

Introducción a Oracle 10g: SQL Fundamentals II

195

Page 196: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 196/354

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

Práctica 5 (continuación)

4. Escriba una consulta para extraer el valor de YEAR de la columna HIRE_DATE de la

tabla EMPLOYEES para los empleados que trabajan en el departamento 80.

5. Modifique la sesión para definir NLS_DATE_FORMAT en DD-MON-YYYY.

Introducción a Oracle 10g: SQL Fundamentals II

196

Page 197: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 197/354

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

Práctica 5 (continuación)

6. Examine y ejecute el archivo de comandos lab05_06.sql para crear la tabla

SAMPLE_DATES y rellenarla.

a. Seleccione en la tabla y vea los datos.

b. Modifique el tipo de datos de la columna DATE_COL y cámbielo a TIMESTAMP.

Seleccione en la tabla para ver los datos.

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

TIMESTAMP WITH TIME ZONE. ¿Qué sucede?

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

estado de revisión. Si el año de contratación fue 2000, muestre Needs Review parael estado de revisión; de lo contrario, muestre not this year!. Asigne a la

columna de estado de revisión el nombre Review. Ordene los resultados por la

columna HIRE_DATE.

Indicación: Utilice una expresión CASE con la función EXTRACT para calcular el

estado de revisión.

Introducción a Oracle 10g: SQL Fundamentals II

197

Page 198: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 198/354

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

Práctica 5 (continuación)

8. Cree una consulta para imprimir los apellidos y el número de años de servicio para

cada empleado. Si el empleado lleva contratado cinco años o más, imprima 5 yearsof service. Si el empleado lleva contratado 10 años o más, imprima 10 yearsof service. Si el empleado lleva contratado 15 años o más, imprima 15 yearsof service. Si no se cumple ninguna de estas condiciones, imprima maybenext year!. Ordene los resultados por la columna HIRE_DATE. Utilice la

tabla EMPLOYEES.

Indicación: Utilice TO_YMINTERVAL y expresiones CASE.

Introducción a Oracle 10g: SQL Fundamentals II

198

Page 199: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 199/354

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

Introducción a Oracle 10g: SQL Fundamentals II

199

Page 200: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 200/354

Recuperación de Datos mediante Subconsultas

Introducción a Oracle 10g: SQL Fundamentals II

200

Page 201: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 201/354

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

Objetivos

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

• Escribir una subconsulta de varias columnas

• Utilizar subconsultas escalares en SQL

• Solucionar problemas con subconsultascorrelacionadas

• Actualizar y suprimir filas mediante subconsultascorrelacionadas

• Utilizar los operadores EXISTS y NOT EXISTS

• Utilizar la cláusula WITH

Objetivos

En esta lección, aprenderá a escribir subconsultas de varias columnas, así como subconsultasen la cláusula FROM de una sentencia SELECT. También aprenderá a solucionar problemasmediante subconsultas escalares correlacionadas y la cláusula WITH.

Introducción a Oracle 10g: SQL Fundamentals II

201

Page 202: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 202/354

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

Subconsultas de Varias Columnas

Consulta principalWHERE (MANAGER_ID, DEPARTMENT_ID) IN

Subconsulta100 90

102 60124 50

Cada fila de la consulta principal se compara con losvalores de una subconsulta de varias filas y variascolumnas.

Subconsultas de Varias Columnas

Hasta ahora, ha escrito subconsultas de una sola fila y subconsultas de varias filas en las quesólo se devuelve una columna mediante la sentencia interna SELECT y esto se utiliza paraevaluar la expresión de la sentencia SELECT principal. Si desea comparar dos o máscolumnas, debe escribir una cláusula WHERE compuesta mediante operadores lógicos.Mediante subconsultas de varias columnas, puede combinar condiciones WHERE duplicadasen una sola cláusula WHERE.

Sintaxis

SELECT column, column, ...

FROM table

WHERE (column, column, ...) IN

(SELECT column, column, ...

FROM table

WHERE condition);

El gráfico de la diapositiva ilustra que los valores de MANAGER_ID y DEPARTMENT_ID dela consulta principal se están comparando con los valores MANAGER_ID y DEPARTMENT_ID recuperados por la subconsulta. Como el número de columnas que se están comparando essuperior a uno, el ejemplo se califica como subconsulta de varias columnas.

Introducción a Oracle 10g: SQL Fundamentals II

202

Page 203: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 203/354

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

Comparaciones de Columnas

Las comparaciones de columnas en una subconsultade varias columnas pueden ser:

• Comparaciones entre pares

• Comparaciones entre no pares

Comparaciones entre Pares y entre No Pares

Las comparaciones de columnas en una subconsulta de varias columnas pueden ser entrepares y entre no pares.

En el ejemplo de la siguiente diapositiva, se ejecuta una comparación entre pares en lacláusula WHERE. Cada fila candidata de la sentencia SELECT debe tener las dos mismascolumnas MANAGER_ID y DEPARTMENT_ID que los empleados con EMPLOYEE_ID 199ó 174.

Una subconsulta de varias columnas también puede ser una comparación entre no pares. Enuna comparación entre no pares, cada columna de la cláusula WHERE de la sentencia SELECTprincipal se compara individualmente con varios valores recuperados por la sentenciaSELECT interna. Las columnas individuales se pueden corresponder con cualquier valor recuperado por la sentencia SELECT interna. Pero colectivamente, se deben satisfacer todaslas condiciones múltiples de la sentencia SELECT principal para que se muestre la fila. Elejemplo de la página siguiente ilustra una comparación entre pares.

Introducción a Oracle 10g: SQL Fundamentals II

203

Page 204: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 204/354

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

Subconsulta de Comparación entre Pares

Muestre los detalles de los empleados que están a lasórdenes del mismo supervisor y  trabajan en el mismodepartamento 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);

Subconsulta de Comparación entre Pares

El ejemplo de la diapositiva muestra una subconsulta de varias columnas, ya que lasubconsulta devuelve más 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 valoresde la columna MANAGER_ID y la columna DEPARTMENT_ID para los empleados conEMPLOYEE_ID 199 ó 174.

Primero, se ejecuta la subconsulta para recuperar los valores de MANAGER_ID yDEPARTMENT_ID para los empleados con EMPLOYEE_ID 199 ó 174. Estos valores secomparan con la columna MANAGER_ID y la columna DEPARTMENT_ID de cada fila de latabla EMPLOYEES. Si los valores se corresponden, se muestra la fila. En la salida, no semostrarán los registros de los empleados con EMPLOYEE_ID 199 ó 174. Ésta es la salida dela consulta de la diapositiva:

Introducción a Oracle 10g: SQL Fundamentals II

204

Page 205: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 205/354

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

Subconsulta de Comparación entre No Pares

Muestre los detalles de los empleados que están a lasórdenes del mismo supervisor que los empleados conEMPLOYEE_ID 174 ó 199 y que trabajan en el mismodepartamento que los empleados con EMPLOYEE_ID

174 ó 199.SELECT employee_id, manager_id, department_id

FROM employees

WHERE manager_id IN 

(SELECT manager_id

FROM employees

WHERE employee_id IN (174,199))

AND department_id IN 

(SELECT department_id

FROM employeesWHERE employee_id IN (174,199))

AND employee_id NOT IN(174,199);

Subconsulta de Comparación entre No ParesEl ejemplo muestra una comparación entre no pares de las columnas. Muestra los valores deEMPLOYEE_ID, MANAGER_ID y DEPARTMENT_ID de cualquier empleado cuyoidentificador de supervisor se corresponda con los identificadores de supervisor de losempleados cuyos identificadores sean 174 ó 199 y los valores de DEPARTMENT_ID secorrespondan con los identificadores de departamento cuyo identificador de empleado sea174 ó 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 lasegunda subconsulta para recuperar los valores de DEPARTMENT_ID para los empleados conel valor de EMPLOYEE_ID 199 ó 174. Los valores recuperados de las columnasMANAGER_ID y DEPARTMENT_ID se comparan con las columnas MANAGER_ID yDEPARTMENT_ID de cada fila de la tabla EMPLOYEES. Si la columna MANAGER_ID de lafila de la tabla EMPLOYEES se corresponde con cualquiera de los valores de MANAGER_IDrecuperados por la subconsulta interna y si la columna DEPARTMENT_ID de la fila de latabla EMPLOYEES se corresponde con cualquiera de los valores de DEPARTMENT_IDrecuperados por la segunda subconsulta, se muestra el registro. Ésta es la salida de la consultade la diapositiva:

Introducción a Oracle 10g: SQL Fundamentals II

205

Page 206: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 206/354

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

Expresiones de Subconsultas Escalares

• Una expresión de subconsulta escalar es unasubconsulta que devuelve exactamente un valor de columna de una fila.

• Las subconsultas escalares se pueden utilizar en:– Parte de expresión y condición de DECODE y CASE

– Todas las cláusulas de SELECT excepto GROUP BY

Subconsultas Escalares en SQLUna subconsulta que devuelve exactamente un valor de columna de una fila se conocetambién como subconsulta escalar. Las subconsultas de varias columnas que se escriben paracomparar dos o más columnas, mediante una cláusula WHERE compuesta y operadoreslógicos, no se califican como subconsultas escalares.El valor de la expresión de subconsulta escalar es el valor del elemento de lista de selecciónde la subconsulta. Si la subconsulta devuelve 0 filas, el valor de la expresión de subconsultaescalar es NULL. Si la subconsulta devuelve más de una fila, Oracle Server devuelve un error.

Oracle Server siempre ha soportado el uso de una subconsulta escalar en una sentenciaSELECT. Puede utilizar subconsultas escalares en:• La parte de expresión y condición de DECODE y CASE• Todas las cláusulas de SELECT excepto GROUP BY• La cláusula SET y la cláusula WHERE de una sentencia UPDATE

Sin embargo, las subconsultas escalares no son expresiones válidas en los siguientes casos:• Como valores por defecto para columnas y expresiones de comprobación aleatoria para

agrupamientos• En la cláusula RETURNING de sentencias DML• Como base de un índice basado en funciones• En cláusulas GROUP BY, restricciones CHECK, condiciones WHEN

• En cláusulasCONNECT BY

• En sentencias que no estén relacionadas con consultas como, por ejemplo, CREATEPROFILE

Introducción a Oracle 10g: SQL Fundamentals II

206

Page 207: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 207/354

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

Subconsultas Escalares: Ejemplos

• Subconsultas escalares en expresiones CASE

• Subconsultas escalares en la cláusula ORDER BY

SELECT employee_id, last_name,

(CASE

WHEN department_id =

(SELECT department_id

FROM departments

WHERE location_id = 1800)

THEN 'Canada' ELSE 'USA' END) location

FROM employees;

SELECT employee_id, last_name

FROM employees e

ORDER BY (SELECT department_name

FROM departments d

WHERE e.department_id = d.department_id);

20

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 dedepartamento del departamento cuyo identificador de ubicación es 1800. La expresión CASEde la consulta externa utiliza el resultado de la consulta interna para mostrar el identificador deempleado, los apellidos y un valor de Canadá o EE.UU., dependiendo de si el identificador dedepartamento del registro recuperado por la consulta externa es 20 o no.

Éste es el resultado del primer ejemplo de la diapositiva:

Introducción a Oracle 10g: SQL Fundamentals II

207

Page 208: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 208/354

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

Subconsultas Escalares: Ejemplos (continuación)

El segundo ejemplo de la diapositiva demuestra que las subconsultas escalares se pueden utilizar en la cláusula ORDER BY. En el ejemplo, se ordena la salida basándose en DEPARTMENT_NAME al hacer corresponder el valor de DEPARTMENT_ID de la tabla EMPLOYEES con el valor de DEPARTMENT_ID de la tabla DEPARTMENTS. Esta comparación se realiza en unasubconsulta escalar en la cláusula ORDER BY. Éste es el resultado del segundo ejemplo:

El segundo ejemplo utiliza una subconsulta correlacionada. En una consulta correlacionada, lasubconsulta hace referencia a una columna desde una tabla a la que se hace referencia en lasentencia principal. Las subconsultas correlacionadas se explican más adelante en esta lección.

Introducción a Oracle 10g: SQL Fundamentals II

208

Page 209: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 209/354

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

Subconsultas Correlacionadas

Las subconsultas correlacionadas se utilizan para elprocesamiento fila a fila. Cada consulta se ejecuta unavez para cada fila de la consulta externa.

OBTENGAfila candidata de consulta externa

EJECUTEconsulta interna mediante valor de fila candidata

UTILICEvalores 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 unacolumna desde una tabla a la que se hace referencia en la sentencia principal. Una subconsultacorrelacionada se evalúa una vez para cada fila procesada por la sentencia principal. Lasentencia 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 unavez, y devuelve valores que serán utilizados por la consulta principal. Sin embargo, unasubconsulta correlacionada se ejecuta una vez para cada fila candidata considerada por laconsulta externa. Dicho de otro modo, la consulta interna está controlada por la consultaexterna.

Ejecución 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.

Ejecución 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.

Introducción a Oracle 10g: SQL Fundamentals II

209

Page 210: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 210/354

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

Subconsultas Correlacionadas

La subconsulta hace referencia a una columna de unatabla en la consulta principal.

outer 

outer 

SELECT column1, column2, ...

FROM table1

WHERE column1 operator

(SELECT column1, column2

FROM table2

WHERE expr1 =.expr2);

Subconsultas Correlacionadas (continuación)

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 debadevolver un resultado o un juego de resultados diferente para cada fila candidata consideradapor la consulta principal. Dicho de otro modo, utilice una subconsulta correlacionada pararesponder a una pregunta de varias partes cuya respuesta dependa del valor de cada filaprocesada por la sentencia principal.

Oracle Server realiza una consulta correlacionada cuando la subconsulta hace referencia a unacolumna desde una tabla de la consulta principal.

Nota: Puede utilizar los operadores ANY y ALL en una subconsulta correlacionada.

Introducción a Oracle 10g: SQL Fundamentals II

210

Page 211: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 211/354

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

Uso de Subconsultas Correlacionadas

Busque todos los empleados que ganen más que elsalario medio de su departamento.

Cada vez que se procesauna fila de la consultaexterna, se evalúa laconsulta interna.

SELECT last_name, salary, department_id

FROM employees outer

WHERE salary >

(SELECT AVG(salary)

FROM employees

WHERE department_id =outer.department_id);

Uso de Subconsultas Correlacionadas

El ejemplo de la diapositiva determina qué empleados ganan más que el salario medio de sudepartamento. En este caso, la subconsulta correlacionada calcula específicamente el salariomedio de cada departamento.

Como la consulta externa y la interna utilizan la tabla EMPLOYEES en la cláusula FROM, seasigna un alias a EMPLOYEES en la sentencia SELECT externa por motivos de claridad. Elalias no sólo hace que toda la sentencia SELECT resulte más legible, sino que sin él, laconsulta no funcionaría correctamente, ya que la sentencia interna no podría distinguir lacolumna de la tabla interna de la columna de la tabla externa.

Introducción a Oracle 10g: SQL Fundamentals II

211

Page 212: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 212/354

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

Uso de Subconsultas Correlacionadas

Muestre los detalles de los empleados que hayancambiado 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);

Uso de Subconsultas Correlacionadas (continuación)El ejemplo de la diapositiva muestra los detalles de los empleados que han cambiado de puestoal menos dos veces. Oracle Server evalúa una subconsulta correlacionada de esta manera:

1. Seleccione una fila de la tabla especificada en la consulta externa. Ésta será la filacandidata actual.

2. Almacene el valor de la columna a la que se hace referencia en la subconsulta desde estafila candidata. (En el ejemplo de la diapositiva, la columna a la que se hace referencia enla subconsulta es E.EMPLOYEE_ID).

3. Realice la subconsulta con su condición haciendo referencia al valor de la fila candidatade la consulta externa. (En el ejemplo de la diapositiva, la función de grupo COUNT(*)se evalúa basándose en el valor de la columna E.EMPLOYEE_ID obtenida en el paso 2).

4. Evalúe la cláusula WHERE de la consulta externa basándose en los resultados de lasubconsulta realizada en el paso 3. Esto determina si se selecciona la fila candidata parala salida. (En el ejemplo, el número de veces que un empleado ha cambiado de puesto,evaluado por la subconsulta, se compara con 2 en la cláusula WHERE de la consultaexterna. Si se satisface la condición, se muestra el registro de ese empleado).

5. Repita el procedimiento para la siguiente fila candidata de la tabla, y así sucesivamentehasta que se hayan procesado todas las filas de la tabla.

La correlación 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 deEMPLOYEE_ID de la tabla de la consulta externa.

Introducción a Oracle 10g: SQL Fundamentals II

212

Page 213: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 213/354

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

Uso del Operador EXISTS

• El operador EXISTS comprueba la existencia de filasen el juego de resultados de la subconsulta.

• Si se encuentra un valor de fila de subconsulta:– La búsqueda no continúa en la consulta interna– La condición se indica como TRUE

• Si no se encuentra un valor de fila de subconsulta:– La condición se indica como FALSE

– La búsqueda continúa en la consulta interna

Operador EXISTS

Con las sentencias SELECT anidadas, son válidos todos los operadores lógicos. Además,puede utilizar el operador EXISTS. Este operador se utiliza frecuentemente con subconsultascorrelacionadas para probar si existe un valor recuperado por la consulta externa en el juegode resultados de los valores recuperados por la consulta interna. Si la subconsulta devuelve almenos una fila, el operador devuelve TRUE. Si el valor no existe, devuelve FALSE. De formaanáloga, NOT EXISTS prueba si un valor recuperado por la consulta externa no forma partedel juego de resultados de los valores recuperados por la consulta interna.

Introducción a Oracle 10g: SQL Fundamentals II

213

Page 214: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 214/354

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

Búsqueda de Empleados que Tengan alMenos 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);

Uso del Operador EXISTS

El operador EXISTS asegura que la búsqueda en la consulta interna no continúe cuando seencuentre al menos una correspondencia para el número de empleado y de supervisor mediante la condición:

WHERE manager_id = outer.employee_id.

Observe que la consulta SELECT interna no necesita devolver un valor específico, por lo quese puede seleccionar una constante.

Introducción a Oracle 10g: SQL Fundamentals II

214

Page 215: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 215/354

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

Búsqueda de Todos los Departamentosque No Tengan Empleados

SELECT department_id, department_name

FROM departments d

WHERE NOT EXISTS (SELECT 'X'

FROM employees

WHERE department_id

= d.department_id);

Uso del Operador NOT EXISTS

Solución Alternativa

Se puede utilizar una construcción NOT IN como alternativa para un operador NOTEXISTS, 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 evalúa 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 tablaDEPARTMENTS que satisfagan la condición WHERE.

Introducción a Oracle 10g: SQL Fundamentals II

215

Page 216: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 216/354

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

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

Consulta Correlacionada: UPDATE

En el caso de la sentencia UPDATE, puede utilizar una subconsulta correlacionada paraactualizar filas de una tabla basada en filas de otra tabla.

Introducción a Oracle 10g: SQL Fundamentals II

216

Page 217: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 217/354

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

Uso de Consultas Correlacionadas: UPDATE

• Para desnormalizar la tabla EMPL6, agregue unacolumna para almacenar el nombre del departamento.

• Rellene la tabla mediante una actualizacióncorrelacionada.

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

Consulta Correlacionada: UPDATE (continuación)

En el ejemplo de la diapositiva, se desnormaliza la tabla EMPL6 al agregar una columna paraalmacenar el nombre de departamento y rellena después la tabla mediante una actualizacióncorrelacionada.

A continuación, se muestra otro ejemplo para una actualización 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 EMPL6basada 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);

Introducción a Oracle 10g: SQL Fundamentals II

217

Page 218: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 218/354

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

Consulta Correlacionada: UPDATE (continuación)

En este ejemplo se utiliza la tabla REWARDS. La tabla REWARDS tiene las columnasEMPLOYEE_ID, PAY_RAISE y PAYRAISE_DATE. Cada vez que un empleado obtiene unaumento de salario, se inserta un registro con los detalles de identificador de empleado, lacantidad del aumento de salario y la fecha de recepción del aumento de salario en la tablaREWARDS. La tabla REWARDS puede contener más de un registro para un empleado. Lacolumna PAYRAISE_DATE se utiliza para identificar el aumento de salario más recienterecibido por un empleado.

En el ejemplo, la columna SALARY de la tabla EMPL6 se actualiza para reflejar el últimoaumento de salario recibido por el empleado. Para ello, se agrega el salario actual delempleado con el aumento de salario correspondiente de la tabla REWARDS.

Introducción a Oracle 10g: SQL Fundamentals II

218

Page 219: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 219/354

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

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

Consulta Correlacionada: DELETE

En el caso de una sentencia DELETE, puede utilizar una subconsulta correlacionada parasuprimir sólo las filas que también existen en otra tabla. Si decide que sólo va a mantener loscuatro últimos registros del historial de puestos de la tabla JOB_HISTORY, cuando setransfiere un empleado a un quinto puesto, suprima la fila JOB_HISTORY más antiguabuscando MIN(START_DATE) en la tabla JOB_HISTORY para el empleado. El siguientecódigo ilustra cómo se puede realizar la operación anterior mediante una supresión (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));

Introducción a Oracle 10g: SQL Fundamentals II

219

Page 220: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 220/354

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

Uso de Consultas Correlacionadas: DELETE

Utilice una subconsulta correlacionada para suprimir sólo las filas de la tabla EMPL6 que también existan enla tabla EMP_HISTORY.

DELETE FROM empl6 E

WHERE employee_id =

(SELECT employee_id

FROM emp_history

WHERE employee_id = E.employee_id);

Consulta Correlacionada: DELETE (continuación)

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 seríaerróneo que el registro del mismo empleado existiera en las tablas EMPL6 y EMP_HISTORY.

Puede suprimir dichos registros erróneos mediante la subconsulta correlacionada que semuestra en la diapositiva.

Introducción a Oracle 10g: SQL Fundamentals II

220

Page 221: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 221/354

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

Cláusula WITH

• Mediante la cláusula WITH, puede utilizar el mismobloque de consulta en una sentencia SELECT cuandose produce más de una vez dentro de una consultacompleja.

• La cláusula WITH recupera los resultados de unbloque de consulta y los almacena en el tablespace

temporal del usuario.• La cláusula WITH mejora el rendimiento.

Cláusula WITH

Mediante la cláusula WITH, puede definir un bloque de consulta antes de utilizarlo en unaconsulta. La cláusula WITH (conocida formalmente como subquery_factoring_clause)le permite reutilizar el mismo bloque de consulta en una sentencia SELECT cuando se producemás de una vez dentro de una consulta compleja. Esto resulta particularmente útil cuando unaconsulta tiene muchas referencias al mismo bloque de consulta y hay presentes uniones yagregaciones.

Mediante la cláusula WITH, puede reutilizar la misma consulta cuando resulta caro evaluar elbloque de consulta y se produce más de una vez dentro de una consulta compleja. Mediante lacláusula WITH, Oracle Server recupera los resultados de un bloque de consulta y los almacena enel tablespace temporal del usuario. Esto puede mejorar el rendimiento.

Ventajas de la Cláusula WITH

• Hace que la consulta resulte fácil de leer • Evalúa una cláusula sólo una vez, incluso aunque aparezca varias veces en la consulta• En la mayoría de los casos puede mejorar el rendimiento para las consultas grandes

Introducción a Oracle 10g: SQL Fundamentals II

221

Page 222: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 222/354

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

Cláusula WITH: Ejemplo

Mediante la cláusula WITH, escriba una consulta paramostrar el nombre de departamento y los salariostotales de los departamentos cuyo salario total seasuperior al salario medio de todos los departamentos.

Cláusula WITH: Ejemplo

El problema de la diapositiva requeriría los siguientes cálculos intermedios:1. Calcule el salario total para todos los departamentos y almacene el resultado mediante

una cláusula WITH.2. Calcule el salario medio de todos los departamentos y almacene el resultado mediante

una cláusula 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 elsalario total de ese departamento.

La solución a este problema se muestra en la página siguiente.

Introducción a Oracle 10g: SQL Fundamentals II

222

Page 223: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 223/354

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

Cláusula WITH: Ejemplo

WITH

dept_costs AS (

SELECT d.department_name, SUM(e.salary) AS dept_total

FROM employees e, departments d

WHERE e.department_id = d.department_id

GROUP BY d.department_name),

avg_cost AS (

SELECT SUM(dept_total)/COUNT(*) AS dept_avg

FROM dept_costs)SELECT *

FROM dept_costs

WHERE dept_total >

(SELECT dept_avg

FROM avg_cost)

ORDER BY department_name;

Cláusula WITH: Ejemplo (continuación)

El código SQL de la diapositiva es un ejemplo de una situación en la que se puede mejorar elrendimiento y escribir SQL de forma más sencilla mediante la cláusula WITH. La consultacrea los nombres de consulta DEPT_COSTS y AVG_COST y los utiliza en el cuerpo de laconsulta principal. Internamente, la cláusula WITH se resuelve como una vista en línea o unatabla temporal. El optimizador selecciona la resolución adecuada según el costo o las ventajasde almacenar temporalmente los resultados de la cláusula WITH.

Ésta es la salida generada por el código SQL de la diapositiva:

Notas de Uso de la Cláusula WITH

• Se utiliza sólo con sentencias SELECT.• Un nombre de consulta es visible para todos los bloques de consulta del elemento WITH

(incluidos los bloques de subconsulta) definidos después de éste y el propio bloque deconsulta (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 cláusula WITH puede contener más de una consulta. Cada consulta se separaentonces con una coma.

Introducción a Oracle 10g: SQL Fundamentals II

223

Page 224: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 224/354

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

Resumen

En esta lección, ha aprendido lo siguiente:

• Una subconsulta de varias columnas devuelve másde una columna.

• Las comparaciones de varias columnas pueden ser entre pares y entre no pares.

• Una subconsulta de varias columnas también se

puede utilizar en la cláusula FROM de una sentenciaSELECT.

Resumen

Puede utilizar subconsultas de varias columnas para combinar varias condiciones WHERE enuna sola cláusula WHERE. Las comparaciones de columnas en una subconsulta de variascolumnas pueden ser entre pares y entre no pares.

Puede utilizar una subconsulta para definir una tabla en la que pueda operar una consulta quela contenga.

Las subconsultas escalares se pueden utilizar en:

• Parte de expresión y condición de DECODE y CASE• Todas las cláusulas de SELECT excepto GROUP BY• Una cláusula SET y cláusula WHERE de una sentencia UPDATE

Introducción a Oracle 10g: SQL Fundamentals II

224

Page 225: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 225/354

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

Resumen

• Las subconsultas correlacionadas son útilessiempre que una subconsulta deba devolver unresultado diferente para cada fila candidata.

• El operador EXISTS es un operador booleano queprueba la presencia de un valor.

• Las subconsultas correlacionadas se pueden

utilizar con sentencias SELECT, UPDATE y DELETE.• Puede utilizar la cláusula WITH para utilizar el

mismo bloque de consulta en una sentenciaSELECT cuando se produce más de una vez.

Resumen (continuación)

Oracle Server realiza una consulta correlacionada cuando la subconsulta hace referencia a unacolumna desde una tabla a la que se hace referencia en la sentencia principal. Una subconsultacorrelacionada se evalúa una vez para cada fila procesada por la sentencia principal. Lasentencia principal puede ser una sentencia SELECT, UPDATE o DELETE. Mediante lacláusula WITH, puede reutilizar la misma consulta cuando resulta caro volver a evaluar elbloque de consulta y se produce más de una vez dentro de una consulta compleja.

Introducción a Oracle 10g: SQL Fundamentals II

225

Page 226: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 226/354

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

Práctica 6: Visión General

Esta práctica cubre los siguientes temas:

• Creación de subconsultas de varias columnas

• Escritura de subconsultas correlacionadas• Uso del operador EXISTS

• Uso de subconsultas escalares• Uso de la cláusula WITH

Práctica 6: Visión General

En esta práctica, escribirá subconsultas de varias columnas, así como subconsultascorrelacionadas y escalares. También solucionará problemas escribiendo la cláusula WITH.

Introducción a Oracle 10g: SQL Fundamentals II

226

Page 227: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 227/354

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

Práctica 61. Escriba una consulta para mostrar el apellido, el número de departamento y el salario de

cualquier empleado cuyo número de departamento y salario se correspondan con elnúmero de departamento y el salario de cualquier empleado que gane una comisión.

2. Muestre el apellido, el nombre de departamento y el salario de cualquier empleado cuyosalario y comisión se correspondan con el salario y la comisión de cualquier empleadocon el identificador de ubicación 1700.

3. Cree una consulta para mostrar el apellido, la fecha de contratación y el salario de todoslos empleados que tengan el mismo salario y la misma comisión 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 más alto queel salario de todos los supervisores de ventas (JOB_ID = 'SA_MAN'). Ordene losresultados por salario en orden descendente.

Introducción a Oracle 10g: SQL Fundamentals II

227

Page 228: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 228/354

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

Práctica 6 (continuación)5. Muestre los detalles del identificador de empleado, el apellido y el identificador de

departamento de los empleados que vivan en ciudades cuyo nombre empiece por T .

6. Escriba una consulta para buscar todos los empleados que ganen más que el salariomedio de su departamento.Muestre el apellido, el salario, el identificador de departamento y el salario medio deldepartamento. Ordene por salario medio. Utilice alias para las columnas recuperadas por la consulta como se muestra en el ejemplo de salida.

Introducción a Oracle 10g: SQL Fundamentals II

228

Page 229: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 229/354

Page 230: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 230/354

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

Práctica 6 (continuación)9. Escriba una consulta para mostrar los apellidos de los empleados que tienen uno o más

colegas en su departamento con fechas de contratación posteriores pero salariosmás altos.

10. Escriba una consulta para mostrar los identificadores de empleado, los apellidos, y losnombres de departamento de todos los empleados.Nota: Utilice una subconsulta escalar para recuperar el nombre de departamento en lasentencia SELECT.

Introducción a Oracle 10g: SQL Fundamentals II

230

Page 231: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 231/354

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

Práctica 6 (continuación)

11. Escriba una consulta para mostrar los nombres de departamento de los departamentoscuyo costo de salario total supere un octavo (1/8) del costo de salario total de toda lacompañía. Utilice la cláusula WITH para escribir esta consulta. Asigne a la consulta elnombre SUMMARY.

Introducción a Oracle 10g: SQL Fundamentals II

231

Page 232: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 232/354

Recuperación Jerárquica

Introducción a Oracle 10g: SQL Fundamentals II

232

Page 233: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 233/354

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

Objetivos

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

• Interpretar el concepto de consulta jerárquica

• Crear un informe en estructura de árbol

• Formatear datos jerárquicos

• Excluir ramas de la estructura de árbol

Objetivos

En esta lección, aprenderá a utilizar consultas jerárquicas para crear informes en estructura

de árbol.

Introducción a Oracle 10g: SQL Fundamentals II

233

Page 234: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 234/354

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

Ejemplo de Datos de la Tabla EMPLOYEES

Ejemplo de Datos de la Tabla EMPLOYEES

Mediante consultas jerárquicas, puede recuperar datos basándose en una relación jerárquica

natural entre filas de una tabla. Una base de datos relacional no almacena registros de forma

jerárquica. Sin embargo, si existe una relación jerárquica entre las filas de una sola tabla, un

proceso denominado desplazamiento por el árbol permite que se construya la jerarquía. Una

consulta jerárquica es un método de informar de las ramas de un árbol en un orden específico.

Imagine un árbol genealógico con los miembros mayores de la familia situados cerca de la

base o del tronco del árbol y los más jóvenes representados como ramas del árbol. Las ramas

pueden tener más ramas, y así sucesivamente.

Una consulta jerárquica es posible cuando existe una relación 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 están bajo las órdenes directas del presidente de la compañía.

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 jerárquicos se utilizan en diversos campos como, por ejemplo, la

genealogía humana (árboles genealógicos), la cría de ganado (reproducción), la gerencia

empresarial (jerarquías de los supervisores), la manufactura (ensamblaje de productos), la

investigación evolutiva (desarrollo de especies) y la investigación científica.

Introducción a Oracle 10g: SQL Fundamentals II

234

Page 235: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 235/354

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

Estructura de Árbol Natural

De Haan

King

Hunold

EMPLOYEE_ID = 100 (Principal)

MANAGER_ID = 100 (Secundario)

Whalen

Kochhar 

Higgins

Mourgos Zlotkey

Rajs Davies Matos

Gietz Ernst Lorentz

Hartstein

Fay

Abel Taylor Grant

Vargas

Estructura de Árbol Natural

La tabla EMPLOYEES tiene una estructura de árbol que representa la línea de supervisores.

Para crear la jerarquía, se puede observar la relación entre valores equivalentes de las

columnas EMPLOYEE_ID y MANAGER_ID. Para utilizar esta relación, se puede unir la

tabla a sí misma. La columna MANAGER_ID contiene el número de empleado del supervisor 

del empleado.

La relación principal-secundario de una estructura de árbol le permite controlar:

• La dirección de desplazamiento por la jerarquía

• El punto de partida dentro de la jerarquía

Nota: La diapositiva muestra una estructura de árbol invertido de la jerarquía de supervisores

de los empleados de la tabla EMPLOYEES.

Introducción a Oracle 10g: SQL Fundamentals II

235

Page 236: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 236/354

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

Consultas Jerárquicas

Condición WHERE:

expr comparison_operator expr 

SELECT [LEVEL], column , expr ...FROM table

[WHERE condition(s)]

[START WITH condition(s)][CONNECT BY PRIOR condition(s)] ;

Palabras Clave y CláusulasLas consultas jerárquicas se pueden identificar por la presencia de las cláusulas CONNECT BYy START WITH.

En la sintaxis:SELECT Es la cláusula SELECT estándar 

LEVEL Para cada fila devuelta por una consulta jerárquica, lapseudocolumna LEVEL devuelve 1 para una fila de raíz, 2 para un

secundario de la raíz y así sucesivamente.

FROM table Especifica la tabla, la vista o la instantánea 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 jerarquía.

condition Es una comparación con expresionesSTART WITH Especifica las filas de raíz de la jerarquía (dónde comenzar). Esta

cláusula es necesaria para una consulta jerárquica verdadera.CONNECT BY Especifica las columnas en las que existe la relación entre filas

PRIOR principales y secundarias. Esta cláusula es necesaria para una

consulta jerárquica.

La sentencia SELECT no puede contener una unión ni una consulta de una vista que contenga

una unión.

Introducción a Oracle 10g: SQL Fundamentals II

236

Page 237: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 237/354

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

Desplazamiento por el Árbol

• Especifica la condición que se debe cumplir 

• Acepta cualquier condición válida

Mediante la tabla EMPLOYEES, parta del empleado cuyoapellido es Kochhar.

Punto de Partida

...START WITH last_name = 'Kochhar'

START WITH column1 = value

Desplazamiento por el Árbol

La cláusula START WITH determina la fila o las filas que se deben utilizar como raíz

del árbol. La cláusula START WITH se puede utilizar en conjunción con cualquier 

condición válida.

Ejemplos

Mediante la tabla EMPLOYEES, parta de King, el presidente de la compañía.

... START WITH manager_id IS NULL

Mediante la tabla EMPLOYEES, parta del empleado Kochhar. Una condición START WITHpuede contener una subconsulta.

... START WITH employee_id = (SELECT employee_id

FROM employees

WHERE last_name = 'Kochhar')

Si se omite la cláusula START WITH, el desplazamiento por el árbol parte de todas las filas

de la tabla como filas de raíz. Si se utiliza una cláusula WHERE, el desplazamiento parte de

todas las filas que satisfacen la condición WHERE. Esto ya no refleja una jerarquía verdadera.

Nota: Las cláusulas CONNECT BY PRIOR y START WITH no son del estándar ANSI SQL.

Introducción a Oracle 10g: SQL Fundamentals II

237

Page 238: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 238/354

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

Desplazamiento por el Árbol

Desplácese de arriba abajo mediante la tabla EMPLOYEES.

Dirección

De arriba abajo Columna1 = Clave principalColumna2 = Clave secundaria

De abajo arriba Columna1 = Clave secundariaColumna2 = Clave principal

CONNECT BY PRIOR column1 = column2

... CONNECT BY PRIOR employee_id = manager_id

Desplazamiento por el Árbol (continuación)La dirección de la consulta, ya sea de principal a secundario o de secundario a principal, estádeterminada por la colocación de la columna CONNECT BY PRIOR. El operador PRIOR se

refiere a la fila principal. Para encontrar las filas secundarias de una fila principal, OracleServer evalúa la expresión PRIOR para la fila principal y las demás expresiones para cada fila

de la tabla. Las filas para las que la condición es verdadera son las filas secundarias de laprincipal. Oracle Server selecciona siempre las filas secundarias evaluando la condiciónCONNECT BY con respecto a una fila principal actual.

EjemplosDesplácese de arriba abajo mediante la tabla EMPLOYEES. Defina una relación jerárquica enla 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

Desplácese de abajo arriba mediante la tabla EMPLOYEES.

... CONNECT BY PRIOR manager_id = employee_id

No es necesario codificar inmediatamente el operador PRIOR después de CONNECT BY.

Así, la siguiente cláusula CONNECT BY PRIOR genera el mismo resultado que la del

ejemplo anterior.

... CONNECT BY employee_id = PRIOR manager_id

Nota: La cláusula CONNECT BY no puede contener una subconsulta.

Introducción a Oracle 10g: SQL Fundamentals II

238

Page 239: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 239/354

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

Desplazamiento por el Árbol: De Abajo Arriba

SELECT employee_id, last_name, job_id, manager_idFROM employees

START WITH employee_id = 101CONNECT BY PRIOR manager_id = employee_id ;

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 evalúan para la fila principal y

MANAGER_ID, y los valores de SALARY son evaluados por las filas secundarias. El operador 

PRIOR se aplica sólo al valor de EMPLOYEE_ID.

... CONNECT BY PRIOR employee_id = manager_idAND 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 dólares.

Introducción a Oracle 10g: SQL Fundamentals II

239

Page 240: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 240/354

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

Desplazamiento por el Árbol: De Arriba Abajo

SELECT last_name||' reports to '||PRIOR last_name "Walk Top Down"

FROM employees

START WITH last_name = 'King'CONNECT BY PRIOR employee_id = manager_id ;

Desplazamiento por el Árbol: De Arriba Abajo

Desplazándose de arriba abajo, muestre los nombres de los empleados y su supervisor. Utilice

el empleado King como punto de partida. Imprima sólo una columna.

Introducción a Oracle 10g: SQL Fundamentals II

240

Page 241: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 241/354

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

Clasificación de Filas con laPseudocolumna LEVEL

Nivel 1raíz/principal

Nivel 3principal/secundario/hoja

Nivel 4hoja

De Haan

King

HunoldWhalen

Kochhar 

Higgins

Mourgos Zlotkey

Rajs Davies Matos

Gietz Ernst Lorentz

Hartstein

Fay

Abel Taylor Grant

Vargas

Clasificación de Filas con la Pseudocolumna LEVEL

Puede mostrar explícitamente la clasificación o el nivel de una fila en la jerarquía mediante la

pseudocolumna LEVEL. Esto hará que el informe resulte más legible. Las bifurcaciones en las

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.

PseudocolumnaLEVEL

En la diapositiva, King es la raíz o el principal (LEVEL = 1). Kochhar, De Haan, Mourgos,

Zlotkey, Hartstein, Higgins y Hunold son secundarios y también principales (LEVEL = 2).

Whalen, Rajs, Davies, Matos, Vargas, Gietz, Ernst, Lorentz, Abel, Taylor, Grant y Fay son

secundarios y hojas. (LEVEL = 3 y LEVEL = 4)

Nota: Un nodo raíz es el nodo más alto dentro de un árbol invertido. Un nodo secundario es

cualquier nodo no raíz. Un nodo principal es cualquier nodo que tenga secundarios. Un nodo

hoja es cualquier nodo sin secundarios. El número de niveles devuelto por una consulta

jerárquica se puede ver limitado por la memoria de usuario disponible.

Valor Nivel

1  Nodo raíz

2 Secundario de un nodo raíz

3 Secundario de un secundario y así sucesivamente.

Introducción a Oracle 10g: SQL Fundamentals II

241

Page 242: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 242/354

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

Formato de Informes Jerárquicosmediante LEVEL y LPAD

Cree un informe que muestre los niveles desupervisores de la compañía, partiendo del nivel másalto 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 employeesSTART WITH last_name='King'CONNECT BY PRIOR employee_id=manager_id

Formato de Informes Jerárquicos mediante LEVEL

A los nodos de un árbol se les asignan números de niveles desde la raíz. Utilice la función

LPAD en conjunción con la pseudocolumna LEVEL para mostrar un informe jerárquico como

á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 visualización.

• 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 conel carácter '_' 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 conningún carácter '_' 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.

Introducción a Oracle 10g: SQL Fundamentals II

242

Page 243: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 243/354

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

Formato de Informes Jerárquicos mediante LEVEL (continuación)

Introducción a Oracle 10g: SQL Fundamentals II

243

Page 244: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 244/354

Page 245: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 245/354

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

Resumen

En esta lección, ha aprendido lo siguiente:

• Puede utilizar consultas jerárquicas para ver unarelación jerárquica entre filas de una tabla.

• Puede especificar la dirección y el punto departida de la consulta.

• Puede eliminar nodos o ramas mediante la

eliminación.

Resumen

Puede utilizar consultas jerárquicas para recuperar datos basándose en una relación jerárquica

natural entre filas de una tabla. La pseudocolumna LEVEL cuenta lo lejos que se ha

desplazado hacia abajo en un árbol jerárquico. Puede especificar la dirección de la consulta

mediante la cláusula CONNECT BY PRIOR. Puede especificar el punto de partida mediante

la cláusula START WITH. Puede utilizar las cláusulas WHERE y CONNECT BY para eliminar 

las ramas del árbol.

Introducción a Oracle 10g: SQL Fundamentals II

245

Page 246: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 246/354

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

Práctica 7: Visión General

Esta práctica cubre los siguientes temas:

• Distinción entre consultas jerárquicas y consultasno jerárquicas

• Desplazamiento por un árbol

• Generación de un informe con sangrado mediantela pseudocolumna LEVEL

• Eliminación de la estructura del árbol• Ordenación de la salida

Práctica 7: Visión General

En esta práctica, obtendrá experiencia práctica en la generación de informes jerárquicos.

Nota: La pregunta 1 se realiza sobre papel.

Introducción a Oracle 10g: SQL Fundamentals II

246

Page 247: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 247/354

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

Práctica 71. Observe los siguientes ejemplos de salida. ¿Son resultado de una consulta jerárquica?

Explique por qué o por qué no.

Imagen 1:

Imagen 2:

Introducción a Oracle 10g: SQL Fundamentals II

247

Page 248: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 248/354

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

Práctica 7 (continuación)Imagen 3:

2. Genere un informe que muestre un organigrama del departamento de Mourgos. Imprima

los apellidos, los salarios y los identificadores de departamento.

3. Cree un informe que muestre la jerarquía de los supervisores del empleado Lorentz.Muestre primero el supervisor inmediato.

Introducción a Oracle 10g: SQL Fundamentals II

248

Page 249: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 249/354

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

Práctica 7 (continuación)4. Cree un informe con sangrado que muestre la jerarquía de supervisores partiendo del

empleado cuyo LAST_NAME es Kochhar. Imprima el apellido del empleado, el

identificador de supervisor y el identificador de departamento. Asigne nombres de alias

a las columnas como se muestra en la salida de ejemplo.

Si le queda tiempo, realice el siguiente ejercicio:

5. Genere un organigrama de la compañía que muestre la jerarquía de los supervisores.

Parta de la persona de nivel más alto, excluya a todas las personas con el identificador de puesto IT_PROG, a De Haan y a los empleados que estén a las órdenes de De Haan.

Introducción a Oracle 10g: SQL Fundamentals II

249

Page 250: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 250/354

Soporte de Expresiones Normales

Introducción a Oracle 10g: SQL Fundamentals II

250

Page 251: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 251/354

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

Copyright © 2004, Oracle. Todos los derechos reservados..

Objetivos

Al final de esta lección, debería estar capacitado parautilizar el soporte de expresiones normales en SQLpara buscar, hacer corresponder y sustituir cadenassiempre en términos de expresiones normales.

Objetivos

En esta lección, aprenderá a utilizar la función de soporte de expresiones normales que se ha

introducido en la base de datos Oracle 10g .

Introducción a Oracle 10g: SQL Fundamentals II

251

Page 252: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 252/354

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

Copyright © 2004, Oracle. Todos los derechos reservados..

ABC

Método para describir patrones sencillos y

complejos de búsqueday manipulación

Varias funcionesnuevas para soportar 

expresionesnormales

Soporte deexpresiones normalesmultilingüe para tipos

de cadena SQL yPL/SQL

Visión General de Expresiones Normales

Visión General de Expresiones Normales

La base de datos Oracle 10g introduce el soporte de expresiones normales. La

implementación cumple con el estándar POSIX (Sistema Operativo Portátil para UNIX),

controlado por el IEEE (Instituto de Ingenieros en Electricidad y Electrónica), para la

semántica y la sintaxis de correspondencia de datos ASCII. Las capacidades multilingües de

Oracle amplían las capacidades de correspondencia de los operadores más allá del estándar 

POSIX. Las expresiones normales son un método para describir patrones sencillos y

complejos de búsqueda y manipulación.

La manipulación y la búsqueda de cadenas suponen un amplio porcentaje de la lógica de una

aplicación basada en la Web. El uso va desde la simple búsqueda de las palabras “San

Francisco” en un texto especificado, pasando por la compleja extracción de todas las

direcciones URL del texto, hasta la búsqueda más compleja de todas las palabras cuyo

segundo carácter sea una vocal.

Si se une al SQL nativo, el uso de expresiones normales permite operaciones muy potentes de

búsqueda y de manipulación de cualquier dato almacenado en una base de datos Oracle.

Puede utilizar esta función para solucionar fácilmente problemas que de otro modo resultarían

muy complejos de programar.

Introducción a Oracle 10g: SQL Fundamentals II

252

Page 253: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 253/354

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

Copyright © 2004, Oracle. Todos los derechos reservados..

Metacaracteres

Especifica clases de equivalencia[==]

Se corresponde con una o más incidencias+Se corresponde con cero o una incidencia?

Se corresponde con cualquier carácter del juego de caracteres soportado,excepto NULL

.

Expresión de agrupamiento, que se trata como subexpresión única()

Referencia a expresión anterior \n

Especifica una clase de carácter y se corresponde con cualquier carácter deesa clase

[: :]

Puede tener 4 significados diferentes: 1. Se representa a sí mismo. 2. Presenta elsiguiente carácter. 3. Introduce un operador. 4. No hace nada.

\

DescripciónSímbolo

Especifica un elemento de intercalación como, por ejemplo, un elemento devarios caracteres

Se corresponde al menos m veces pero no más de n veces

Se corresponde exactamente m veces

Expresión entre corchetes para una lista de correspondencia que se correspondecon cualquiera de las expresiones representadas en la lista

Se corresponde con el inicio de línea/fin de línea

Operador de modificación para especificar correspondencias alternativas

Se corresponde con cero o más incidencias

[..]

{m,n}

{m}

[ ]

^/$

|

*

Metacaracteres

Los metacaracteres son caracteres especiales que tienen un significado especial como, por 

ejemplo, un comodín, un carácter de repetición, un carácter de no correspondencia o un rango

de caracteres. Puede utilizar varios símbolos de metacaracteres predefinidos en la

correspondencia de patrones.

Introducción a Oracle 10g: SQL Fundamentals II

253

Page 254: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 254/354

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

Copyright © 2004, Oracle. Todos los derechos reservados..

Uso de MetacaracteresProblem: Find 'abc' within a string:Solution: 'abc'Matches: abcDoes not match: 'def'

Problem: To find 'a' followed by any character, followedby 'c'

Meta Character: any  character is defined by '.'Solution: 'a.c'Matches: abcMatches: adcMatches: alcMatches: 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 theprevious charactersSolution: 'a+'Matches: aMatches: aaDoes not match: bbb

1

2

3

Uso de Metacaracteres1. En el primer ejemplo, se realiza una correspondencia sencilla.2. En el segundo ejemplo, el carácter any se define como un '.'. En este ejemplo se busca

el carácter “a” seguido de cualquier carácter, seguido del carácter “c”.

3. El tercer ejemplo busca una o más incidencias de la letra “a.” El carácter “+” se utiliza

aquí para indicar una correspondencia de uno o más de los caracteres anteriores.

Puede buscar también listas de caracteres sin correspondencia. Una lista de caracteres sin

correspondencia le permite definir un juego de caracteres para los que una correspondencia no

es válida. Por ejemplo, para buscar cualquier cosa menos los caracteres “a,” “b” o “c”, puededefinir “^” 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: lmnDoes not match: abcdefghi

Introducción a Oracle 10g: SQL Fundamentals II

254

Page 255: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 255/354

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

Uso de Metacaracteres (continuación)

Se corresponde con cualquier carácter de la lista ...

Lista de caracteres decorrespondencia

[…]

Se corresponde con cualquier carácter que no esté en la lista ...

Lista de caracteres sincorrespondencia

[^…]

'a|b' se corresponde con los caracteres'a' o 'b'.

O|

Trata la expresión ... como una unidad.Subexpresión oagrupamiento

(…)

Se corresponde con la enésimasubexpresión anterior, donde n es unentero del 1 al 9

Referencia a expresiónanterior 

\n

Trata el metacarácter siguiente de laexpresión como un literal.

Carácter de escape\

Se corresponde con la expresiónsiguiente cuando se produce al principiode una línea.

Inicio de fijación de línea^

Se corresponde con la expresiónanterior sólo cuando se produce al finalde una línea.

Fin de fijación de línea$

Se corresponde con cualquier carácter que pertenezca a la clase de carácter especificada.

Clase de carácter POSIX[:class:]

Se corresponde con cero o unaincidencia de la subexpresión anterior.

Cero o una – Cuantificador de signo de interrogación

?

Se corresponde con cualquier carácter.Cualquier carácter – Punto.

DescripciónNombre de Operador Sintaxis deMetacarácter 

Se corresponde con

• m incidencias exactamente• al menos m incidencias

• al menos m, pero no más de nincidencias de la subexpresiónanterior 

Intervalo – Recuento exacto{m}

{m,}

{m,n}

Se corresponde con cero o másincidencias de la subexpresión anterior.

Cero o más – Cuantificador de asterisco

*

Se corresponde con una o másincidencias de la subexpresión anterior.

Una o más – Cuantificador de signo más

+

Introducción a Oracle 10g: SQL Fundamentals II

255

Page 256: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 256/354

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

Copyright © 2004, Oracle. Todos los derechos reservados..

Funciones de Expresiones Normales

Busca en una cadena especificada un

patrón de expresión normal y devuelvela posición en la que se encuentra lacorrespondencia

REGEXP_INSTR

Busca un patrón de expresión normaldentro de una cadena especificada ydevuelve la subcadena con lacorrespondencia

REGEXP_SUBSTR

Busca un patrón de expresión normal ylo sustituye por una cadena desustitución

REGEXP_REPLACE

Parecido al operador LIKE, pero realiza

una correspondencia de expresionesnormales en lugar de unacorrespondencia de patrones sencillos

REGEXP_LIKE

DescripciónNombre de Función

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 expresión normal debe ir 

entre comillas simples. Esto asegura que toda la expresión sea interpretada por la función

SQL y puede mejorar la legibilidad del código.

REGEXP_LIKE: Esta función busca un patrón en una columna de caracteres. Utilice esta

función en la cláusula WHERE de una consulta para devolver las filas que se correspondan con

la expresión normal que se especifique.

REGEXP_REPLACE: Esta función busca un patrón en una columna de caracteres y sustituye

cada incidencia de ese patrón por el patrón que se especifique.

REGEXP_INSTR: Esta función busca en una cadena una incidencia especificada de un

patrón de expresión normal. Hay que especificar qué incidencia se desea buscar y la posición

inicial desde la que buscar. Esta función devuelve un entero que indica la posición en la

cadena en la que ha encontrado la correspondencia.

REGEXP_SUBSTR: Esta función devuelve la subcadena real que se corresponde con el

patrón de expresión normal que se especifique.

Introducción a Oracle 10g: SQL Fundamentals II

256

Page 257: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 257/354

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

.

Sintaxis de la Función REGEXP

REGEXP_LIKE (srcstr, pattern [,match_option])

REGEXP_INSTR (srcstr, pattern [, position [, occurrence[, return_option [, match_option]]]])

REGEXP_SUBSTR (srcstr, pattern [, position[, occurrence [, match_option]]])

REGEXP_REPLACE(srcstr, pattern [,replacestr [, position[, occurrence [, match_option]]]])

Sintaxis de la Función REGEXP

La siguiente tabla contiene descripciones de los términos mostrados en la sintaxis de la

diapositiva.

Incidencia que se buscaráoccurrence

Opción para cambiar la correspondencia por defecto; puedeincluir uno o más de los siguientes valores:“c” —utiliza una correspondencia sensible a

mayúsculas/minúsculas (por defecto)“I” —utiliza una correspondencia no sensible a

mayúsculas/minúsculas“n” —permite el operador de correspondencia con cualquier 

carácter “m ” —trata la cadena de origen como varias líneas

Cadena de caracteres que sustituye al patrón

Posición inicial o final de la incidencia

Punto de partida de la búsqueda

Expresión normal

Valor de búsqueda

match_option

replacestr

return_option

position

pattern

srcstr

Introducción a Oracle 10g: SQL Fundamentals II

257

Page 258: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 258/354

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

SELECT first_name, last_name

FROM employees

WHERE REGEXP_LIKE (first_name, '^Ste(v|ph)en$');

Realización de Búsquedas Básicas

Ejemplo de REGEXP_LIKE

En esta consulta, en la tabla EMPLOYEES, se muestran todos los empleados cuyos nombres

contienen Steven o Stephen. En la expresión utilizada,

'^Ste(v|ph)en$' :

• ^ indica el inicio de la sentencia

• $ indica el fin de la sentencia

• | indica o bien/o

Introducción a Oracle 10g: SQL Fundamentals II

258

Page 259: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 259/354

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

.

SELECT street_address,REGEXP_INSTR(street_address,'[^[:alpha:]]')

FROM locationsWHERE

REGEXP_INSTR(street_address,'[^[:alpha:]]')> 1;

Comprobación de la Presencia de un Patrón

Comprobación de la Presencia de un Patrón

En este ejemplo, la función REGEXP_INSTR se utiliza para buscar la calle con el fin de

encontrar la ubicación del primer carácter no alfabético, independientemente de si está en

mayúsculas o minúsculas. La búsqueda se realiza sólo en las calles que no empiecen por unnúmero. Observe que [:<class>:] implica una clase de carácter y se corresponde con

cualquier carácter de esa clase; [:alpha:] se corresponde con cualquier carácter alfabético.

Se muestran los resultados.

En la expresión utilizada en la consulta '[^[:alpha:]]':

• [ inicia la expresión

• ^ indica NO

• [:alpha:] indica la clase de carácter alfabético

• ] finaliza la expresión

Nota: El operador de clase de carácter POSIX le permite buscar una expresión dentro de una

lista de caracteres que sea miembro de una clase de carácter POSIX específica. Puede utilizar 

este operador para buscar un formato específico como, por ejemplo, caracteres en mayúscula, o

bien puede buscar caracteres especiales como, por ejemplo, dígitos o caracteres de puntuación.

Se soporta todo el juego de clases de carácter POSIX. Utilice la sintaxis [:class:] donde class es

el nombre de la clase de carácter POSIX que se debe buscar. Las siguientes expresiones

normales buscan uno o más caracteres consecutivos en mayúsculas: [[:upper:]]+.

Introducción a Oracle 10g: SQL Fundamentals II

259

Page 260: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 260/354

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

SELECT REGEXP_SUBSTR(street_address , ' [^ ]+ ')"Road" FROM locations;

Ejemplo de Extracción de Subcadenas

Ejemplo de Extracción 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 función REGEXP_SUBSTR. En la expresión utilizada en la consulta '[^ ]+ ':

• [ inicia la expresión

• ^ indica NO

• indica espacio

• ] finaliza la expresión

• + indica 1 o más• indica espacio

Introducción a Oracle 10g: SQL Fundamentals II

260

Page 261: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 261/354

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

SELECT REGEXP_REPLACE( country_name, '(.)','\1 ') "REGEXP_REPLACE"

FROM countries;

Sustitución de Patrones

Sustitución de Patrones

En este ejemplo se examina COUNTRY_NAME. La base de datos Oracle reformatea este

patrón con un espacio después de cada carácter no nulo de la cadena. Se muestran los

resultados.

Introducción a Oracle 10g: SQL Fundamentals II

261

Page 262: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 262/354

Page 263: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 263/354

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

.

Resumen

En esta lección, ha aprendido a utilizar el soporte deexpresiones normales en SQL y PL/SQL para buscar,hacer corresponder y sustituir cadenas siempre entérminos de expresiones normales.

Resumen

En esta lección, ha aprendido a utilizar las funciones de soporte de expresiones normales que

se han introducido en la base de datos Oracle 10g .

Introducción a Oracle 10g: SQL Fundamentals II

263

Page 264: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 264/354

Page 265: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 265/354

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

Práctica 81. Escriba una consulta para buscar en la tabla EMPLOYEES todos los empleados cuyos

nombres empiecen por “Ne” o “Na”.

2. Cree una consulta que elimine los espacios de la columna STREET_ADDRESS de la

tabla LOCATIONS en la visualización.

Introducción a Oracle 10g: SQL Fundamentals II

265

Page 266: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 266/354

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

Práctica 8 (continuación)3. Cree una consulta que muestre “St” sustituido por “Street” en la columna STREET_

ADDRESS de la tabla LOCATIONS. Procure que no afecte a ninguna fila que ya

contenga “Street”. Muestre sólo las filas que se vean afectadas.

Introducción a Oracle 10g: SQL Fundamentals II

266

Page 267: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 267/354

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

Introducción a Oracle 10g: SQL Fundamentals II

267

Page 268: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 268/354

 ____________________________ 

Apéndice A

Soluciones a la Práctica____________________________  

Introducción a Oracle 10g: SQL Fundamentals II

268

Page 269: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 269/354

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

Práctica 1: Soluciones

Para contestar a la pregunta 6 y a las posteriores, se deberá conectar a la base de datos

mediante iSQL*Plus. Para ello, inicie el explorador Internet Explorer desde el escritorio

del cliente. Introduzca la dirección URL en formato http://machinename:5561/isqlplus/  y

utilice la cuenta oraxx y la contraseña y el identificador de servicio correspondientes (en

formato Tx) que le proporcione el instructor para conectarse a la base de datos.

1. ¿Qué privilegio se debe otorgar a un usuario para conectarse a Oracle Server? ¿Se

trata de un privilegio de objeto o del sistema?

El privilegio del sistema CREATE SESSION  

2. ¿Qué privilegio se debe otorgar a un usuario para crear tablas?

El privilegio CREATE TABLE 

3. Si crea una tabla, ¿quién puede transferir privilegios a otros usuarios en su tabla?

Puede hacerlo usted mismo o cualquier usuario a quien haya otorgado dichos

privilegios mediante WITH GRANT OPTION .

4. Usted es el DBA. Está creando muchos usuarios que requieren los mismos privilegios

del sistema.

¿Qué debería utilizar para facilitar el trabajo?

Crear un rol que contenga los privilegios del sistema y otorgar el rol a los

usuarios.

5. ¿Qué comando se utiliza para cambiar la contraseña?

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 selectON departmentsTO <user1>;

Team 1 executes the GRANT statement.

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

Introducción a Oracle 10g: SQL Fundamentals II

269

Page 270: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 270/354

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

Práctica 1: Soluciones (continuación)

8. Agregue una nueva fila a su tabla DEPARTMENTS. El equipo 1 debe agregar 

Education como departamento número 500. El equipo 2 debe agregar Human

Resources como departamento número 510. Consulte la tabla del otro equipo.

Team 1 executes this INSERT statement. 

INSERT INTO departments(department_id, department_name)VALUES (500, 'Education');

COMMIT;

Team 2 executes this INSERT statement. 

INSERT INTO departments(department_id, department_name)

VALUES (510, 'Human Resources');

COMMIT;

9. Cree un sinónimo para la tabla DEPARTMENTS del otro equipo.

Team 1 creates a synonym named team2. 

CREATE SYNONYM team2FOR <oraxx>.DEPARTMENTS;

Team 2 creates a synonym named team1. 

CREATE SYNONYM team1FOR <oraxx>. DEPARTMENTS;

10. Consulte todas las filas de la tabla DEPARTMENTS del otro equipo mediante el

sinónimo.

Team 1 executes this SELECT statement. 

SELECT *

FROM team2;

Team 2 executes this SELECT statement. 

SELECT *

FROM team1;

Introducción a Oracle 10g: SQL Fundamentals II

270

Page 271: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 271/354

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

Práctica 1: Soluciones (continuación)

11. Consulte el diccionario de datos USER_TABLES para ver información sobre las

tablas que son de su propiedad.

SELECT table_nameFROM user_tables;

12. Consulte la vista de diccionario de datos ALL_TABLES para ver información sobre

todas las tablas a las que puede acceder. Excluya las tablas de su propiedad.

SELECT table_name, ownerFROM all_tablesWHERE owner <> 'Oraxx';

13. Revoque el privilegio SELECT del otro equipo.

Team 1 revokes the privilege. 

REVOKE selectON departmentsFROM <oraxx>; 

Team 2 revokes the privilege. 

REVOKE selectON departmentsFROM <oraxx>;

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; 

Introducción a Oracle 10g: SQL Fundamentals II

271

Page 272: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 272/354

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

Práctica 2: Soluciones

1. Cree la tabla DEPT2 basada en el siguiente diagrama de instancia de tabla. Guarde la

sintaxis en un archivo de comandos denominado lab_02_01.sql y, a

continuación, ejecute la sentencia en el archivo de comandos para crear la tabla.

Confirme que la tabla se ha creado.

CREATE TABLE dept2

(id NUMBER(7),

name VARCHAR2(25));

DESCRIBE dept2 

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

columnas que necesite.

INSERT INTO dept2SELECT department_id, department_nameFROM 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

continuación, ejecute la sentencia en el archivo de comandos para crear la tabla.

Confirme que la tabla se ha creado.

Column Name ID NAME

Key Type

Nulls/Unique

FK Table

FK Column

Data type NUMBER VARCHAR2

Length 7 25

Introducción a Oracle 10g: SQL Fundamentals II

272

Page 273: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 273/354

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

Práctica 2: Soluciones (continuación)

CREATE TABLE emp2

(id NUMBER(7),

last_name VARCHAR2(25),

first_name VARCHAR2(25),dept_id NUMBER(7));

DESCRIBE emp2

4. Modifique la tabla EMP2 para permitir apellidos de empleado más largos. Confirme

la modificación.

ALTER TABLE emp2

MODIFY (last_name VARCHAR2(50));

DESCRIBE emp2 

5. Confirme que las tablas DEPT2 y EMP2 se han almacenado en el diccionario de

datos. (Indicación: USER_TABLES)

SELECT table_name

FROM user_tables

WHERE table_name IN ('DEPT2', 'EMP2'); 

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

Incluya sólo las columnas EMPLOYEE_ID, FIRST_NAME, LAST_NAME, SALARY 

y DEPARTMENT_ID. Asigne a las columnas de la nueva tabla los nombres ID,

FIRST_NAME, LAST_NAME, SALARY y DEPT_ID, respectivamente.

CREATE TABLE employees2 ASSELECT employee_id id, first_name, last_name, salary,

department_id dept_id FROM employees; 

7. Borre la tabla EMP2.

DROP TABLE emp2;

Introducción a Oracle 10g: SQL Fundamentals II

273

Page 274: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 274/354

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

Práctica 2: Soluciones (continuación)

8. Consulte la papelera de reciclaje para comprobar si está la tabla.

SELECT original_name, operation, droptimeFROM recyclebin; 

9. Anule el borrado de la tabla EMP2.

FLASHBACK TABLE emp2 TO BEFORE DROP;DESC emp2; 

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

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

ALTER TABLE employees2 

DROP COLUMN first_name; 

DESCRIBE employees2 

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

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

ALTER TABLE employees2 

SET UNUSED (dept_id); 

DESCRIBE employees2 

12. Borre todas las columnas UNUSED de la tabla EMPLOYEES2. Confirme la

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

ALTER TABLE employees2

DROP UNUSED COLUMNS;

DESCRIBE employees2

Introducción a Oracle 10g: SQL Fundamentals II

274

Page 275: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 275/354

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

Práctica 2: Soluciones (continuación)

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

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

creación. Asigne a la restricción el nombre my_emp_id_pk.

ALTER TABLE emp2ADD CONSTRAINT my_emp_id_pk PRIMARY KEY (id);

14. Cree una restricción PRIMARY KEY a la tabla DEPT2 mediante la columna ID. Se

debe asignar un nombre a la restricción en el momento de la creación. Asigne a la

restricción el nombre my_dept_id_pk.

ALTER TABLE dept2ADD CONSTRAINT my_dept_id_pk PRIMARY KEY(id);

15. Agregue una referencia de clave ajena en la tabla EMP2 que asegure que el empleado

no está asignado a un departamento inexistente. Asigne a la restricción el nombremy_emp_dept_id_fk.

ALTER TABLE emp2

ADD CONSTRAINT my_emp_dept_id_fk

FOREIGN KEY (dept_id) REFERENCES dept2(id);

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 constraint_name, constraint_typeFROM user_constraintsWHERE 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 object_name, object_typeFROM user_objectsWHERE object_name LIKE 'EMP%'OR 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, precisión 2, escala 2. Agregue una restricción a la columna COMMISSION 

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

ALTER TABLE emp2

ADD commission NUMBER(2,2)

CONSTRAINT my_emp_comm_ck CHECK (commission > 0);

Introducción a Oracle 10g: SQL Fundamentals II

275

Page 276: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 276/354

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

Práctica 2: Soluciones (continuación)

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

papelera de reciclaje.

DROP TABLE emp2 PURGE;DROP TABLE dept2 PURGE;

SELECT original_name, operation, droptimeFROM recyclebin;

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

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

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

Column Name Deptno Dname

Primary Key Yes

Data Type Number VARCHAR2

Length 4 30

Introducción a Oracle 10g: SQL Fundamentals II

276

Page 277: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 277/354

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

Práctica 3: Soluciones

1. Ejecute el archivo de comandos lab_03_01.sql en la carpeta de prácticas para

crear la tabla SAL_HISTORY.

2. Muestre la estructura de la tabla SAL_HISTORY. 

DESC sal_history 

3. Ejecute el archivo de comandos lab_03_03.sql en la carpeta de prácticas para

crear la tabla MGR_HISTORY. 

4. Muestre la estructura de la tabla MGR_HISTORY. 

DESC mgr_history

5. Ejecute el archivo de comandos lab_03_05.sql en la carpeta de prácticas para

crear la tabla SPECIAL_SAL. 

6. Muestre la estructura de la tabla SPECIAL_SAL.

DESC special_sal

7. a. Escriba una consulta para: 

- Recuperar los detalles de identificador de empleado, fecha de contratación,

salario e identificador de supervisor de los empleados cuyo identificador es

menor que 125 en la tabla EMPLOYEES.

- Si el salario es mayor que 20.000 dólares, insertar los detalles de identificador 

de empleado y salario en la tabla SPECIAL_SAL.

- Insertar los detalles de identificador de empleado, fecha de contratación 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 ALLWHEN 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,

Introducción a Oracle 10g: SQL Fundamentals II

277

Page 278: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 278/354

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

Práctica 3: Soluciones (continuación)

salary SAL, manager_id MGR

FROM employees

WHERE employee_id < 125; 

b. Muestre los registros de la tabla SPECIAL_SAL.

SELECT * FROM special_sal;

c. Muestre los registros de la tabla SAL_HISTORY.

SELECT * FROM sal_history;

d. Muestre los registros de la tabla MGR_HISTORY. 

SELECT * FROM mgr_history;

8. a. Ejecute el archivo de comandos lab_03_08a.sql en la carpeta

de prácticas para crear la tabla SALES_SOURCE_DATA. 

b. Ejecute el archivo de comandos lab_03_08b.sql en la carpeta de

prácticas para insertar registros en la tabla SALES_SOURCE_DATA.

c. Muestre la estructura de la tabla SALES_SOURCE_DATA. 

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 prácticas para crear la tabla SALES_INFO. 

f. Muestre la estructura de la tabla SALES_INFO. 

DESC sales_info

Introducción a Oracle 10g: SQL Fundamentals II

278

Page 279: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 279/354

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

Práctica 3: Soluciones (continuación)

g. Escriba una consulta para: 

- Recuperar los detalles de identificador de empleado, identificador de semana,

ventas el lunes, ventas el martes, ventas el miércoles, ventas el jueves y ventas

el viernes de la tabla SALES_SOURCE_DATA.

- Crear tal transformación que cada registro recuperado de la tabla

SALES_SOURCE_DATA se convierta en varios registros para la tabla

SALES_INFO.

Indicación: Utilice una sentencia INSERT de pivoting.

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

h. Muestre los registros de la tabla SALES_INFO.

SELECT * FROM sales_info;

9. Tiene almacenados los datos de empleados antiguos en un archivo plano denominadoemp.data. Desea almacenar los nombres y los identificadores de correo electrónico

de todos los empleados antiguos y actuales en una tabla. Para ello, cree primero una

tabla externa denominada EMP_DATA mediante el archivo de origen emp.dat en el

directorio emp_dir. Para ello, puede utilizar el archivo de comandos

lab_03_09.sql. 

Introducción a Oracle 10g: SQL Fundamentals II

279

Page 280: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 280/354

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

Práctica 3: Soluciones (continuación)

CREATE TABLE emp_data(first_name VARCHAR2(20),last_name VARCHAR2(20), email VARCHAR2(30)

)ORGANIZATION EXTERNAL(TYPE oracle_loaderDEFAULT DIRECTORY emp_dirACCESS PARAMETERS(RECORDS DELIMITED BY NEWLINE CHARACTERSET US7ASCIINOBADFILENOLOGFILEFIELDS( first_name POSITION ( 1:20) CHAR

, last_name POSITION (22:41) CHAR, email POSITION (43:72) CHAR ))LOCATION ('emp.dat') ) ;

10. A continuación, ejecute el archivo de comandos lab_03_10.sql para crear la tabla

EMP_HIST.

a. Aumente el tamaño de la columna de correo electrónico a 45.

b. Fusione los datos de la tabla EMP_DATA creada en la última práctica en los datos de

la tabla EMP_HIST. Supongamos que los datos de la tabla externa EMP_DATA son

los más actualizados. Si una fila de la tabla EMP_DATA se corresponde con la tabla

EMP_HIST, actualice la columna de correo electrónico de la tabla EMP_HIST parahacerla corresponder con la fila de la tabla EMP_DATA. Si una fila de la tabla

EMP_DATA no encuentra correspondencia, insértela en la tabla EMP_HIST. Se

considera que las filas se corresponden cuando el nombre y el apellido del empleado

son idénticos.

MERGE INTO EMP_HIST f USING EMP_DATA hON (f.first_name = h.first_nameAND f.last_name = h.last_name)

WHEN MATCHED THEN 

UPDATE SET f.email = h.emailWHEN NOT MATCHED THEN INSERT (f.first_name

, f.last_name, f.email)

VALUES (h.first_name, h.last_name, h.email); 

Introducción a Oracle 10g: SQL Fundamentals II

280

Page 281: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 281/354

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

Práctica 3: Soluciones (continuación)

c. Recupere las filas de EMP_HIST después de la fusión.

SELECT * FROM emp_hist;

11. Cree la tabla EMP3 mediante el archivo de comandos lab_03_11.sql. En la tabla

EMP3, cambie el departamento de Kochhar a 60 y valide el cambio. A continuación,

cambie el departamento de Kochhar a 50 y valide el cambio. Realice un seguimiento

de los cambios efectuados en Kochhar mediante la función de versiones de filas.

SELECT VERSIONS_STARTTIME "START_DATE",VERSIONS_ENDTIME "END_DATE", DEPARTMENT_ID

FROM EMP3VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE

WHERE LAST_NAME ='Kochhar';

Introducción a Oracle 10g: SQL Fundamentals II

281

Page 282: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 282/354

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

Práctica 4: Soluciones

1. Escriba una consulta para mostrar lo siguiente para los empleados cuyo identificador 

de supervisor sea menor que 120:

- Identificador de supervisor 

- Identificador de puesto y salario total de todos los identificadores de puesto de

los empleados que estén a las órdenes del mismo supervisor - Salario total de esos supervisores

- Salario total de esos supervisores, independientemente de los identificadores de

puesto

SELECT manager_id,job_id,sum(salary)

FROM employees

WHERE manager_id < 120

GROUP BY ROLLUP(manager_id,job_id);

2. Observe la salida de la pregunta 1. Escriba una consulta mediante la funciónGROUPING para determinar si los valores NULL de las columnas correspondientes a

las expresiones GROUP BY los genera la operación ROLLUP.

SELECT manager_id MGR ,job_id JOB,

sum(salary),GROUPING(manager_id),GROUPING(job_id)

FROM employees

WHERE manager_id < 120

GROUP BY ROLLUP(manager_id,job_id);

3. Escriba una consulta para mostrar lo siguiente para los empleados cuyo identificador de supervisor sea menor que 120:

- Identificador de supervisor 

- Puesto y salarios totales de todos los puestos de empleados que estén a las

órdenes del mismo supervisor 

- Salario total de esos supervisores

- Valores desde varias tablas para mostrar el salario total de todos los puestos,

independientemente del supervisor 

- Salario total independientemente de todos los cargos

SELECT manager_id, job_id, sum(salary)FROM employees

WHERE manager_id < 120

GROUP BY CUBE(manager_id, job_id); 

Introducción a Oracle 10g: SQL Fundamentals II

282

Page 283: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 283/354

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

Práctica 4: Soluciones (continuación)

4. Observe la salida de la pregunta 3. Escriba una consulta mediante la función

GROUPING para determinar si los valores NULL en las columnas correspondientes a

las expresiones GROUP BY los genera la operación CUBE.

SELECT manager_id MGR ,job_id JOB,sum(salary),GROUPING(manager_id),GROUPING(job_id)

FROM employees

WHERE manager_id < 120

GROUP BY CUBE(manager_id,job_id);

5. Mediante GROUPING SETS, escriba una consulta para mostrar los siguientes

agrupamientos:

- department_id, manager_id, job_id

- department_id, job_id

- manager_id, job_id

La consulta debe calcular la suma de los salarios para cada uno de estos grupos.

SELECT department_id, manager_id, job_id,  SUM(salary)FROM employeesGROUP BYGROUPING SETS ((department_id, manager_id, job_id),(department_id, job_id),(manager_id,job_id)); 

Introducción a Oracle 10g: SQL Fundamentals II

283

Page 284: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 284/354

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

Práctica 5: Soluciones

1. Modifique la sesión para definir NLS_DATE_FORMAT en DD-MON-YYYY

HH24:MI:SS.

ALTER SESSION SET NLS_DATE_FORMAT =

'DD-MON-YYYY HH24:MI:SS';

2. a. Escriba consultas para mostrar los offsets de zona horaria (TZ_OFFSET), para

las siguientes zonas horarias.

US/Pacific-New

SELECT TZ_OFFSET ('US/Pacific-New') from dual; 

Singapore

SELECT TZ_OFFSET ('Singapore') from dual;

Egypt 

SELECT TZ_OFFSET ('Egypt') from dual; 

b. Modifique la sesión para definir el valor del parámetro TIME_ZONE en el offset

de zona horaria US/Pacific-New.

ALTER SESSION SET TIME_ZONE = '-7:00'; 

c. Muestre los valores de CURRENT_DATE, CURRENT_TIMESTAMP y

LOCALTIMESTAMP para esta sesión.

Nota: La salida puede ser diferente, según la fecha en que se ejecute el comando.  

SELECT CURRENT_DATE, CURRENT_TIMESTAMP,LOCALTIMESTAMP FROM DUAL;

d. Modifique la sesión para definir el valor del parámetro 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 sesión.

Nota: La salida podría ser diferente, según la fecha en que se ejecute el comando.  

SELECT CURRENT_DATE, CURRENT_TIMESTAMP,LOCALTIMESTAMP FROM DUAL;

Introducción a Oracle 10g: SQL Fundamentals II

284

Page 285: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 285/354

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

Práctica 5: Soluciones (continuación)

Nota: Observe en la práctica anterior que CURRENT_DATE,

CURRENT_TIMESTAMP y LOCALTIMESTAMP son todos sensibles a la zona

horaria de la sesión.

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

SELECT DBTIMEZONE,SESSIONTIMEZONE

FROM DUAL; 

4. Escriba una consulta para extraer el valor de YEAR de la columna HIRE_DATE de la

tabla EMPLOYEES para los empleados que trabajan en el departamento 80.

SELECT last_name, EXTRACT (YEAR FROM HIRE_DATE)

FROM employees

WHERE department_id = 80;

5. Modifique la sesión para definir NLS_DATE_FORMAT en DD-MON-YYYY.

ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY';

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 cámbielo 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 cámbielo a

TIMESTAMP WITH TIME ZONE

. ¿Qué sucede?

ALTER TABLE sample_dates MODIFY date_colTIMESTAMP 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 TIMESTAMPWITH TIMEZONE mediante la sentencia ALTER.

Introducción a Oracle 10g: SQL Fundamentals II

285

Page 286: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 286/354

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

Práctica 5: Soluciones (continuación)

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

de revisión. Si el año de contratación fue 2000, muestre Needs Review para el

estado de revisión, si no, muestre not this year!. Asigne a la columna de estado

de revisión el nombre Review. Ordene los resultados por la columna HIRE_DATE.

Indicación: Utilice una expresión CASE con la función EXTRACT para calcular el

estado de revisión. 

SELECT e.last_name, (CASE extract(year from e.hire_date)

WHEN 1998 THEN 'Needs Review'ELSE 'not this year!'END ) AS "Review "

FROM employees eORDER BY e.hire_date;

8. Cree una consulta para imprimir los apellidos y el número de años de servicio paracada empleado. Si el empleado lleva contratado cinco años o más, imprima 5 years

of service. Si el empleado lleva contratado 10 años o más, imprima 10 years

of service. Si el empleado lleva contratado 15 años o más, imprima 15 years

of service. Si no se cumple ninguna de estas condiciones, imprima maybe

next year!. Ordene los resultados por la columna HIRE_DATE. Utilice la tabla

EMPLOYEES.

Indicación: Utilice TO_YMINTERVAL y expresiones CASE. 

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;

Introducción a Oracle 10g: SQL Fundamentals II

286

Page 287: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 287/354

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

Práctica 6: Soluciones

1. Escriba una consulta para mostrar el apellido, el número de departamento y el salario

de cualquier empleado cuyo número de departamento y salario se correspondan con el

número de departamento y el salario de cualquier empleado que gane una comisión.

SELECT last_name, department_id, salary

FROM employeesWHERE (salary, department_id) IN 

(SELECT salary, department_idFROM employees

WHERE commission_pct IS NOT NULL); 

2. Muestre el apellido, el número de departamento y el salario de cualquier empleado

cuyo salario y comisión se correspondan con el salario y la comisión de cualquier 

empleado con el identificador de ubicación 1700.

SELECT e.last_name, d.department_name, e.salaryFROM employees e, departments dWHERE e.department_id = d.department_idAND (salary, NVL(commission_pct,0)) IN 

(SELECT salary, NVL(commission_pct,0)FROM employees e, departments dWHERE e.department_id = d.department_idAND d.location_id = 1700);

3. Cree una consulta para mostrar el apellido, la fecha de contratación y el salario de

todos los empleados que tengan el mismo salario y la misma comisión que Kochhar.

Nota: No muestre a Kochhar en el juego de resultados. 

SELECT last_name, hire_date, salaryFROM employeesWHERE (salary, NVL(commission_pct,0)) IN 

(SELECT salary, NVL(commission_pct,0)FROM employeesWHERE last_name = 'Kochhar')

AND last_name != 'Kochhar';

Introducción a Oracle 10g: SQL Fundamentals II

287

Page 288: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 288/354

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

Práctica 6: Soluciones (continuación)

4. Cree una consulta para mostrar los empleados que ganen un salario que sea más alto

que el salario de todos los supervisores de ventas (JOB_ID = 'SA_MAN'). Ordene

los resultados por salario en orden descendente. 

SELECT last_name, job_id, salary

FROM employeesWHERE salary > ALL(SELECT salaryFROM 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 employeesWHERE department_id IN (SELECT department_id

FROM departments

WHERE location_id IN 

(SELECT location_id

FROM locations

WHERE city LIKE 'T%'));

6. Escriba una consulta para buscar todos los empleados que ganen más que el salario

medio de su departamento. Muestre el apellido, el salario, el identificador de

departamento y el salario medio del departamento. Ordene por salario medio. Utilicealias 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);

Introducción a Oracle 10g: SQL Fundamentals II

288

Page 289: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 289/354

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

Práctica 6: Soluciones (continuación)

7. Busque todos los empleados que no sean supervisores.

a. Hágalo primero mediante el operador NOT EXISTS.

SELECT outer.last_name

FROM employees outerWHERE NOT EXISTS (SELECT 'X'

FROM employees inner

WHERE inner.manager_id =

outer.employee_id); 

b. ¿Esto se puede conseguir mediante el operador NOT IN? ¿Cómo o por qué no?

SELECT outer.last_name

FROM employees outerWHERE outer.employee_id 

NOT IN (SELECT inner.manager_id 

FROM employees inner); 

Esta solución 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);

Introducción a Oracle 10g: SQL Fundamentals II

289

Page 290: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 290/354

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

Práctica 6: Soluciones (continuación)

9. Escriba una consulta para mostrar los apellidos de los empleados que tienen uno o

más colegas en su departamento con fechas de contratación posteriores pero salarios

más altos.

SELECT last_name

FROM employees outer

WHERE EXISTS (SELECT 'X'

FROM employees inner

WHERE inner.department_id =

outer.department_id

AND inner.hire_date > outer.hire_date

AND inner.salary > outer.salary); 

10. Escriba una consulta para mostrar los identificadores de empleado, los apellidos, y los

nombres de departamento de todos los empleados.Nota: Utilice una subconsulta escalar para recuperar el nombre de departamento en la

sentencia SELECT.

SELECT employee_id, last_name,

(SELECT department_name

FROM departments d

WHERE e.department_id =

d.department_id ) department

FROM employees e

ORDER BY department;

11. Escriba una consulta para mostrar los nombres de departamento de los departamentos

cuyo costo de salario total supere un octavo (1/8) del costo de salario total de toda la

compañía. Utilice la cláusula WITH para escribir esta consulta. Asigne a la consulta el

nombre SUMMARY.

WITH

summary AS (

SELECT d.department_name, SUM(e.salary) AS dept_total

FROM employees e, departments dWHERE 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;

Introducción a Oracle 10g: SQL Fundamentals II

290

Page 291: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 291/354

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

Práctica 7: Soluciones

1. Observe los siguientes ejemplos de salida. ¿Son resultado de una consulta jerárquica?

Explique por qué o por qué no.

Imagen 1: No es una consulta jerárquica; el informe simplemente se

clasifica en orden descendente por SALARY.

Imagen 2: No es una consulta jerárquica; hay dos tablas implicadas.

Imagen 3: Sí, definitivamente se trata de una consulta jerárquica, ya que

muestra la estructura de árbol que representa la línea de supervisores de

la tabla EMPLOYEES.

2. Genere un informe que muestre un organigrama del departamento de Mourgos.

Imprima los apellidos, los salarios y los identificadores de departamento.

SELECT last_name, salary, department_id

FROM employeesSTART WITH last_name = 'Mourgos'

CONNECT BY PRIOR employee_id = manager_id;

3. Cree un informe que muestre la jerarquía 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 jerarquía de supervisores partiendo del

empleado cuyo LAST_NAME es Kochhar. Imprima el apellido del empleado, el

identificador de supervisor y el identificador de departamento. Asigne nombres de

alias a las columnas como se muestra en la salida de ejemplo.  

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 

Introducción a Oracle 10g: SQL Fundamentals II

291

Page 292: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 292/354

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

Práctica 7: Soluciones (continuación)

Si le queda tiempo, realice los siguientes ejercicios:

5. Genere un organigrama de la compañía que muestre la jerarquía de los supervisores.

Parta de la persona de nivel más alto, excluya a todas las personas con el identificador 

de puesto IT_PROG, a De Haan y a los empleados que estén a las órdenes de De Haan.

SELECT last_name,employee_id, manager_id

FROM employees

WHERE job_id != 'IT_PROG'

START WITH manager_id IS NULL

CONNECT BY PRIOR employee_id = manager_id

AND last_name != 'De Haan';

Introducción a Oracle 10g: SQL Fundamentals II

292

Page 293: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 293/354

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

Práctica 8: Soluciones

1. Escriba una consulta para buscar en la tabla EMPLOYEES todos los empleados cuyos

nombres empiecen por “Ne” o “Na”.

SELECT first_name, last_nameFROM employees

WHERE REGEXP_LIKE (first_name, '^N(e|a).');

2. Cree una consulta que elimine los espacios de la columna STREET_ADDRESS de la

tabla LOCATIONS en la visualización.

SELECT regexp_replace (street_address, ' ','')FROM locations;

3. Cree una consulta que muestre “St” sustituido por “Street” en la columna

STREET_ADDRESS de la tabla LOCATIONS.Procure que no afecte a ninguna fila

que ya contenga “Street”. Muestre sólo las filas que se vean afectadas.

SELECT REGEXP_REPLACE (street_address, 'St$','Street') FROM locations

WHERE REGEXP_LIKE (street_address, 'St');

Introducción a Oracle 10g: SQL Fundamentals II

293

Page 294: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 294/354

_____________________ 

Apéndice BDescripciones de

Tablas y Datos_____________________ 

Introducción a Oracle 10g: SQL Fundamentals II

294

Page 295: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 295/354

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

DIAGRAMA DE RELACIONES DE ENTIDADES

Introducción a Oracle 10g: SQL Fundamentals II

295

Page 296: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 296/354

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

Tablas del Esquema

SELECT * FROM tab;

Introducción a Oracle 10g: SQL Fundamentals II

296

Page 297: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 297/354

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

Tabla REGIONS

DESCRIBE regions

SELECT * FROM regions;

Introducción a Oracle 10g: SQL Fundamentals II

297

Page 298: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 298/354

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

Tabla COUNTRIES

DESCRIBE countries

SELECT * FROM countries;

Introducción a Oracle 10g: SQL Fundamentals II

298

Page 299: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 299/354

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

Tabla LOCATIONS

DESCRIBE locations;

SELECT * FROM locations;

Introducción a Oracle 10g: SQL Fundamentals II

299

Page 300: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 300/354

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

Tabla DEPARTMENTS

DESCRIBE departments

SELECT * FROM departments;

Introducción a Oracle 10g: SQL Fundamentals II

300

Page 301: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 301/354

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

Tabla JOBS

DESCRIBE jobs

SELECT * FROM jobs;

Introducción a Oracle 10g: SQL Fundamentals II

301

Page 302: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 302/354

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

Tabla EMPLOYEES

DESCRIBE employees

Introducción a Oracle 10g: SQL Fundamentals II

302

Page 303: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 303/354

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

Tabla EMPLOYEES

Las cabeceras de las columnas COMMISSION_PCT, MANAGER_ID y DEPARTMENT_ID

están definidas como COMM, MGRID y DEPTID en la siguiente captura de pantalla para que

se ajusten a los valores de la tabla a lo largo de la página.

SELECT * FROM employees;

Introducción a Oracle 10g: SQL Fundamentals II

303

Page 304: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 304/354

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

Tabla EMPLOYEES (continuación)

Introducción a Oracle 10g: SQL Fundamentals II

304

Page 305: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 305/354

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

Tabla EMPLOYEES (continuación)

Introducción a Oracle 10g: SQL Fundamentals II

305

Page 306: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 306/354

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

Tabla JOB_HISTORY

DESCRIBE job_history

SELECT * FROM job_history;

Introducción a Oracle 10g: SQL Fundamentals II

306

Page 307: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 307/354

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

Introducción a Oracle 10g: SQL Fundamentals II

307

Page 308: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 308/354

Escritura de Archivos de Comandos Avanzados

Introducción a Oracle 10g: SQL Fundamentals II

308

Page 309: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 309/354

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

Objetivos

Al finalizar este apéndice, debería estar capacitado

para:

• Describir el tipo de problemas que se solucionan

mediante SQL para generar SQL

• Escribir un archivo de comandos que genere unarchivo de comandos de sentencias DROP TABLE

• Escribir un archivo de comandos que genere unarchivo de comandos de sentencias INSERT INTO

Objetivos

En este apéndice, aprenderá a escribir un archivo de comandos SQL para generar un archivo

de comandos SQL.

Introducción a Oracle 10g: SQL Fundamentals II

309

Page 310: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 310/354

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

Uso de SQL para Generar SQL

• SQL se puede utilizar para generar archivos de

comandos en SQL

• El diccionario de datos:

– Es una recopilación de tablas y vistas que

contienen información de base de datos

– Oracle Server lo crea y lo mantiene

Archivo de comandos SQL

SQL Diccionario de datos

Uso de SQL para Generar SQL

SQL puede ser una potente herramienta para generar otras sentencias SQL. En la mayoría delos casos, esto implica la escritura de un archivo de comandos. Puede utilizar SQL desdeSQL para:

• Evitar codificación repetida• Acceder a información del diccionario de datos• Borrar o volver a crear objetos de base de datos• Generar predicados dinámicos que contengan parámetros de tiempo de ejecución

Los ejemplos utilizados en esta lección implican la selección de información del diccionariode datos. El diccionario de datos es una recopilación de tablas y vistas que contieneninformación sobre la base de datos. Oracle Server crea y mantiene esta recopilación. Todas lastablas de diccionario de datos son propiedad del usuario SYS. La información almacenada enel diccionario de datos incluye nombres de los usuarios de Oracle Server, privilegiosotorgados a los usuarios, nombres de objetos de base de datos, restricciones de tabla einformación de auditoría. Hay cuatro categorías de vistas de diccionario de datos. Cadacategoría tiene prefijos distintos que reflejan el uso para el que se ha concebido.

Prefijo Descripción

USER_  Contiene detalles de objetos propiedad del usuario 

ALL_  Contiene detalles de objetos para los que se le han otorgado derechos de acceso al usuario, además de

objetos propiedad del usuario

DBA_ Contiene detalles de usuarios con privilegios DBA para acceder a cualquier objeto de la base de datos

V$_ Información almacenada sobre rendimiento y bloqueo de servidor de bases de datos; sólo disponible

para el DBA

Introducción a Oracle 10g: SQL Fundamentals II

310

Page 311: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 311/354

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

Creación de un Archivo de Comandos Básico

SELECT 'CREATE TABLE ' || table_name ||'_test ' || 'AS SELECT * FROM '|| table_name ||' WHERE 1=2;'AS "Create Table Script"

FROM user_tables;

Archivo de Comandos Básico

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 sólo 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 dedatos de su propiedad. Las vistas de diccionario de datos utilizadas con frecuencia son:

• USER_TABLES: Muestra la descripción 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

Introducción a Oracle 10g: SQL Fundamentals II

311

Page 312: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 312/354

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

SPOOL dropem.sql

SPOOL OFF

Control del Entorno

Defina variables del

sistema en los valores

adecuados.

Vuelva a definir las

variables del sistema

en el valor por defecto.

SENTENCIA SQL

SET ECHO OFFSET FEEDBACK OFFSET PAGESIZE 0

SET FEEDBACK ON SET PAGESIZE 24SET ECHO ON 

Control del Entorno

Para ejecutar las sentencias SQL que se generan, las debe capturar en un archivo de spool que

se puede ejecutar a continuación. También debe planificar una limpieza de la salida que se

genera y asegurarse de suprimir elementos como, por ejemplo, cabeceras, mensajes de

feedback, títulos superiores, etc. Para ello, puede utilizar comandos de iSQL*Plus.

Introducción a Oracle 10g: SQL Fundamentals II

312

Page 313: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 313/354

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

La Imagen Completa

SET ECHO OFFSET FEEDBACK OFFSET PAGESIZE 0

SELECT 'DROP TABLE ' || object_name || ';'FROM user_objectsWHERE object_type = 'TABLE'

/

SET FEEDBACK ON SET PAGESIZE 24SET ECHO ON 

La Imagen Completa

La salida del comando de la diapositiva se guarda en un archivo denominado dropem.sql

mediante la opción de salida File de iSQL*Plus. El archivo contiene los siguientes datos.

Este archivo ya se puede iniciar desde iSQL*Plus. Para ello, localice el archivo de comandos,

cárguelo y ejecútelo.

Nota: Por defecto, los archivos se envían a la cola de espera a la carpeta ORACLE_HOME\

ORANT\BIN en Windows NT.

Introducción a Oracle 10g: SQL Fundamentals II

313

Page 314: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 314/354

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

Volcado del Contenido de una Tabla en

un Archivo

SET HEADING OFF ECHO OFF FEEDBACK OFFSET PAGESIZE 0

SELECT'INSERT INTO departments_test VALUES(' || department_id || ', ''' || department_name ||''', ''' || location_id || ''');'AS "Insert Statements Script"

FROM departments/

SET PAGESIZE 24SET 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 opción 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);

...

Introducción a Oracle 10g: SQL Fundamentals II

314

Page 315: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 315/354

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

Volcado del Contenido de una Tabla en

un Archivo

Origen

'''X'''

''''

''''||department_name||''''

''', '''

''');'

Resultado

'X'

'

'Administration'

','

');

Volcado del Contenido de una Tabla en un Archivo (continuación)

Posiblemente le ha llamado la atención el gran número de comillas simples que hay en la

diapositiva de la página anterior. Un juego de cuatro comillas simples genera una comilla

simple en la sentencia final. Además, 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 actúa como prefijo para mostrar la tercera comilla. Así, el

resultado es una comilla simple seguida del paréntesis y seguido del punto y coma.

Introducción a Oracle 10g: SQL Fundamentals II

315

Page 316: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 316/354

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

Generación de un Predicado Dinámico

COLUMN my_col NEW_VALUE dyn_where_clause

SELECT DECODE('&&deptno', null,DECODE ('&&hiredate', null, ' ','WHERE hire_date=TO_DATE('''||'&&hiredate'',''DD-MON-YYYY'')'),DECODE ('&&hiredate', null,'WHERE department_id = ' || '&&deptno','WHERE department_id = ' || '&&deptno' ||

' AND hire_date = TO_DATE('''||'&&hiredate'',''DD-MON-YYYY'')'))AS my_col FROM dual;

SELECT last_name FROM employees &dyn_where_clause;

Generación de un Predicado Dinámico

El ejemplo de la diapositiva genera una sentencia SELECT que recupera datos de todos los

empleados de un departamento que se contrataron un día específico. El archivo de comandos

genera la cláusula WHERE dinámicamente.

Nota: Una vez volcada la variable de usuario, debe utilizar el comando UNDEFINE para

suprimirlo.

La primera sentencia SELECT le pide que introduzca el número de departamento. Si no

introduce ningún número de departamento, la función DECODE lo considera nulo y se pediráal usuario la fecha de contratación. Si no introduce ninguna fecha de contratación, la función

DECODE la considera nula y la cláusula WHERE dinámica que se genera será también 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 título superior. Debe incluir la columna en

un comando BREAK con la acción 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 página.

Introducción a Oracle 10g: SQL Fundamentals II

316

Page 317: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 317/354

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

Generación de un Predicado Dinámico (continuación)

Nota: Aquí, la fecha de contratación se debe introducir en formato DD-MON-YYYY.

La sentencia SELECT de la diapositiva anterior se puede interpretar así:IF (<<deptno>> is not entered) THEN

IF (<<hiredate>> is not entered) THEN

return empty string

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

Se genera el siguiente valor para MY_COL:

Cuando se ejecuta el segundo ejemplo de la diapositiva, se genera la siguiente salida:

Introducción a Oracle 10g: SQL Fundamentals II

317

Page 318: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 318/354

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

Resumen

En este apéndice, ha aprendido lo siguiente:

• Puede escribir un archivo de comandos SQL para

generar otro archivo de comandos SQL.

• Los archivos de comandos utilizan a menudo el

diccionario de datos.

• Puede capturar la salida en un archivo.

Resumen

SQL se puede utilizar para generar archivos de comandos SQL. Estos archivos de comandos

se pueden utilizar para evitar una codificación repetida, borrar o volver a crear objetos,

obtener ayuda del diccionario de datos y generar predicados dinámicos que contengan

parámetros de tiempo de ejecución.

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 supresión de

cabeceras, mensajes de feedback, etc.

Introducción a Oracle 10g: SQL Fundamentals II

318

Page 319: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 319/354

Page 320: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 320/354

Componentes de la Arquitectura Oracle

Introducción a Oracle 10g: SQL Fundamentals II

320

Page 321: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 321/354

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

Objetivos

Al finalizar este apéndice, debería estar capacitadopara:

• Describir la arquitectura de Oracle Server y suscomponentes principales

• Mostrar las estructuras implicadas en la conexiónde un usuario a una instancia Oracle

• Enumerar las etapas de procesamiento:– Consultas

– Sentencias DML

– Validaciones

Objetivos

En este apéndice se presenta la arquitectura de Oracle Server. Para ello, se describen lasestructuras de archivos, procesos y memoria implicados en el establecimiento de unaconexión a base de datos y en la ejecución de un comando SQL.

Introducción a Oracle 10g: SQL Fundamentals II

321

Page 322: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 322/354

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

Arquitectura de la Base de Datos Oracle:Visión General

La base de datos Oracle consta de dos componentesprincipales:

• Base de datos o estructuras físicas

• Instancia o estructuras de memoria

Arquitectura de la Base de Datos Oracle: Visión General

La base de datos Oracle consta de dos componentes principales: La instancia y la base dedatos propiamente dicha.

• La base de datos se compone de archivos físicos como, por ejemplo:- Archivo de control, donde se almacena la configuración de la base de datos- Archivos redo log que tienen información necesaria para la recuperación de la base

de datos- Archivos de datos, donde se almacenan todos los datos

- Archivo de parámetros, que contiene los parámetros que controlan el tamaño y laspropiedades de una instancia

- Archivo de contraseñas, que contiene la contraseña del superusuario o SYSDBA• La instancia se compone de la SGA (Área Global del Sistema) y los procesos del

servidor que realizan tareas dentro de la base de datos.

Introducción a Oracle 10g: SQL Fundamentals II

322

Page 323: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 323/354

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

.

Arquitectura Física de la Base de Datos

Archivos de datos Archivos redo log en línea

Archivo decontraseñas

Archivo deparámetros

Archivos de control

Archivos logarchivados

Arquitectura Física 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. Sinellos, 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 línea: Estos archivos permiten la recuperación de la instancia de

la base datos. Si la base de datos fallase sin perder ningún archivo de datos, la instancia

podrá recuperar la base de datos con la información de estos archivos.Hay otros archivos que no forman parte oficialmente de la base de datos pero que sonimportantes para la correcta ejecución de la base de datos. Éstos son:

• Archivo de parámetros: Se utiliza para definir cómo se configurará la instancia aliniciarse.

• Archivo de contraseñas: Este archivo permite a los usuarios conectarse a la base dedatos de manera remota y realizar tareas administrativas.

• Archivos log archivados: Estos archivos contienen un historial continuado del redogenerado por la instancia. Estos archivos permiten la recuperación 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.

Introducción a Oracle 10g: SQL Fundamentals II

323

Page 324: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 324/354

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

Archivos de control

• Contienen información de la estructura física de labase de datos

• Se multiplexan para proteger contra pérdidas

• Se leen en la etapa de montaje

Archivos de control

Archivos de control

Al iniciar la instancia y montar la base de datos, se lee el archivo de control. Las entradas delarchivo de control especifican los archivos físicos que componen la base de datos.

Al agregar archivos adicionales a la base de datos, el archivo de control se actualizaautomáticamente.

La ubicación de los archivos de control se especifica en un parámetro de inicialización.

Para protegerse de un fallo de la base de datos debido a la pérdida del archivo de control,

debería multiplexar el archivo de control en al menos tres dispositivos físicos distintos. Siespecifica varios archivos a través del parámetro de inicialización, el servidor de bases dedatos Oracle puede mantener varias copias del archivo de control.

Introducción a Oracle 10g: SQL Fundamentals II

324

Page 325: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 325/354

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

Archivos Redo Log

• Registran los cambios realizados en la base de datos

• Se multiplexan para proteger contra pérdidas

Buffer deredo log

LGWR

(Escritor de Log)

Grupo 1 Grupo 2 Grupo 3

Archivos Redo Log

Los archivos redo log se utilizan para registrar cambios realizados en la base de datos comoresultado de transacciones y acciones internas del servidor de bases de datos Oracle. Protegenla base de datos de la pérdida de integridad debida a fallos del sistema provocados por corteseléctricos, fallos de disco, etc. Los archivos redo log se deben multiplexar para asegurarse deque la información almacenada en ellos no se perderá en caso de que se produzca un fallode disco.

El redo log se compone de grupos de archivos redo log. Un grupo consiste en un archivo redolog y sus copias multiplexadas. Se dice que cada copia idéntica es un miembro de ese grupo ycada grupo se identifica con un número. LGWR (Proceso de escritor de log) escribe registrosredo del buffer de redo log en un grupo de redo log hasta que se rellene el archivo o se soliciteuna operación de cambio de log. A continuación, cambia y se escribe en los archivos delgrupo siguiente. Los archivos redo log se utilizan de forma circular.

Introducción a Oracle 10g: SQL Fundamentals II

325

Page 326: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 326/354

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

Tablespaces y Archivos de Datos

• Los tablespaces constan de uno o más archivosde datos.

• Los archivos de datos pertenecen a un solotablespace.

Tablespace USERS

Archivo dedatos 1

Archivo dedatos 2

Tablespaces y Archivos de Datos

Una base de datos se divide en unidades de almacenamiento lógicas denominadas tablespaces,que se pueden utilizar para agrupar estructuras lógicas relacionadas. Cada base de datos sedivide lógicamente en uno o más tablespaces. Se crean uno o más archivos de datosexplícitamente para cada tablespace para almacenar físicamente los datos de todas lasestructuras lógicas de un tablespace.

Nota: También puede crear tablespaces bigfile, que son tablespaces con un archivo dedatos único, pero muy grande (de bloques de hasta 4 GB). Los tablespaces tradicionalessmallfile (por defecto) pueden contener varios archivos de datos, pero los archivos nopueden ser tan grandes. Para obtener más información sobre tablespaces bigfile, consulteDatabase Administrator’s Guide.

Introducción a Oracle 10g: SQL Fundamentals II

326

Page 327: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 327/354

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

Segmentos, Extensiones y Bloques

• Los segmentos existen dentro de un tablespace.• Los segmentos se componen de una recopilación de

extensiones.

• Las extensiones son una recopilación de bloques dedatos.

• Los bloques de datos se asignan a bloques de sistemaoperativo.

Segmento Extensiones Bloquesde datos

Bloques desistema operativo

Segmentos, Extensiones y Bloques

Los objetos de base de datos como por ejemplo, tablas e índices, se almacenan en tablespacescomo segmentos. Cada segmento contiene una o más extensiones. Una extensión consiste enbloques de datos contiguos, lo que significa que cada extensión sólo puede existir en unarchivo de datos. Los bloques de datos son la unidad más pequeña de E/S de la base de datos.

Cuando la base de datos solicita un juego de bloques de datos del sistema operativo, éste loasigna al bloque de sistema operativo real del dispositivo de almacenamiento. Por esto, no esnecesario conocer la dirección física de ninguno de los datos de la base de datos. Esto tambiénsignifica que un archivo de datos se puede segmentar o duplicar en varios discos.

El tamaño del bloque de datos se puede definir en el momento de la creación de la base dedatos. El tamaño por defecto de 8 K es adecuado para la mayoría de bases de datos. Si la basede datos soporta una aplicación de almacén de datos que tiene tablas e índices grandes, puederesultar conveniente un bloque mayor. Si la base de datos soporta una aplicación transaccionalen la que las lecturas y escrituras son muy aleatorias, puede resultar más adecuado especificar un tamaño de bloque menor. El tamaño máximo de bloque depende del sistema operativo. Eltamaño mínimo de bloque es 2 K y se debería utilizar en raras ocasiones (o nunca).

Puede tener tablespaces con diferentes tamaños de bloque. Generalmente, esto sólo se debería

utilizar para soportar tablespaces transportables. Para obtener detalles, consulte DatabaseAdministrator’s Guide.

Introducción a Oracle 10g: SQL Fundamentals II

327

Page 328: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 328/354

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

.

Gestión de Instancias Oracle

SMON(Monitor del

Sistema)

DBW0(Escritor deBase deDatos)

LGWR(Escritor de Log)

PMON(Monitor de

Procesos)

ARC0(Proceso deArchivado)

SGA

Pool Java

Poolcompartido

Pool grandePool paraStreams

Caché debuffers de la

base de datos

Buffer deredo log

Punto decontrolCKPT

Gestión de Instancias Oracle

Un servidor de bases de datos Oracle está formado por una base de datos Oracle y unainstancia Oracle. Una instancia Oracle se compone de buffers de memoria conocidos comoSGA (Área Global del Sistema) y procesos en segundo plano.

La instancia está inactiva (no existente) hasta que se inicia. Cuando se inicia la instancia, selee un archivo de parámetros de inicialización y la instancia se configura de la maneracorrespondiente.

Una vez iniciada la instancia y abierta la base de datos, los usuarios pueden acceder a la basede datos.

Introducción a Oracle 10g: SQL Fundamentals II

328

Page 329: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 329/354

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

Estructuras de Memoria Oracle

Pool JavaCaché de

buffers de labase de datos

Buffer deredo log

Pool

compartidoPool grande

SGA

Pool para

Streams

Procesodel

servidor 1PGA

Procesodel

servidor 2PGA

Proceso ensegundo

planoPGA

Estructuras de Memoria Oracle

Las estructuras de memoria básicas asociadas a una instancia Oracle son:• SGA (Área Global del Sistema): Compartida por el servidor y los procesos en

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 einformación 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 información de redo (utilizada para la

recuperación de la instancia) hasta que se pueda escribir en los archivos redo log físicosalmacenados en disco

• Pool compartido: Almacena varias construcciones que se pueden compartir entreusuarios

• Pool grande: Área opcional utilizada para almacenar en buffer solicitudes grandesde E/S

• Pool Java: Utilizado para el código Java específico de sesión y los datos dentro de JVM(Java Virtual Machine)

• Pool para Streams: Utilizado por Oracle Streams

Introducción a Oracle 10g: SQL Fundamentals II

329

Page 330: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 330/354

Page 331: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 331/354

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

Procesos Oracle

SMONMonitor del

sistema

DBW0Escritor de

basede datos

CKPTPunto de

control

LGWREscritor de Log

PMONMonitor deprocesos

ARC0Proceso deArchivado

Procesodel servidor 

Procesodel servidor 

Procesodel servidor 

Procesodel servidor 

SGAÁrea Global del Sistema

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 aplicación.

Oracle también crea un juego de procesos en segundo plano para una instancia queinteractúan entre sí y con el sistema operativo para gestionar las estructuras de memoria,realizar E/S asíncronamente para escribir datos en disco y realizar tareas de mantenimientogeneral.

Los procesos en segundo plano que están presentes dependen de las funciones que se esténutilizando en la base de datos. Los procesos en segundo plano más comunes son lossiguientes:

• SMON (Monitor del sistema): Realiza una recuperación de fallo cuando se inicia lainstancia después de un fallo

• PMON (Monitor de procesos): Realiza una limpieza de procesos cuando falla unproceso del usuario

• DBWn (Escritor de base de datos): Escribe bloques modificados de la caché debuffers de base de datos a los archivos en disco

• CKPT (Punto de control): Señala DBWn en puntos de control y actualiza todos losarchivos de datos y los archivos de control de la base de datos para indicar el punto de

control más reciente• LGWR (Escritor de log): Escribe entradas de redo en disco• ARCn (Proceso de archivado): Copia los archivos redo log en el almacenamiento de

archivado cuando los archivos log están llenos o se produce un cambio de log

Introducción a Oracle 10g: SQL Fundamentals II

331

Page 332: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 332/354

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

Otras Estructuras Físicas Clave

Archivoslog archivados

Archivo deparámetros

Archivo decontraseñas Base de datos

Otros Archivos Clave

Oracle Server también utiliza otros archivos que no forman parte de la base de datos:• El archivo de parámetros define las características de una instancia Oracle. Por ejemplo,

contiene los parámetros que especifican el tamaño de las estructuras de memoria enla SGA.

• El archivo de contraseñas 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 físico.

Introducción a Oracle 10g: SQL Fundamentals II

332

Page 333: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 333/354

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

Procesamiento de una Sentencia SQL

• Conexión a una instancia mediante:– El proceso del usuario

– El proceso del servidor 

• Los componentes de Oracle Server que se utilicendependerán del tipo de sentencia SQL:– Las consultas devuelven filas

– Cambios de log de sentencias DML– La validación garantiza la recuperación de la transacción

• Algunos componentes de Oracle Server no participanen el procesamiento de las sentencias SQL.

Componentes que se Utilizan para Procesar SQL

No se utilizan todos los componentes de una instancia Oracle para procesar las sentenciasSQL. Los procesos del usuario y del servidor se utilizan para conectar un usuario a unainstancia Oracle. Estos procesos no forman parte de la instancia Oracle, aunque sonnecesarios para procesar una sentencia SQL.

Algunos de los procesos en segundo plano, las estructuras SGA y los archivos de base dedatos se utilizan para procesar sentencias SQL. Dependiendo del tipo de sentencia SQL, seutilizan diferentes componentes:

• Las consultas necesitan un procesamiento adicional para devolver las filas al usuario.• Las sentencias DML (Lenguaje de Manipulación de Datos) necesitan procesamiento

adicional para registrar los cambios efectuados en los datos.• La validación del procesamiento asegura que se puedan recuperar los datos modificados

en una transacción.

Algunos de los procesos en segundo plano necesarios no participan de forma directa en elprocesamiento de una sentencia SQL, aunque se utilizan para mejorar el rendimiento y pararecuperar la base de datos.

El proceso en segundo plano opcional, ARC0, se utiliza para asegurar la recuperación de una

base de datos de producción.

Introducción a Oracle 10g: SQL Fundamentals II

333

Page 334: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 334/354

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

Conexión a una Instancia

Usuario Servidor 

Servidor Usuario

Cliente

Usuario Servidor 

Oracle Server 

Servidor Servidor de aplicaciones

Explorador 

Procesos que se Utilizan para Conectarse a una Instancia

Antes que los usuarios puedan enviar sentencias SQL a Oracle Server, se deben conectar auna instancia.

El usuario inicia una herramienta como iSQL*Plus, o bien ejecuta una aplicación que se hayadesarrollado con una herramienta como Oracle Forms. Esta aplicación o herramienta seejecutará en un proceso del usuario.

En la configuración más básica, 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 delservidor. El proceso del servidor se comunicará con la instancia Oracle en nombre del procesodel usuario en el cliente. El proceso del servidor ejecuta las sentencias SQL en nombre delusuario.

Introducción a Oracle 10g: SQL Fundamentals II

334

Page 335: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 335/354

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

Procesos que se Utilizan para Conectarse a una Instancia (continuación)

Conexión

Una conexión es una ruta de comunicación entre un proceso del usuario y Oracle Server. Unusuario de base de datos se puede conectar a Oracle Server de tres formas:

• El usuario se conecta al sistema operativo ejecutando la instancia Oracle e inicia una

aplicación o una herramienta que accede a la base de datos en ese sistema. Se establecela ruta de comunicación mediante los mecanismos de comunicación entre procesosdisponibles en el sistema operativo del host.

• El usuario inicia la aplicación o la herramienta en un equipo local y se conecta a travésde la red al equipo que ejecuta la instancia Oracle. En esta configuración, conocidacomo cliente/servidor, el software de red se utiliza para establecer la comunicación entreel usuario y Oracle Server.

• En una conexión de tres capas, el equipo del usuario se comunica a través de la red conun servidor de aplicaciones o de red, que se conecta a través de una red a la máquina queejecuta la instancia Oracle. Por ejemplo, el usuario ejecuta un explorador en un equipode red para utilizar una aplicación que reside en un servidor NT que recupera los datosde una base de datos Oracle que se ejecuta en un host UNIX.

Sesiones

Una sesión es una conexión específica de un usuario a Oracle Server. La sesión se iniciacuando Oracle Server valida al usuario, y finaliza cuando el usuario se desconecta o cuando seproduce una terminación anormal. Un usuario de base de datos determinado puede realizar muchas sesiones simultáneas si dicho usuario se conecta desde distintas herramientas,aplicaciones o terminales al mismo tiempo. Excepto en el caso de algunas herramientas deadministración de base de datos especializadas, el inicio de una sesión de base de datosrequiere que Oracle Server esté disponible.

Nota: El tipo de conexión que se explica aquí, donde hay una correspondencia uno a unoentre un proceso del usuario y del servidor, se denomina conexión de servidor dedicado.

Introducción a Oracle 10g: SQL Fundamentals II

335

Page 336: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 336/354

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

Procesamiento de una Consulta

• Análisis:– Busca una sentencia idéntica

– Comprueba la sintaxis, los nombres de objetos ylos privilegios

– Bloquea los objetos que se utilizan durante elanálisis

– Crea y almacena el plan de ejecución• Ejecución: Identifica las filas seleccionadas

• Recuperación: Devuelve filas al proceso delusuario

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:• Análisis• Ejecución• Recuperación

Durante la etapa de análisis, la sentencia SQL se transfiere del proceso del usuario al delservidor, y se carga una representación analizada de la sentencia en un área SQL compartida.

Durante el análisis, 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 búsquedas en el diccionario de datos para validar las definiciones de tabla y

columna

La ejecución ejecuta la sentencia mediante el mejor enfoque del optimizador y larecuperación vuelve a recuperar las filas para el usuario.

Introducción a Oracle 10g: SQL Fundamentals II

336

Page 337: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 337/354

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

Pool Compartido

• La caché de biblioteca contiene el texto de la sentenciaSQL, el código analizado y el plan de ejecución.

• La caché del diccionario de datos contiene lasdefiniciones y privilegios de tabla, columna y otrosobjetos.

• SHARED_POOL_SIZE especifica el tamaño del poolcompartido.

Caché dediccionario

de datos

Caché debiblioteca

Pool compartido

Componentes del Pool Compartido

Durante la etapa de análisis, el proceso del servidor utiliza el área en la SGA conocida comoel pool compartido para compilar la sentencia SQL. El pool compartido cuenta con doscomponentes principales:

• Caché de biblioteca• Caché de diccionario de datos

Caché de Biblioteca

La caché de biblioteca almacena información acerca de las últimas sentencias SQL que sehayan utilizado en una estructura de la memoria denominada área SQL compartida. El áreaSQL compartida contiene:

• El texto de la sentencia SQL• El árbol de análisis: Versión compilada de la sentencia• El plan de ejecución: Los pasos que se deben seguir al ejecutar la sentencia

El optimizador es la función de Oracle Server que determina el plan de ejecución óptimo.

Si se vuelve a ejecutar una sentencia SQL y un área SQL compartida ya dispone del plan deejecución 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 análisis y los requisitos de memoria. Si la sentencia SQL no sereutiliza, al final caducará en la caché de biblioteca.

Introducción a Oracle 10g: SQL Fundamentals II

337

Page 338: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 338/354

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

Componentes del Pool Compartido (continuación)

Caché del Diccionario de Datos

La caché del diccionario de datos, también conocida como la caché del diccionario o caché defilas, es una recopilación de las definiciones de uso más reciente de la base de datos. Incluyeinformación sobre archivos de base de datos, tablas, índices, columnas, usuarios, privilegios y

otros objetos de base de datos.Durante la fase de análisis, el proceso del servidor busca la información en la caché dediccionario 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 estainformación en los archivos de datos.

Especificación del Tamaño del Pool Compartido

El parámetro de inicialización SHARED_POOL_SIZE especifica el tamaño del poolcompartido.

Introducción a Oracle 10g: SQL Fundamentals II

338

Page 339: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 339/354

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

Caché de Buffers de Base de Datos

• Almacena los bloques de uso más reciente• Tamaño de un buffer basado en DB_BLOCK_SIZE

• Número de buffers que define DB_BLOCK_BUFFERS

Caché debuffers de

base de datos

Función 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 basede datos los bloques que necesita. Si no se encuentra el bloque en la caché de buffers de basede datos, el proceso del servidor lee el bloque en el archivo de datos y coloca una copia en lacaché de buffers. Dado que las siguientes solicitudes para el mismo bloque ya puedenencontrar el bloque en la memoria, no necesitarán lecturas físicas. Oracle Server utiliza, comomínimo, un algoritmo de uso menos reciente para hacer caducar los buffers a los que no se haaccedido recientemente para dejar sitio a los nuevos bloques en la caché de buffers.

Especificación del Tamaño de la Caché de Buffers de la Base de Datos

El tamaño de cada buffer de la caché de buffers equivale al tamaño de un bloque de Oracle ylo especifica el parámetro DB_BLOCK_SIZE. El número de buffers equivale al valor delparámetro DB_BLOCK_BUFFERS.

Introducción a Oracle 10g: SQL Fundamentals II

339

Page 340: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 340/354

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

.

PGA (Área Global de Programas)

• No compartido

• Sólo puede escribirlo el proceso del servidor 

• Contiene:– Área de ordenación

– Información de sesión

– Estado del cursor 

– Espacio de la pila

Proceso delservidor 

PGA

Componentes del Área Global de Programas

Una PGA (Área Global de Programas) es una región de la memoria que contiene datos einformación de control para un proceso del servidor. Es una memoria no compartida creadapor Oracle cuando se inicia un proceso del servidor. El acceso a ella es exclusivo del procesodel servidor, y sólo puede leerla y escribir en ella el código de Oracle Server que actúe en sunombre. La memoria PGA asignada por cada proceso del servidor adjunta a una instanciaOracle se conoce como la memoria PGA agregada asignada por la instancia.

En una configuración de servidor dedicado, la PGA del servidor incluye los siguientescomponentes:

• Área de ordenación: Se utiliza para cualquier ordenación necesaria para procesar lasentencia SQL

• Información de sesión: Incluye los privilegios de usuario y las estadísticas derendimiento de la sesión

• Estado del cursor: Indica la etapa en el procesamiento de las sentencias SQL que lasesión utiliza en ese momento

• Espacio de la pila: Contiene otras variables de la sesión

La PGA se asigna cuando se crea un proceso y se libera cuando éste se termina.

Introducción a Oracle 10g: SQL Fundamentals II

340

Page 341: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 341/354

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

Procesamiento de una Sentencia DML

UPDATE

employees ...

SGA

Buffer deredo log

Caché debuffers debase de

datos

Pool compartidoProcesodel usuario

Proceso

del servidor 

1

1 2 34

Base de datos

Archivosredo log

Archivosde control

Archivosde datos

Pasos para el Procesamiento DML

Una sentencia DML (Lenguaje de Manipulación de Datos) sólo requiere dos fases deprocesamiento:

• La etapa de análisis es la misma que la que se utiliza para procesar una consulta.• La ejecución requiere un procesamiento adicional para efectuar cambios de datos.

Fase de Ejecución DML

Para ejecutar una sentencia DML:

• Si los bloques de datos y de rollback no están todavía en la caché de buffers, el procesodel 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 losdatos, 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.

Introducción a Oracle 10g: SQL Fundamentals II

341

Page 342: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 342/354

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

Pasos para el Procesamiento DML (continuación)

Fase de Ejecución DML (continuación)

El proceso del servidor registra la imagen anterior en el bloque de rollback y actualiza elbloque 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 imagenanterior de DELETE contiene los valores de columna en la fila suprimida, mientras que laimagen anterior de INSERT contiene la información de ubicación de filas.

Como los cambios realizados en los bloques sólo se registran en las estructuras de la memoriay no se escriben en el disco inmediatamente, un error en el equipo que ocasione la pérdida dela SGA puede hacer que se pierdan también estos cambios.

Introducción a Oracle 10g: SQL Fundamentals II

342

Page 343: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 343/354

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

Buffer de Redo Log

• LOG_BUFFER define su tamaño

• Registra los cambios realizados en toda la instancia

• Se utiliza secuencialmente

• Se trata de un buffer circular 

Caché debuffers debase de datos

Características del Buffer de Redo Log

El proceso del servidor registra la mayor parte de los cambios efectuados a los bloques dearchivos de datos en el buffer de redo log , que es una parte de la SGA. El buffer de redo logtiene las siguientes características:

• El parámetro LOG_BUFFER define su tamaño en bytes.• Registra el bloque que se modifica, la ubicación del cambio y el nuevo valor en una

entrada de redo. Una entrada de redo no distingue el tipo de bloque que se cambia, sóloregistra 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 unatransacción se pueden intercalar con los efectuados por otras transacciones.

• Se trata de un buffer circular que se reutiliza después de llenarlo, aunque únicamentecuando las entradas de redo antiguas se hayan registrado en los archivos redo log.

Introducción a Oracle 10g: SQL Fundamentals II

343

Page 344: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 344/354

Page 345: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 345/354

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

Base de datos

Archivosredo log

Archivosde control

Archivosde datos

Procesamiento COMMIT

1

3

4

InstanciaSGA

Caché debuffers debase de

datos

Pool compartido

2Procesodel usuario

Procesodel servidor 

Buffer deredo log

LGWR

Validación (COMMIT) Rápida

Oracle Server utiliza un mecanismo de validación rápido que garantiza que los cambiosvalidados se puedan recuperar en caso de fallo de la instancia.

Número de Cambio del Sistema

Siempre que se valida una transacción, Oracle Server asigna un SCN (número de cambio delsistema) de validación a la transacción. El SCN se incrementa regularmente y es único en labase 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 dedatos. El uso del SCN permite que Oracle Server realice comprobaciones de consistencia sindepender de la fecha ni de la hora del sistema operativo.

Pasos para el Procesamiento de COMMIT

A continuación, se muestran los pasos que se deben seguir cuando se emite COMMIT:• El proceso del servidor coloca un registro de validación, junto con el SCN, en el buffer 

de redo log.• LGWR realiza una escritura contigua de todas las entradas de buffers de redo log hasta

el registro de validación (incluido) en los archivos redo log. Después, Oracle Server puede garantizar que los cambios no se perderán si falla una instancia.

Introducción a Oracle 10g: SQL Fundamentals II

345

Page 346: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 346/354

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

Validación (COMMIT) Rápida (continuación)

Pasos para el Procesamiento de COMMIT (continuación)• Se informa al usuario de que COMMIT ha finalizado.• El proceso del servidor registra la información para indicar que la transacción está

completa y que los bloqueos de recursos se pueden liberar.

DBW0 lleva a cabo el vaciado de los buffers sucios en el archivo de datos de maneraindependiente y puede tener lugar antes o después de la validación.

Ventajas de la Validación (COMMIT) Rápida

El mecanismo de validación rápida asegura la recuperación de los datos al escribir loscambios en el buffer de redo log en lugar de en los archivos de datos. Tiene las siguientesventajas:

• Las escrituras secuenciales en los archivos log son más rápidas que las escrituras debloques en los archivos de datos.

• En los archivos log sólo se escribe la información mínima necesaria para registrar loscambios, mientras que la escritura en los archivos de datos requeriría la escritura de

bloques completos de datos.• Si hay múltiples transacciones que solicitan su validación al mismo tiempo, la instanciatransporta registros de redo log en una sola escritura.

• A menos que el buffer de redo log se encuentre especialmente lleno, sólo será necesariauna escritura síncrona por cada transacción. Si se lleva a cabo el transporte, puede haber menos de una escritura síncrona por transacción.

• Como el buffer de redo log se puede vaciar antes de COMMIT, el tamaño de latransacción no afecta a la cantidad de tiempo necesaria para una operaciónCOMMIT real.

Nota: Al hacer rollback de una transacción, no se dispara la escritura en disco de LGWR.

Oracle Server siempre hace rollback de los cambios no validados cuando se recupera defallos. En caso de que se produzca un fallo después de un rollback, antes de registrar lasentradas de rollback en disco, la ausencia de un registro validado será suficiente para asegurar que se hará rollback de los cambios realizados por la transacción.

Introducción a Oracle 10g: SQL Fundamentals II

346

Page 347: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 347/354

Page 348: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 348/354

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

Resumen (continuación)

Estructuras de la Memoria SGA

La SGA (Área Global del Sistema) tiene tres estructuras principales:• Pool compartido: Almacena en el diccionario de datos las sentencias SQL que se han

ejecutado más recientemente y los datos de uso más reciente del diccionario de datos

• Caché de buffers de base de datos: Almacena los datos de uso más reciente• Buffer de redo log: Registra los cambios realizados en la base de datos mediante lainstancia

Procesos en Segundo Plano

Una instancia Oracle de producción incluye los siguientes procesos:• DBW0 (Escritor de base de datos): Escribe los datos cambiados en los archivos de

datos• LGWR (Escritor de log): Registra los cambios realizados en los archivos de datos en los

archivos redo log en línea• SMON (Monitor del sistema): Comprueba la consistencia e inicia la recuperación de la

base de datos cuando ésta se abre• PMON (Monitor de procesos): Limpia los recursos si falla uno de los procesos• CKPT (Proceso de punto de control): Actualiza la información de estado de base de

datos después de un punto de control• ARC0 (Proceso de archivado): Hace una copia de seguridad del redo log en línea para

asegurar la recuperación después de un fallo del medio físico (Este proceso es opcional,aunque se incluye normalmente en una instancia de producción).

Dependiendo de la configuración, la instancia puede incluir también otros procesos.

Pasos para el Procesamiento de Sentencias SQL

Los pasos que se utilizan para procesar una sentencia SQL son:

• Análisis: Compila la sentencia SQL• Ejecución: Identifica las filas seleccionadas o aplica cambios DML a los datos• Recuperación: Devuelve las filas consultadas por una sentencia SELECT

Introducción a Oracle 10g: SQL Fundamentals II

348

Page 349: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 349/354

Page 350: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 350/354

_________

Índice

_________ 

Introducción a Oracle 10g: SQL Fundamentals II

350

Page 351: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 351/354

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

AACCESS PARAMETERS 02-33, 02-35Activación de Restricciones 02-15, 02-16Actualización Correlacionada 06-17, 06-18Adición de una columna 02-05

Agrupamiento Concatenado 04-21, 04-22, 04-23ALTER 01-12ALTER SESSION 05-04,…, 05-09, 05-13, 05-17ALTER TABLE 02-03,…, 02-19, 06-16, 08-13ALTER USER 01-11, 01-19ALL INSERT 03-02, 03-16, 03-21, 03-35Arquitectura de la Base de Datos D-1...D-30

BBorrado de una Columna 02-07

CClasificación de Filas 07-10Cláusula WITH 06-22, 06-23, 06-24Columna Compuesta 04-17, 04-19, 04-23Comparaciones entre No Pares 06-04Comparaciones entre Pares 06-04, 06-25CONNECT BY 06-07, 07-05…07-14CONNECT BY PRIOR 07-05 … 07-14Consulta de Versiones 03-32Consulta de Versiones de Flashback 02-32Consulta Externa 03-07, 06-08, 06-10, 06-12, 06-13, 06-14Consulta Interna 06-08, 06-10, 06-10, 06-12, 06-14, 06-15Consultas Jerárquicas 03-05Correlación 06-13Crear Base de Datos 05-09, C-03Crear Índice 02-20, 02-21, 02-23, 02-38, 02-39CUBE 04-06,…, 04-24CURRENT_DATE 05-05, 05-06, 05-06, 05-15, 05-34, 05-35CURRENT_TIMESTAMP 05-05, 05-07, 05-08, 05-17, 05-34, 05-35

D

DBTIMEZONE 05-04, 05-09, 05-26, 05-34DEFAULT DIRECTORY 02-33, 02-35Depurar 02-26, 02-28Desactivación de Restricciones 02-15Desplazamiento por el Árbol 07-07...07-09DROP TABLE 02-26, 02-28, C-02, C-06

EEliminación del Árbol 07-13, 07-14EXIST 06-14,…, 06-16, 06-20, 06-21, 06-24, 06-26, 06-27EXTRACT 05-25

Introducción a Oracle 10g: SQL Fundamentals II

351

Page 352: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 352/354

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

FFecha/Hora 05-05…05-35Filas de Valores Derivados de Varias Tablas 04-06Filas Superagregadas 04-06, 04-08, 04-09FIRST INSERT 03-16, 03-22, 03-23

FLASHBACK TABLE 02-26, 02-27, 02-28FROM_TZ 05-28Función de Fecha/Hora 05-34, 05-35Funciones de Conversión 05-28...05-31

GGROUP BY 03-07, 03-23, 04-03 ,…, 04-23, 06-07, 06-20, 06-24, 06-25GROUP BY ROLLUP 04-12, 04-17, 04-19GROUPING 04-03,…, 04-23GROUPING SET 04-13, 04-15, 04-17, 04-21, 04-23

HHAVING 03-05, 04-03, 04-05, 04-07, 04-09, 06-20, C-04Hora del Meridiano de Greenwich 05-03, 05-06, 05-14Horario de Verano 05-03, 05-28, 05-32,

IÍndices Basados en Funciones 02-23, 02-24Informe en Estructura de Árbol 07-02Informes de Datos Derivados de Varias Tablas 04-09INSERT 01-12, 01-15, 01-18, 02-06, 02-31, 03-03,…, 03-06, 03-11,…, 03-30INSERT ALL Incondicional 02-19INSERT Condicional 02-20 ...02-23INTERVAL 05-18-05-24INTERVAL DAY TO SECOND 05-22, 05-24INTERVAL YEAR TO MONTH 05-21...05-22

LLEVEL 07-05, 07-10, 07-11, 07-14,LOCALTIMESTAMP 05-05, 05-08, 05-08, 05-34, 05-35LPAD 07-11

MMERGE 03-27...03-30Metacaracteres 08-04...08-06Modificación de una Columna 02-06

NNLS_Date_Language 05-29Nodo Raíz 07-10Nodo Secundario 07-10NOT EXIST 01-16, 06-14, 06-16NOT IN 03-11, 06-05, 06-06, 06-16

Introducción a Oracle 10g: SQL Fundamentals II

352

Page 353: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 353/354

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

OON DELETE CASCADE 02-12ORACLE_LOADER 02-35ORDER BY 02-23, 04-03, 04-04, 04-05, 04-07, 04-09, 06-08,ORGANIZATION EXTERNAL 02-33, 02-35

PPIVOTING 03-16, 03-24, 03-25Pseudocolumna 07-05, 07-10, 07-14, 07-15

RREGEXP_INSTR 8-7REGEXP_LIKE 8-7REGEXP_REPLACE 8-7REGEXP_SUBSTR 8-7REJECT LIMIT 02-33, 02-35

Relación Principal-Secundario 07-04Restricción 01-17, 02-07, 02-10…02-20, 06-07, 08-1, C-03Restricciones de Control 08-13Restricciones Diferidas 02-13Restricciones en Cascada 02-18, 02-19ROLLUP 04-06 ... 04-23

SSeguimiento de Cambios 02-31SESSIONTIMEZONE 05-06 ,…, 05-09, 05-26SET TIME_ZONE 05-04, 05-06 ,…, 05-09, 05-17SET UNUSED 02-08Soporte de Expresiones Normales 8-1,…, 8-13START WITH 07-05, 07-06, 07-11, 07-14, 08-10Subconsulta 03-04... 03-11, 03-14, 03-17, 06-03… 06_26, 07-06, 07-07Subconsulta Correlacionada 06-10 …06-13Subconsulta Correlacionada para Actualizar Fila 06-17, 06-18Subconsulta Correlacionada para Suprimir 06-20, 06-21Subconsulta Escalar 06-07...06-09Subconsultas de Varias Columnas 06-03, 06-07Sustitución de Patrones 08-12

TTabla Externa 02-29, 02-31, 02-35, 02-37TIMESTAMP 05-10...05-17TIMESTAMP WITH LOCAL TIMEZONE 05-16, 05-17TIMESTAMP WITH TIME ZONE 05-15TO_DSINTERVAL 05-30TO_YMINTERVAL 05-31TZ_OFFSET 05-26, 05-34

U

UNION 04-07, 04-10, 04-13, 04-17, 04-23UNION ALL 04-07, 04-10, 04-13, 04-13, 04-17, 04-23

Introducción a Oracle 10g: SQL Fundamentals II

353

Page 354: Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

8/7/2019 Base de Datos Oracle 10g Conceptos Fundamentales de SQL II

http://slidepdf.com/reader/full/base-de-datos-oracle-10g-conceptos-fundamentales-de-sql-ii 354/354

VV$TIMEZONE_NAME 05-28Valores Derivados de Varias Tablas 04-09, 04-23Versiones de Filas 03-36VERSIONS BETWEEN 03-34

ZZona Horaria 05-01... 05-34

Introducción a Oracle 10g: SQL Fundamentals II