La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Unidad 2 - Vistas y Funciones

Presentaciones similares


Presentación del tema: "Unidad 2 - Vistas y Funciones"— Transcripción de la presentación:

1 Unidad 2 - Vistas y Funciones
Rocío Contreras Aguila Primer Semestre 2010

2 ¿Qué es una vista? Una vista es una tabla virtual que muestra la información relevante para el usuario además que permite encapsular la complejidad de su implementación. Una vista puede mostrar toda la información de una tabla o de la integración de información de más de una tabla. Es decir se puede afirmar que las vistas trabajan como especie de filtros de las tablas subyacentes que brindan la información presentada por la vista.

3 ¿Qué es una vista? Entre las principales ventajas del empleo de las vistas podemos mencionar: Permite mostrar un subconjunto de filas y/o columnas de una tabla. Permite mostrar información de más de una tabla. Permite realizar uniones entre dos o más tablas. Permite mostrar informes resumen.

4 ¿Qué es una vista? Otra de las ventajas de las vistas es que pueden generarse a partir de consultas distribuidas entre orígenes de datos heterogéneos, de tal manera que los usuarios invocan a las vistas en lugar de estar digitando complejos querys.

5 ¿Qué es una vista? Antes de implementar sus vistas tenga en cuenta las siguientes consideraciones: Sólo pueden crearse vistas en la base de datos activa, aunque las tablas y/o vistas que son parte de la definición puedan encontrarse en distintas bases de datos. Se pueden crear vistas a partir de otras vistas. No se pueden asociar defaults, rule y/o desencadenadores (Trigers) a una vista. La consulta que forma la vista no puede incluir las cláusulas ORDER BY, COMPUTE o COMPUTE BY No se pueden construir índices sobre las vistas No se pueden crear vistas temporales, ni vistas basadas en tablas temporales. Cada una de las columnas empleadas en la vista debe tener un encabezado.

6 Crear una Vista Para crear vistas lo podemos hacer desde el administrador corporativo o a partir de la sentencia CREATE VIEW, cuya sintaxis es: CREATE VIEW <Nombre de la vista> [Encabezado1, ....] [WITH ENCRYPTION] AS Sentencias Select [WITH CHECK OPTION]

7 Crear una Vista La cláusula WITH ENCRYPTION, permite ocultar la implementación de la vista, la cual puede ser vista con el stored procedure del sistem sp_helptext o desde la tabla del sistema syscomments. La cláusula WITH CHECK OPTION, garantiza que los cambios hechos desde la vista puedan ser observados una vez que la operación finaliza.

