Está en la página 1de 32

Bases de Datos

Common table expressions y


Store Procedures

Tatiana Aparicio Yuja


Para los ejemplos de la
presentación se usará la
siguiente base de datos

Persona(ci,nombre,apellido,sexo,fecNac)
Empresa(codEmpresa,nomEmp,pais,rubro,
patrimonio,promedioSalarial
Trabaja(ci,codEmpresa,salario,cargo)
CTE: Common Table Expression
 Mecanismo que nos permite poner un alias a una
consulta para usarla en otra consulta
WITH
PersonaTerceraEdad_CTE (ci,nombre,apellido,edad) AS
( select ci,nombre,apellido,year(GETDATE())-(year(fecNac))
CTE
from persona where year(GETDATE())-year(fecNac)>=60
Consulta
)
que usa
select count(*) from PersonaTerceraEdad_CTE la CTE

Dicho de otra manera:


• es una definición local de consulta(s) en el contexto de
otra consulta
• Es una vista temporal en el ámbito de una consulta
CTE: Common Table Expression
 CTE es un resultados temporal que se define en el ámbito de la
ejecución de una instrucción única SELECT, INSERT, UPDATE,
DELETE o CREATE VIEW
 Existe sólo el tiempo que dura la consulta
 Se puede hacer referencia a ella varias veces en la misma consulta
 Las CTE se pueden definir en rutinas definidas por el usuario, como
funciones, procedimientos almacenados, desencadenadores o vistas
 Ejemplo:

WITH PersonaTerceraEdad_CTE (ci,nombre,apellido,edad) AS


( select ci,nombre,apellido,year(GETDATE())-(year(fecNac)) CTE
from persona where year(GETDATE())-year(fecNac)>=60
)
Consulta
que usa
select count(*) from PersonaTerceraEdad_CTE la CTE
CTE: Common Table Expression
SINTAXIS:
WITH expression_name [ ( column_name [,...n] ) ]
AS ( CTE_query_definition )
SELECT …..

With C1 AS ( Select ... From T1 Where ... ),


C2 AS ( Select ... From C1 Where ... )
Select ... From C2 Where ...;

with

CTE

Consulta
que usa
la CTE
Utilidad de las CTEs
 Útil para gestionar consultas complicadas, por ejemplo, una consulta
que requiere filtrar sobre datos ya filtrados, implementando
recursividad o reutilizando la consulta anterior.
 Consultas más legibles
 facilidad de mantenimiento de consultas complejas.
 para poder aplicar recursividad a la información que queremos filtrar,
esto es, aplicar ciertas operaciones (o filtro) sobre un conjunto de
registros que previamente extrajimos (o consultamos) de la BD.
WITH PersonaTerceraEdad_CTE (ci,nombre,apellido,edad) AS
( select ci,nombre,apellido,year(GETDATE())-(year(fecNac))
CTE
from persona where year(GETDATE())-year(fecNac)>=60
)
Consulta
select count(*) from PersonaTerceraEdad_CTE que usa
la CTE
Ejemplo
/*
Ejemplos de CTE (common table expression)
OBTENER LA CANTIDAD DE PERSONAS CONTRATADAS POR EDAD
(SOLO CONSIDERAR LAS PERSONAS MAYORES DE 50)
*/
with personaMayor(ci,nombre,apellido,sexo,fecNac,edad)
as
(select *, year(GETDATE())-year(fecNac)
from persona
where (year(GETDATE())-year(fecNac) )>50
)
select edad,count(*) from personaMayor
group by edad
Ejemplo: Ejecución
/*
Ejemplos de CTE (common table expression)
OBTENER LA CANTIDAD DE PERSONAS CONTRATADAS POR EDAD
(SOLO CONSIDERAR LAS PERSONAS MAYORES DE 50)
*/
with personaMayor(ci,nombre,apellido,sexo,fecNac,edad)
as
(select *, year(GETDATE())-year(fecNac)
from persona
where (year(GETDATE())-year(fecNac) )>50
)
select edad,count(*) from personaMayor
group by edad
Ejemplo
-- obtener cantidad de empleados contratados en edad 40s y 50s x empresa
with CE(codEmpresa,nomEmpresa,decada)
as (select e.codEmpresa,nomEmp,(year(GETDATE())-year(fecNac))/10
from persona p, trabaja t, empresa e
where p.ci=t.ci and t.codEmpresa=e.codEmpresa
),
CE2(codEmpresa,nomEmpresa,decada,cant)
as (select codEmpresa,nomEmpresa,decada,count(*)
from CE
group by codEmpresa,nomEmpresa,decada
)
select t1.codEmpresa,t1.nomEmpresa,t1.decada, t1.cant,
t2.decada,t2.cant
from CE2 t1 full join CE2 t2
on (t1.codEmpresa=t2.codEmpresa and t1.decada+1=t2.decada)
where t1.decada=4
order by 2
Ejemplo: Ejecución
-- obtener cantidad de empleados contratados en edad 40s y 50s x empresa
with CE(codEmpresa,nomEmpresa,decada)
as (select e.codEmpresa,nomEmp,(year(GETDATE())-year(fecNac))/10
from persona p, trabaja t, empresa e
where p.ci=t.ci and t.codEmpresa=e.codEmpresa
),
CE2(codEmpresa,nomEmpresa,decada,cant)
as (select codEmpresa,nomEmpresa,decada,count(*)
from CE
group by codEmpresa,nomEmpresa,decada
)
select t1.codEmpresa,t1.nomEmpresa,t1.decada, t1.cant,
t2.decada,t2.cant
from CE2 t1 full join CE2 t2
on (t1.codEmpresa=t2.codEmpresa and t1.decada+1=t2.decada)
where t1.decada=4
order by 2
Ejercicios
Resolver los siguientes ejercicios
a) sin CTEs,
b) Usando CTEs
1. OBTENER LA cantidad de empleados
contratados por edad (SOLO CONSIDERAR
LAS PERSONAS MAYORES DE 50). La
respuesta debería tener edad, cant
2. OBTENER LA edad con mas contratados
(SOLO CONSIDERAR LAS PERSONAS
MAYORES DE 50)
/*
Ejemplos de CTE (common table expression)
*/OBTENER LA cantidad de contratados por edad
(SOLO CONSIDERAR LAS PERSONAS MAYORES DE 50)

