Unidad 2 - Vistas y Funciones

Slides:



Advertisements
Presentaciones similares
Rocío Contreras Aguila Primer Semestre 2010
Advertisements

SQL Y BASES DE DATOS A TRAVÉS DE LA WEB
Introducción Lenguaje de manipulación de datos (Data Manipulation Language) Permite a los usuarios llevar a cabo las tareas de consulta o manipulación.
integridad referencial
VISTAS (VIEWS) DEFINICIÓN Y OBJETIVO DE LAS VISTAS.
Se necesita un PA que muestre la información de todos los clientes registrados de la siguiente forma: Nombre1 Nombre2, Apellido1 Apellido2 bajo el título.
Insercion de datos..
Estadísticas en SQL Server Rocío Contreras Águila, Primer Semestre 2010.
Implementación de procedimientos almacenados
Rocio Contreras Aguila Primer Semestre Para poder ejecutar esto SQL Server nos permite definir datos y nos entrega herramientas para poder exigir.
LENGUAJE ESTRUCTURADO DE CONSULTA “SQL”
BASE DE DATOS OBJETO RELACIONAL
Implementación de funciones definidas por el usuario
Implementación de procedimientos almacenados. Introducción a los procedimientos almacenados Creación, ejecución, modificación y eliminación de procedimientos.
Introducción a Transact-SQL
Marzo de 2010Dos Ideas - La visión de Sistemas desde el Desarrollo Introducción a PL/SQL Conceptos básicos.
Lenguaje de consulta de Hibernate
UNITA - IBARRA BLOQUES PL-SQL SUBPROGRAMAS Paulina Guevara.
Características Objeto Relacionales en Oracle
Diseño Físico Procedimientos Almacenados y Disparadores (Triggers)
PL/SQL Francisco Moreno Universidad Nacional.
SQL SERVER APLICADO (SSA010) Ariel Alexis Fierro Sáez DuocUC.
SESIÓN 2. Completados por el tipo de objeto sobre el que actúan y el objeto concreto: CREATE DATABASE mibase ; Permite crear una base de datos llamada.
MySQL M.C. Pedro Bello López.
¡A contar en español! Let’s Count in Spanish.
Los números 31 a 99 uno (un, una) dos treinta tres cuarenta cuatro
Bases de Datos Relacionales
16/04/ Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla.
Subconsultas Avanzadas
Ing. Ricardo Carlos Inquilla Quispe
Bases de datos en la Web n Las bases de datos permiten almacenar de una forma estructurada y eficiente toda la información de un sitio web n Ventajas –Proporcionar.
Componentes sintácticos
UNITA - IBARRA TRIGGERS
Universidad del Cauca – FIET – Departamento de Sistemas CAPITULO 11 Creando Vistas.
COMANDOS SQL.
COMANDOS DML DML son las siglas de Data Manipulation Language y se refiere a los comandos que permiten a un usuario manipular los datos en un repositorio,
Diseñando la arquitectura de aplicaciones empresariales. Acceso al SQL Server.- Autenticación de usuario:
Elaborado por: Guillermo Baquerizo I Término 2012.
SQL (Structured Query Language / Lenguaje de consulta estructurado)‏
IBD CLASE 15. SQL Lenguaje de Consultas Estruturado (SQL) ◦Lenguaje de trabajo estándard para modelo relacional ◦Componentes ◦DDL: Data Definition Language.
Programación en Visual Basic Lección #8: SQL Por Antonio F. Huertas.
Estructura general de un programa en el servidor de Bases de Datos.
10 diez.
LENGUAJE SQL.
PROCEDIMIENTOS ALMACENADOS Es una consulta almacenada en la base de datos en un servidor. Los P.A. Mejoran el Rendimiento Disminuyen el tráfico. Los P.A.
LENGUAJE ESTRUCTURADO DE CONSULTAS
SQL Sigla del nombre “Structured Query Language”.
COMANDOS DML DML son las siglas de Data Manipulation Language y se refiere a los comandos que permiten a un usuario manipular los datos en un repositorio,
Para crear una vista debemos utilizar la sentencia CREATE VIEW, debiendo proporcionar un nombre a la vista y una sentencia SQL SELECT válida. CREATE.
Tres cientos noventa y nueve setenta y nueve. Dos cientos cuarenta y nueve.
Consultas SQL. SQL SQL es un lenguaje de consulta estructurado (Structured Query Languague). Se utiliza para: Eliminar Modificar Consultar La base de.
MSSQL SERVER CURSO BÁSICO 1. CONCEPTOS BASICOS DE SQL. DESCRIPCIÓN DEL CURSO. Sesión 3: Índices Uso, Creación, Tipos, Eliminación LENGUAJE DE CONSULTAS.
MSSQL SERVER CURSO BÁSICO 1. DESCRIPCIÓN DEL CURSO. Sesión 4: Sentencia Insert,Transacciones,Insert general, Insert Select * From, Sentencia Update,Update.
Marzo de 2010Dos Ideas - La visión de Sistemas desde el Desarrollo SQL en PL/SQL Conceptos básicos.
Los números +100.
AA Gerardo Morgade Donato AA Isnel Leyva Herbella.
Unidad 6. Tema 4. Lenguaje de consultas SQL
Los Números.
6 Triggers ORACLE - II Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega.
DLM Transact SQL Sesión I Introducción al SQL Server Uso de las herramientas de consultas del Transact SQL.
3 Cursores ORACLE Bases de datos II I-2014 Universidad del Cauca In. Wilson Ortega Bases de datos II I-2014 Universidad del Cauca In. Wilson Ortega.
Structure Query Languaje SQL. Introducción a SQL El lenguaje de consulta estructurado (SQL) es un lenguaje de base de datos normalizado, utilizado por.
Querys a bases de datos con MS ACCESS. DEFINAMOS LOS TERMINOS: DML=Lenguaje de manipulación de datos Las sentencias DML permiten generar consultas para.
DML Transact SQL Sesión X Triggers. Duración 2 Horas.
DML Transact SQL Sesión IX Introducción a los procedimientos almacenados.
Implementación de funciones definidas por el usuario.
DML Transact SQL Sesión III Agrupando y resumiendo información.
Diez 10. Veinte 20 Treinta 30 Cuarenta 40 Cincuenta 50.
Los números +100.
Numbers Notes.
Transcripción de la presentación:

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

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

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

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

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

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]

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.

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}