8 Ejemplo 1 Generar la base de datos con las siguientes tablas:
Alumnos {# codalu, nom, pat, mat} Inscritos {# codalu,FK sec} Secciones {#sec, FK codprofe, inicio, pension, vacantes, numhoras} Calificaciones {FK codalu, FK sec, n1, n2} Profesores {#codprofe, nombre, apellidos, categ, fecha_ing,pension}

9 Ejemplo 1

10 Ejemplo La vista relacion_de_promedios SELECT inscritos.coddalu as codigo, alumnos.nom + ' ' + alumnos.pat as nomape, inscritos.sec as seccion, profesores.nombre as profesor, (calificaciones.n1 + calificaciones.n2)/2 as promedio FROM alumnos, secciones,inscritos,calificaciones,profesores WHERE alumos.codalu=inscritos.codalu and inscritos.sec=secciones.sec and secciones.codprofe=profesores.codprofe and inscritos.sec=calificaciones.sec and inscritos.codalu=calificaciones.codalu and calificaciones.sec=secciones.sec

11 Ejemplo 1 Para comprobar la creación de la vista en el Analizador de Consultas digite la siguiente instrucción: Select * From Relacion_de_Promedios GO Ver la sentencia que implementa la vista: Sp_HelpText Relacion_de_Promedios

12 Ejemplo 1 Ver las columnas que se presentan en la vista:
Sp_Depends Relación de Promedios GO Desde el Query Anallyzer debe crear una vista que nos permita mostrar un informe resumen por sección que muestre la sección, el nombre del profesor, el total de alumnos, el mayor y menor promedio, el promedio de la sección y el monto acumulado de las pensiones.

13 Ejemplo 2 CREATE VIEW Resumen AS Select Inscritos.Sec As Seccion, MAX(nombre) As Profesor, Count(Inscritos.Codalu) As Alumnado, Max((N1+N2)/2) As MayorPromedio, Min((N1+N2)/2) As MenorPromedio, Avg((N1+N2)/2) As PromedioSec, Sum(Pension) As Acumulado From Inscritos INNER JOIN Calificaciones On Inscritos.codAlu = Calificaciones.codalu AND Inscritos.sec = Calificaciones.Sec INNER JOIN Secciones On Inscritos.Sec = Secciones.Sec INNER JOIN Profesores On Secciones.CodProfe = Profesores.CodProfe Group by Inscritos.Sec GO

14 Ejemplo 2 Compruebe la información que devuelve la vista:
Select * From Resumen GO Mostrar la implementación de la vista: Sp_HelpText Resumen

15 Modificar Vistas Para modificar la vista utilice la siguiente sintaxis: ALTER VIEW <Nombre de la Vista> [(Encabezado1, ...)] [WITH ENCRYPTION] AS <Sentencia SELECT> [WITH CHECK OPTION]

16 Modificar Vistas: ejemplo 4
ALTER VIEW RESUMEN WITH ENCRYPTION AS Select Inscritos.Sec As Seccion, MAX(nombre) As Profesor, Count(Inscritos.Codalu) As Alumnado, Max((N1+N2)/2) As MayorPromedio, Min((N1+N2)/2) As MenorPromedio, Avg((N1+N2)/2) As PromedioSec, Sum(Pension) As Acumulado From Inscritos INNER JOIN Calificaciones On Inscritos.codAlu = Calificaciones.codalu AND Inscritos.sec = Calificaciones.Sec INNER JOIN Secciones On Inscritos.Sec = Secciones.Sec INNER JOIN Profesores On Secciones.CodProfe = Profesores.CodProfe Group by Inscritos.Sec GO

17 Modificar Vistas: Ejemplo 4
Ahora muestre la implementación de la vista con el siguiente comando: Sp_HelpText Resumen GO Como se observa en el panel de resultados ahora ya no se muestra la implementación de la vista. Lo mismo ocurrirá si consulta la información de la tabla del sistema SysComments. Select * From SysComments

18 Eliminar Vistas Para eliminar una vista emplear la siguiente sintaxis:
DROP VIEW <Nombre de la vista> [,...n] Como ejemplo podría utilizar la siguiente instrucción: DROP VIEW [Relacion_de_Promedios] GO Select * From [Relacion de Promedios]

19 Funciones Una función en SQL Server se maneja bajo el mismo concepto que una función en un lenguaje de programación. Es un sub algoritmo, que recibe, desarrolla y devuelve parámetros.

20 Como funcionan? Una función en Sql Server, se comporta de la misma forma que las funciones que conocemos tradicionalmente, es decir devolviendo un valor. Ese valor puede ser cualquier valor escalar, incluidas filas. Se pueden asemejar a vistas con parámetros

21 Ejemplo 1 create function as int) returns table as return (select * from orders where

22 Ejemplo 2 Create FUNCTION Suma int) RETURNS int AS BEGIN int RETURN END

23 Limitaciones Las funciones definidas por el usuario tienen algunas restricciones. No todas las sentencias SQL son válidas dentro de una función.

24 Válidas Las sentencias de asignación
Las sentencias de Control de Flujo Sentencias SELECT Modificación de variables locales Operaciones de cursores sobre variables locales Sentencias INSERT, UPDATE, DELETE con variables Locales

25 Inválidas Armar funciones no determinadas como GetDate()
Sentencias de modificación o actualización de tablas o vistas Operaciones CURSOR FETCH que devuelven datos del cliente

26 Ejemplo 3 CREATE FUNCTION [dbo].[funcDatePart] ( variable de entrada y Datetime ) RETURNS int AS BEGIN DECLARE *agregamos las variables que necesitemos para realizar la int = ( CASE = 'year' THEN = 'month' THEN = 'quarter' THEN = 'semester' THEN (CASE WHEN between 1 and 6 THEN '1' WHEN between 7 and 12 THEN '2' END ) ELSE '0' END) *Retorno el valor END

