DECLARATION 2 – PUBLICATIONS
5.5 Mechanical analysis
Una vista no es más que una consulta almacenada que puede ser reutilizada tantas veces como se desee. Una vista no contiene datos sino la instrucción SELECT necesaria para generarla; eso asegura que los resultados de la vista sean siempre coherentes con los datos actuales almacenados en las tablas. Por todo ello, las vistas gastan muy poco espacio de disco.
Las vistas se emplean para:
- Realizar consultas complejas más fácilmente, ya que permiten dividir la consulta en varias partes. - Proporcionar el contenido de tablas con datos completos.
- Utilizar visiones especiales de los datos.
- Ser utilizadas como tablas que resumen todos los datos.
- Ser utilizadas como cursores de datos en los lenguajes procedimentales (como PL/SQL). Hay dos tipos de vistas:
• Simples. Las forma una sola tabla y no contienen funciones de agrupación. Su ventaja es que permiten siempre realizar operaciones DML sobre ellas.
• Complejas. Obtienen datos de varias tablas, y pueden utilizar funciones de agrupación. No siempre permiten operaciones DML.
porque obliga a operaciones adicionales.
9.2. Crear y consultar vistas.
Las sintaxis para crear una vista es la siguiente:
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW nombre_vista [(alias[, alias2...]] AS consultaSelect
[WITH CHECK OPTION [CONSTRAINT restricción]] [WITH READ ONLY [CONSTRAINT restricción]]
Donde:
OR REPLACE, indica que si la vista ya existía se cambie por la actual.
FORCE, crea la vista aunque los datos de la consulta SELECT no existan.
alias, es la lista de alias que se establecen para las columnas devueltas por la consulta SELECT en la que se basa esta vista. El número de alias debe coincidir con el número de columnas devueltas por SELECT.
WITH CHECK OPTION, hace que sólo las filas que se muestran en la vista puedan ser añadidas (INSERT) o modificadas (UPDATE). La restricción que sigue a esta sección es el nombre que se le da a esta restricción de tipo CHECK OPTION.
WITH READ ONLY, hace que la vista sea de sólo lectura. Permite grabar un nombre para esta restricción. Lo bueno de las vistas es que tras su creación se utilizan como si fueran una tabla virtual. Por ejemplo, la siguiente vista recupera el número de faltas de cada alumno en cada módulo de cada año:
CREATE VIEW ResumenFaltas (nif, modulo, faltas) AS
( SELECT M.nif, Mo.nombre, COUNT(*) FROM
Matricula M JOIN Falta F ON M.idMatricula=F.idMatricula JOIN Modulo Mo ON F.idModulo=Mo.idModulo );
/
SELECT DISTINCT nif, modulo FROM ResumenFaltas; 9.3. Ejecución de comandos DML sobre vistas.
Las instrucciones DML (INSERT, UPDATE y DELETE) ejecutadas sobre las vistas permiten añadir o modificar los datos de las tablas relacionadas en la consulta subyacente de la vista. Ahora bien, no es posible ejecutar instrucciones DML sobre vistas que:
- Utilicen funciones de grupo (SUM, AVG, etc.) - Usen GROUP BY o DISTINCT.
- Posean columnas con cálculos.
Además no se pueden añadir datos a una vista si en las tablas referenciadas en la consulta SELECT hay campos
NOT NULL que no aparecen en la consulta (es lógico ya que al añadir el dato se tendría que añadir el registro colocando el valor NULL en el campo ausente).
Por ejemplo, podemos utilizar la siguiente vista para hacer inserciones de matrículas:
CREATE VIEW MatriculaAmpliada AS
SELECT idMatricula, nif, apellidos || ', ' || nombre AS alumno, año FROM Matricula LEFT JOIN Alumno USING (nif);
/
INSERT INTO MatriculaAmpliada (idMatricula, nif, año) VALUES (67, '77777777J', 2008);
Podremos también hacer inserciones sobre una vista basada en varias tablas si Oracle puede determinar los registros apropiados a insertar. En vistas multitabla Oracle determina qué tablas proporcionan su clave. Si una vista contiene muchas columnas de una tabla para identificar la clave primaria de esta tabla, se conserva la clave y Oracle puede ser capaz de insertar filas en la tabla a través de la vista.
9.4. Estabilidad de una vista.
Recuérdese que los resultados de una vista son construidos al instante sobre la tabla (o tablas) subyacente cuando ejecutamos la vista. Como consecuencia, si la tabla subyacente es eliminada la validez de la vista desaparece. Intentar una consulta sobre una vista cuya tabla subyacente ha sido eliminada produce un mensaje de error.
Nota. La única excepción a esta regla es usar vistas materializadas. Una vista materializada es una
Crear vistas basadas en una consulta que usa el asterisco para recuperar las columnas presenta un caso especial. Por ejemplo, si creamos una vista sobre la tabla Alumno:
CREATE OR REPLACE VIEW Alumno_View AS SELECT * FROM Alumno;
Y entonces alteramos la tabla subyacente:
ALTER TABLE Alumno ADD (pais VARCHAR2(30));
Ocurre que, a pesar del cambio de la tabla subyacente la vista es todavía válida; pero la columna pais no será visible a través de la vista. Si después de alterar la tabla, volvemos a compilar la vista, la nueva columna se verá a través de la vista.
9.5. Mostrar la lista de vistas.
La vista del diccionario de datos de Oracle USER_VIEWS permite mostrar una lista de todas las vistas que posee el usuario actual. Es decir, para saber qué vistas hay disponibles se usa:
SELECT * FROM USER_VIEWS;
La columna TEXT de esa vista contiene la sentencia SQL que se utilizó para crear la vista (sentencia que es ejecutada cada vez que se invoca a la vista).
9.6. Borrar vistas.
Se utiliza el comando DROP VIEW para eliminar una vista, como por ejemplo:
DROP VIEW nombreDeVista;