with
personaMayor(ci,nombre,apellido,sexo,fecNac,edad)
as
(select *, year(GETDATE())-year(fecNac)
from persona
where (year(GETDATE())-year(fecNac) )>50
)
select edad,count(*) from personaMayor
group by edad

Ejemplo
Ejemplo
/*
Ejemplos de CTE (common table expression)
OBTENER LA edad con mas contratados
(SOLO CONSIDERAR LAS PERSONAS MAYORES DE 50)
*/
with
personaMayor(ci,nombre,apellido,sexo,fecNac,edad)
as
(select *, year(GETDATE())-year(fecNac)
from persona
where (year(GETDATE())-year(fecNac) )>50
),
cantPorEdad(edad,cant)
as
(select edad,count(*) from personaMayor
group by edad
),
mayorCant(mayCant) as
(select max(cant) as edadConMasContratados
from cantPorEdad)
select edad
from cantPorEdad t1, mayorCant t2
where cant=mayCant
/*
Ejecutando la consulta
Ejemplos de CTE (common table expression)
OBTENER LA edad con mas contratados
(SOLO CONSIDERAR LAS PERSONAS MAYORES DE 50)
*/
with
personaMayor(ci,nombre,apellido,sexo,fecNac,edad)
as
(select *, year(GETDATE())-year(fecNac)
from persona
where (year(GETDATE())-year(fecNac) )>50
),
cantPorEdad(edad,cant)
as
(select edad,count(*) from personaMayor
group by edad
),
mayorCant(mayCant) as
(select max(cant) as edadConMasContratados
from cantPorEdad)
select edad
from cantPorEdad t1, mayorCant t2
where cant=mayCant
Procedimientos almacenados
 Script con secuencia de comandos para que
ejecute el DBMS
 Buena forma de MODULARIZAR procesos
y procedimientos específicos
 Puede tener entradas y salidas
 Se ejecutan en el servidor, lo que puede
reducir los requerimientos de la
computadora y/o aplicación del cliente.
Utilidad de los procedim.
almacenados
 Conveniencia: encapsulo en una unidad fácil de usar una
lógica compleja del negocio
 Seguridad:
– previene el acceso a datos (haciendo que éstos sólo se
accedan mediante procedimientos almacenados)
– Ayuda a evitar SQL injection porque la entrada del usuario
(vía parámetros) es automáticamente capturada y no tratada
como parte del query.

 Centralización: Escribo código funcional en el servidor


(SQLserver), donde es más fácil actualizar que cuando
está en una aplicación distribuída.
Utilidad de los procedim.
almacenados
 Performance:
– SQL server puede guardar el plan de ejecución
de un procedimiento almacenado permitiendo
que en el futuro el procedimiento se ejecute más
rápido
– Promueve mejores prácticas, obligando a usar
mis procedimientos (con un mejor plan de
ejecución) en lugar de querys directos.
Crear y ejecutar un procedim
almacenado
CREATE PROCEDURE ejemplo
-- parameters
AS
BEGIN
SELECT * from alumno
END

EXEC ejemplo
modificar DEFINICIÓN DE
un procedim EXISTENTE
ALTER PROCEDURE ejemplo
-- parameters
AS
BEGIN
SELECT * from alumno
END

EXEC ejemplo
Borrar un procedim almacenado
DROP PROCEDURE ejemplo
SQLServer provee GUI para Crear
procedimientos almacenados

parámetros

Sentencia
SQL
GUI para Crear procedimientos almacenados
Ejecución del
procedim
almacenado