27 Ejemplo 4 Create function int ) returns varchar(200) as begin int varchar(200) varchar(200) varchar(20) Si estamos por encima de todo vuelve a ser igual que por debajo. Trescientos cincuenta y un mil cuatrocientos treinta millones doscientas cincuenta mil tres Si estuviese solo la primera parte sería igual pero sin millones.

28 Ejemplo 4 begin = + ' millones ' set end -- por aquí el rango siempre va a ser <=6 o si es mayor no me importa = -- si es solo interesa la última parte... set begin + ' mil ' set end else = -- necesito que tenga tres dígitos para que -- el algoritmo funcione bien.... = case when '1' then 'Ciento ' when '2' then 'Doscientos ' when '3' then 'Trescientos ' when '4' then 'Cuatrocientos ' when '5' then 'Quinientos ' when '6' then 'Seiscientos ' when '7' then 'Setecientos ' when '8' then 'Ochocientos ' when '9' then 'Novecientos ' else '' end set

29 Ejemplo 4 if begin = + case when 1 then 'Uno' when 2 then 'Dos' when 3 then 'Tres' when 4 then 'Cuatro' when 5 then 'Cinco' when 6 then 'Seis' when 7 then 'Siete' when 8 then 'Ocho ' when 9 then 'Nueve ' when 10 then 'Diez ' when 11 then 'Once ' when 12 then 'Doce ' when 13 then 'Trece ' when 14 then 'Catorce ' when 15 then 'Quince ' else '' end end else -- es un número de dos cifras >15 begin select case when '1' then 'Diez ' when '2' then 'Veinte ' when '3' then 'Treinta ' when '4' then 'Cuarenta ' when '5' then 'Cincuenta ' when '6' then 'Sesenta ' when '7' then 'Setenta ' when '8' then 'Ochenta ' when '9' then 'Noventa ' else '' end

30 Ejemplo 4 if begin if set else -- Esto de arriba es el arreglo para poner diez o dieciseis 'y ' end select case when '1' then 'Uno' when '2' then 'Dos' when '3' then 'Tres' when '4' then 'Cuatro' when '5' then 'Cinco' when '6' then 'Seis' when '7' then 'Siete' when '8' then 'Ocho ' when '9' then 'Nueve ' else '' end end set end

31 Llamada Select nombreusuario.nombrefunción(valores)
Ej: select Suma(4,5)

32 Funciones en Transact SQL
SQL Server proporciona al usuario la posibilidad de definir sus propias funciones, conocidad como UDF (user defined functions). Existen tres tipos de funciones. Estas son: Funciones escalares. Funciones en línea. Funciones en línea de múltiples sentencias

33 Funciones escalares Las funciones escalares devuelven un único valor de cualquier tipo de los datos tal como int, money, varchar, real, etc. Para utilizar una función escalar debemos identificar el nombre de la función con el propietario de la misma. Las funciones escalares son muy similares a procedimientos almacenados con parámetros de salida, pero estas pueden ser utilizadas en consultas de seleccion y en la clausula where de las mismas.

34 La sintaxis para una función escalar es la siguiente:
CREATE FUNCTION <Scalar_Function_Name, sysname, FunctionName> ( -- Lista de parámetros <Data_Type_For_Param1, , int>, ... ) -- Tipo de datos que devuelve la función. RETURNS <Function_Data_Type, ,int> AS BEGIN ... END

35 Ejemplo CREATE FUNCTION fn_MultiplicaSaldo DECIMAL(10,2)) RETURNS DECIMAL(10,2) AS BEGIN DECIMAL(10,2) = SALDO FROM CUENTAS WHERE NUMCUENTA END

36 Ejecución Funciones Escalares
La función ejecutará sus sentencias SELECT una vez por cada fila del conjunto de resultados devuelto por la consulta SELECT principal. SELECT IDCUENTA, NUMCUENTA, SALDO, FXALTA, -- Ejecucion de la funcion: dbo.fn_MultiplicaSaldo( NUMCUENTA, IDCUENTA) AS RESULTADO FROM CUENTAS

37 Ejemplo en un script DECIMAL(10,2) = ' ' = 30.5)