Ejemplo 1

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

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

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.

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

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

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]

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

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

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]

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.

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

Ejemplo 1 create function OrdersMonth(@MyMonth as int) returns table as return (select * from orders where month(OrderDate)=@MyMonth)

Ejemplo 2 Create FUNCTION Suma (@a int, @b int) RETURNS int AS BEGIN DECLARE @c int SET @c = @a + @b RETURN (select @c) END

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

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

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

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

Ejemplo 4 Create function NumeroALetra(@numero int ) returns varchar(200) as begin Declare @rango int Declare @Resultado varchar(200) Declare @ResultAux varchar(200) Declare @aux varchar(20) set @resultado='' set @resultaux='' set @aux =convert(varchar,@numero) Set @rango= len(@aux) Si estamos por encima de 1000000 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.

Ejemplo 4 if @rango>6 begin set @Resultado = dbo.NumeroALetra(convert(int,left(@aux,len(@aux)-6))) + ' millones ' set @aux=right(@aux,6) end -- por aquí el rango siempre va a ser <=6 o si es mayor no me importa set @aux = convert(varchar,convert(int,@aux)) -- si es 000345 solo interesa la última parte... set @rango=len(@aux) if @rango>3 begin set @Resultado =isnull(@resultado,'')+ dbo.NumeroALetra(convert(int,left(@aux,len(@aux)-3))) + ' mil ' set @aux=right(@aux,3) end else set @aux = right('000'+@aux,3) -- necesito que tenga tres dígitos para que -- el algoritmo funcione bien.... select @resultAux = case left(@aux,1) 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 @aux=right(@aux,2)

Ejemplo 4 if convert(int,@aux)<16 begin select @resultaux = isnull(@resultaux,'') + case convert(int,@aux) 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 @resultaux=isnull(@resultaux,'')+ case left(@aux,1) 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

Ejemplo 4 if right(@aux,1)<>'0' begin if left(@aux,1)='1' set @resultaux=left(@resultaux,len(@resultaux)-1)+'ci' else -- Esto de arriba es el arreglo para poner diez o dieciseis..... set @resultaux = @resultaux + 'y ' end select @resultaux=isnull(@resultaux,'')+ case right(@aux,1) 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 @resultado=isnull(@resultado,'') +isnull(@resultaux,'') if @resultado='' set @resultado='Cero.' return @resultado end

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

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

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.

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

Ejemplo CREATE FUNCTION fn_MultiplicaSaldo ( @NumCuenta VARCHAR(20),@Multiplicador DECIMAL(10,2)) RETURNS DECIMAL(10,2) AS BEGIN DECLARE @Saldo DECIMAL(10,2), @Return DECIMAL(10,2) SELECT @Saldo = SALDO FROM CUENTAS WHERE NUMCUENTA = @NumCuenta SET @Return = @Saldo * @Multiplicador RETURN @Return END

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

Ejemplo en un script DECLARE @NumCuenta VARCHAR(20), @Resultado DECIMAL(10,2) SET @NumCuenta = '200700000001' SET @Resultado = dbo.fn_MultiplicaSaldo(@NumCuenta, 30.5) PRINT @Resultado

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.

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

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

Ejecución SELECT * FROM fn_MovimientosCuenta('200700000001') 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('200700000001') A ON A.IDCUENTA= CUENTAS.IDCUENTA

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.

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 <@param1, sysname, @p1> <data_type_for_param1, , int>, … ) RETURNS -- variable de tipo tabla y su estructura <@Table_Variable_Name, sysname, @Table_Var> 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

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() RETURNS @datos 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 )

Ejemplo AS BEGIN -- Variables necesarias para la lógica de la funcion. DECLARE @idcuenta int, @numcuenta varchar(20), @saldo 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

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

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

Ejecución select * from fn_CuentaMovimietos()