Sentencia
SQL
DDL para Crear procedim.
almacenados
Usando un arch. Sql
Store Procedures
Ejemplo Store Procedures
-- PROCEDIMIENTOS ALMACENADOS
-- procedimiento sin parámetros
CREATE PROCEDURE ejemplo

AS
SELECT * FROM empresa where patrimonio=200000

EXEC ejemplo
Ejemplo Store Procedures
-- PROCEDIMIENTOS ALMACENADOS
-- procedimiento con parámetros
CREATE PROCEDURE ejemplo2
@vPatrimonio float
AS
SELECT * FROM empresa where patrimonio=@vPatrimonio

EXEC ejemplo2 300000

CREATE PROCEDURE ejemplo3


@vPatrimonio float,
@vPromedioSalarial float

AS
SELECT * FROM empresa
where patrimonio=@vPatrimonio and
promedioSalarial=@vPromedioSalarial

EXEC ejemplo3 300000, 13100


Los procedimientos almacenados
pueden tener parámetros de salida
Ejemplo: Definir un proc. almacenado que reciba como parámetro de
entrada el carnet de un empleado y devuelva en un parámetro de salida
su salario
@vsalario es un
parámetro de salida
create procedure salarioDeUnEmp
@carnet int, Especifico que salario será la salida. Si el
@vsalario float OUTPUT resultado tuviera más de una fila, toma la
as última
select @vsalario = salario from trabaja where ci=@carnet

-- DECLARO UNA VARIABLE PARA GUARDAR LA SALIDA Del proc


DECLARE @sal float
EXECUTE salarioDeUnEmp 15, @sal OUTPUT;
PRINT 'el salario del empleado es'
Al ejecutar el procedim, paso
PRINT @sal la variable @sal para guardar
el valor de salida
Los procedimientos almacenados
pueden tener parámetros de salida
Ejemplo: Definir un proc. almacenado que reciba como parámetro de
entrada el carnet de un empleado y devuelva en un parámetro de salida
su salario

create procedure salarioDeUnEmp


@carnet int,
@vsalario float OUTPUT
as
select @vsalario = salario from trabaja where ci=@carnet

-- DECLARO UNA VARIABLE PARA GUARDAR LA SALIDA Del proc


DECLARE @sal float
EXECUTE salarioDeUnEmp 15, @sal OUTPUT;
PRINT 'el salario del empleado es '
PRINT @sal
Los procedimientos almacenados
pueden tener parámetros de salida
Ejemplo: Definir un proc. almacenado que reciba como parámetro de
entrada el carnet de un empleado y devuelva en un parámetro de salida
su salario

create procedure salarioDeUnEmp


@carnet int,
@vsalario float OUTPUT
as
select @vsalario = salario from trabaja where ci=@carnet

-- DECLARO UNA VARIABLE PARA GUARDAR LA SALIDA Del proc


DECLARE @sal float
EXECUTE salarioDeUnEmp 15, @sal OUTPUT;
PRINT 'el salario del empleado es '
PRINT @sal
Los procedimientos almacenados pueden
tener más de un parámetros de salida
Ejemplo: Definir un proc. almacenado que reciba como parámetro de
entrada el carnet de un empleado y devuelva en un 2 parámetros de
salida su salario y cargo @vsalario y @vcargo son
parámetros de salida
create procedure salarioCargoDeUnEmp
@carnet int,
Guardo los valores de salario y de cargo
@vsalario float OUTPUT,
@vcargo nchar(50) OUTPUT
en mis parámetros de salida
as @vsalario y @vcargo respectivamente
select @vsalario = salario,@vcargo = cargo
from trabaja where ci=@carnet

DECLARE @sal float,@cargo nchar(50)

EXECUTE salarioCargoDeUnEmp 15,@sal OUTPUT,@cargo OUTPUT


PRINT @sal
PRINT @cargo Al ejecutar el procedim, paso las
variables @sal y @cargo para
guardar los valores de salida
Los procedimientos almacenados pueden
tener más de un parámetros de salida
Ejemplo: Definir un proc. almacenado que reciba como parámetro de
entrada el carnet de un empleado y devuelva en un 2 parámetros de
salida su salario y cargo @vsalario y @vcargo son
parámetros de salida
create procedure salarioCargoDeUnEmp
@carnet int,
Guardo los valores de salario y de cargo
@vsalario float OUTPUT,
@vcargo nchar(50) OUTPUT
en mis parámetros de salida
as @vsalario y @vcargo respectivamente
select @vsalario = salario,@vcargo = cargo
from trabaja where ci=@carnet

DECLARE @sal float,@cargo nchar(50)

EXECUTE salarioCargoDeUnEmp 15,@sal OUTPUT,@cargo OUTPUT


PRINT @sal
PRINT @cargo Al ejecutar el procedim, paso las
variables @sal y @cargo para
guardar los valores de salida

También podría gustarte