38 Funciones en linea Las funciones en línea son las funciones que devuelven un conjunto de resultados correspondientes a la ejecución de una sentencia SELECT. No podemos utilizar la clausula ORDER BY en la sentencia de una función el línea. Las funciones en línea pueden utilizarse dentro de joins o querys como si fueran una tabla normal.

39 Sintaxis CREATE FUNCTION <Inline_Function_Name, sysname, FunctionName> (-- Lista de parámetros <Data_Type_For_Param1, , int>,... ) RETURNS TABLE AS RETURN ( -- Sentencia Transact SQL

40 Ejemplo CREATE FUNCTION fn_MovimientosCuenta VARCHAR(20) ) RETURNS TABLE AS RETURN ( SELECT MOVIMIENTOS.* FROM MOVIMIENTOS INNER JOIN CUENTAS ON MOVIMIENTOS.IDCUENTA = CUENTAS.IDCUENTA WHERE CUENTAS.NUMCUENTA )

41 Ejecución SELECT * FROM fn_MovimientosCuenta(' ') SELECT * FROM CUENTAS INNER JOIN CUENTAS_CLIENTE ON CUENTAS_CLIENTE.IDCUENTA = CUENTAS.IDCUENTA INNER JOIN CLIENTES ON CLIENTES.id = CUENTAS_CLIENTE.IDCLIENTE INNER JOIN fn_MovimientosCuenta(' ') A ON A.IDCUENTA= CUENTAS.IDCUENTA

42 Funciones en línea de múltiples sentencias
Las funciones en línea de múltiples sentencias son similares a las funciones en línea excepto que el conjunto de resultados que devuelven puede estar compuesto por la ejecución de varios consultas SELECT. Este tipo de función se usa en situaciones donde se requiere una mayor lógica de proceso.

43 Funciones en línea de múltiples sentencias
La sintaxis para una funciones de tabla de multi sentencias es la siguiente: CREATE FUNCTION <Table_Function_Name, sysname, FunctionName> (-- Lista de parámetros <data_type_for_param1, , int>, … ) RETURNS -- variable de tipo tabla y su estructura TABLE ( <Column_1, sysname, c1> <Data_Type_For_Column1, , int>, <Column_2, sysname, c2> <Data_Type_For_Column2, , int> ) AS BEGIN -- Sentencias que cargan de datos la tabla declarada RETURN END

44 Ejemplo Esta funcion busca la tres cuentas con mayor saldo y obtiene los tres últimos movimientos de cada una de éstas : CREATE FUNCTION fn_CuentaMovimietos() TABLE ( -- Estructura de la tabla que devuelve la funcion. NumCuenta varchar(20), Saldo decimal(10,2), Saldo_anterior decimal(10,2), Saldo_posterior decimal(10,2), Importe_Movimiento decimal(10,2), FxMovimiento datetime )

45 Ejemplo AS BEGIN -- Variables necesarias para la lógica de la funcion. decimal(10,2) -- Cursor con las 3 cuentas de mayor saldo DECLARE CDATOS CURSOR FOR SELECT TOP 3 IDCUENTA, NUMCUENTA, SALDO FROM CUENTAS ORDER BY SALDO DESC

46 Ejemplo FETCH CDATOS INTO @idcuenta, @numcuenta, @saldo
OPEN CDATOS FETCH @saldo -- Recorremos el cursor WHILE = 0) BEGIN -- Insertamos la cuenta en la variable de salida INSERT (NumCuenta, Saldo) VALUES @saldo) -- Insertamos los tres últimos movimientos de la cuenta

47 Ejemplo INSERT (Saldo_anterior, Saldo_posterior, Importe_Movimiento, FxMovimiento ) SELECT TOP 3 SALDO_ANTERIOR, SALDO_POSTERIOR, IMPORTE, FXMOVIMIENTO FROM MOVIMIENTOS WHERE IDCUENTA ORDER BY FXMOVIMIENTO DESC -- Vamos a la siguiente cuenta FETCH @saldo END CLOSE CDATOS; DEALLOCATE CDATOS; RETURN

48 Ejecución select * from fn_CuentaMovimietos()


Descargar ppt "Unidad 2 - Vistas y Funciones"

Presentaciones similares


Anuncios Google