You are on page 1of 22

Sistemas de Base de Datos

Servicios de Bases de Datos

Funciones y procedimientos

DAI - Mgt. Arturo Rozas Huacho 1


Sistemas de Base de Datos

Servicios de Bases de Datos

TCP/IP BASE DE
DATOS

DAI - Mgt. Arturo Rozas Huacho 2


Sistemas de Base de Datos
Servicios de Base de Datos
Los servicios de BD se almacenan en la base de datos y pueden ser
funciones y procedimientos.

Aplicación

Solicitud Servicios (SQL)


Aplicación BASE DE
DATOS
Datos

Servicio 1
Aplicación Servicio 2
Servidor …
Servicio n

Clientes
DAI - Mgt. Arturo Rozas Huacho 3
Sistemas de Base de Datos

Servicios de BD
 Los servicios de BD pueden ser de tipo función o
de tipo procedimiento (stored procedure)
 Son un grupo de sentencias SQL que es compilado
una vez, y luego puede ser ejecutado muchas
veces.
 Las funciones y los procedimientos almacenados
se almacenan en la base de datos y constituyen
los servicios que ofrece la base de datos
(Cliente/Servidor).
 Las funciones y los procedimientos almacenados
cuando se ejecutan no tienen que ser
recompilados cada vez, este hecho hace que sean
muy eficientes.

DAI - Mgt. Arturo Rozas Huacho 4


Sistemas de Base de Datos

Funciones en SQL SERVER


Escalares
De conjunto de filas
Integradas
De agregado

Del sistema De categoría


Almacenadas del sistema

Funciones De administración dinámica

Escalares
Internas De tabla en línea
Definidas por el usuario De tabla multisentencia

Externas

UNSAAC - DAI - Mgt. Arturo Rozas Huacho 5


Sistemas de Base de Datos

Funciones en SQL SERVER

Ejemplos de funciones:
De administración dinámica

select *
from sys.dm_tran_active_transactions

UNSAAC - DAI - Mgt. Arturo Rozas Huacho 6


Sistemas de Base de Datos

Funciones internas definidas por el usuario

Se tienen tres tipos:


 Escalares: Retornan un tipo de los datos como
int, money, varchar, real, etc. Pueden ser
utilizadas dentro de sentencias SQL.

 De tabla en Linea: Retornan la salida de una


simple declaración SELECT. La salida se puede
utilizar dentro de composiciones o consultas
como si fuera una tabla de estándar.

 De multisentencia: Dan como resultado una


tabla, puede estar constituido por varias
sentencias SQL, y puede llamar a otras
funciones. La salida también se puede utilizar
en operaciones de tabla.

DAI - Mgt. Arturo Rozas Huacho 7


Sistemas de Base de Datos

Funciones Definidas por el Usuario…


Funciones escalares:
/* ********************************************
Function que convierte una nota de tipo texto a número
********************************************* */
ALTER FUNCTION fnNota (@NotaTexto varchar(3))
RETURNS int
AS
BEGIN
declare @Nota int;
set @Nota = case
when @NotaTexto = 'NSP' then 0
else Cast(@NotaTexto as int)
end;
return(@Nota);
END

DAI - Mgt. Arturo Rozas Huacho 8


Sistemas de Base de Datos

Funciones Definidas por el Usuario…


Funciones escalares:
/* *********************************************
Function que convierte una nota a número
********************************************** */
CREATE FUNCTION fnRecuperarNota (@Semestre varchar(7),
@Cod_Asignatura varchar(5),
@Cod_Alumno varchar(6))
RETURNS int
AS
BEGIN
declare @Nota int;
select @Nota = dbo.fnNota(Nota)
from MATRICULA
where (Semestre = @Semestre) and
(Cod_Asignatura = @Cod_Asignatura) and
(Cod_Alumno = @Cod_Alumno)
return(@Nota)
END

DAI - Mgt. Arturo Rozas Huacho 9


Sistemas de Base de Datos

Funciones Definidas por el Usuario…


Funciones de tabla en Línea:
/* *******************************************************
Function que devuelve las asignaturas aprobadas
******************************************************* */
ALTER FUNCTION fnAsignaturasAprobadas(@Cod_CP varchar(2))
RETURNS TABLE
AS
RETURN (SELECT M.Semestre, M.Cod_CP, M.Cod_Alumno,
M.Cod_Asignatura,
A.Nombre_Asignatura, A.Creditos, A.Categoria,
Nota = dbo.fnNota(M.Nota)
FROM MATRICULA M inner join ASIGNATURA A
ON (M.Cod_Asignatura = A.Cod_Asignatura) and
(M.Cod_CP = A.Cod_CP)
WHERE ((M.Cod_CP = @Cod_CP) or (@Cod_Cp = '*')) and
(dbo.fnNota(M.Nota) > 10))

DAI - Mgt. Arturo Rozas Huacho 10


Sistemas de Base de Datos

Funciones Definidas por el Usuario…


Funciones de multisentencia:
/* **********************************************************
Function que devuelve los creditos acumulados semestre a
semestre de los alumnos de una carrera o en general
********************************************************** */
CREATE FUNCTION fnCreditosAcumuladosSemestre(@Cod_CP varchar(2))
RETURNS @taCreditosAcumuladosSemestre TABLE (Semestre varchar(7),
Cod_Alumno varchar(6),
Paterno varchar(15),
Materno varchar(15),
Nombres varchar(15),
Cod_Cp varchar(2),
Creditos int,
Creditos_Acum int)
AS
BEGIN
-- Crear tabla temporal para acumular creditaje
declare @taCreditosAcumulados table(Semestre varchar(7),
Cod_Alumno varchar(6),
Creditos int,
Creditos_Acum int)

DAI - Mgt. Arturo Rozas Huacho 11


Sistemas de Base de Datos

Funciones Definidas por el Usuario…


Funciones de multisentencia:
-- Recuperar información a la tabla temporal
insert into @taCreditosAcumulados
select Semestre, Cod_Alumno, sum(Creditos), sum(Creditos)
from dbo.fnAsignaturasAprobadas(@Cod_CP)
group by Semestre, Cod_Alumno
order by Cod_Alumno, Semestre

-- Acumular los creditos por semestre


-- Declarar e inicializar variables
declare @Cod_Alumno varchar(6),
@Creditos_Acum int;
set @Cod_Alumno = '';
set @Creditos_Acum = 0;

DAI - Mgt. Arturo Rozas Huacho 12


Sistemas de Base de Datos

Funciones Definidas por el Usuario…


Funciones de multisentencia:
-- Acumular creditos
update @taCreditosAcumulados
set @Creditos_Acum = Creditos_Acum = case
when @Cod_Alumno <>
Cod_Alumno then Creditos
else @Creditos_Acum +
Creditos
end,
@Cod_Alumno = Cod_Alumno;

-- Devolver resultado
INSERT INTO @taCreditosAcumuladosSemestre
SELECT C.Semestre, A.Cod_Alumno, A.Paterno, A.Materno, A.Nombres,
A.Cod_CP, C.Creditos, C.Creditos_Acum
from @taCreditosAcumulados C inner join ALUMNO A
ON C.Cod_Alumno = A.Cod_Alumno
RETURN
END

DAI - Mgt. Arturo Rozas Huacho 13


Sistemas de Base de Datos

Procedimientos Almacenados

Un procedimiento almacenado (stored procedure) es un grupo de


sentencias SQL que es compilado una vez, y luego puede ser
ejecutado muchas veces; se almacena en la base de datos y
constituye los servicios que ofrece la base de datos
(Cliente/Servidor).

Los procedimientos almacenados cuando se ejecutan no tienen que


ser recompilados cada vez, este hecho hace que sean muy eficientes.

DAI - Mgt. Arturo Rozas Huacho 14


Sistemas de Base de Datos

Procedimientos Almacenados…
 Se escriben utilizando el lenguaje de programación de la
base de Datos. Permiten declaración de variables,
sentencias de asignación, estructuras selectivas y
repetitivas.

 Aceptan parámetros de entrada y salida

 Pueden retornar conjunto de datos así como también un


solo valor.

 Permiten la programación modular y puede hacer referencia


a otros procedimientos almacenados, con lo que se puede
simplificar una serie de instrucciones complejas.

 Pueden ser ejecutados desde otros procedimientos


almacenados, vistas, disparadores y consultas en general.
DAI - Mgt. Arturo Rozas Huacho 15
Sistemas de Base de Datos

Procedimientos Almacenados…

Sintaxis :

CREATE PROCEDURE nombre procedimiento


@parametros tipo de dato [= valor],
@parametros_salida tipo de dato OUTPUT
AS
[DECLARE @Variables tipos]
BEGIN
sentencias sql
END

DAI - Mgt. Arturo Rozas Huacho 16


Sistemas de Base de Datos

Procedimientos Almacenados…
Escribir procedimientos almacenados
Escribir un procedimiento para determinar la
relación de alumnos de una determinada carrera
CREATE PROCEDURE sp_AlumnosPorCarrera
@Cod_Carrera varchar(2)
AS
BEGIN
-- Seleccionar alumnos de la carrera indicada
SELECT *
FROM ALUMNO
WHERE Cod_Carrera = @Cod_Carrera
END

Constituye el código fuente, se debe almacenar


como un archivo de extensión SQL.
Este código se debe compilar y almacenar en la
base de datos, para que pueda ser invocado como un
servicio.
DAI - Mgt. Arturo Rozas Huacho 17
Sistemas de Base de Datos

Procedimientos Almacenados…

Ejecución de un procedimiento.
Sintaxis :

[DECLARE @variables tipo de variable]


EXEC/EXECUTE nombre_procedimiento [@parametros], [@variables]

Ejemplo de ejecución:

exec sp_AlumnosPorCarrera ‘IN’

DAI - Mgt. Arturo Rozas Huacho 18


Sistemas de Base de Datos

Procedimientos Almacenados…

Ejemplo: Generador de Stored procedures

IF OBJECT_ID ( 'spu_GeneradorStoredProcedure', 'P' ) IS NOT NULL


DROP PROCEDURE spu_GeneradorStoredProcedure;
GO
CREATE PROCEDURE spu_GeneradorStoredProcedure @NomTabla varchar(256)
AS
begin
-- Crear sentencia de parametros del procedimiento almacenado y la sentencia insert
declare @TextoParametros varchar(8000);
declare @TextoInsert varchar(8000);
set @TextoParametros = '';
set @TextoInsert = 'insert into '+ @NomTabla + ' values(';

DAI - Mgt. Arturo Rozas Huacho 19


Sistemas de Base de Datos

Stored procedures. Generador de Stored procedures


-- Mediante un cursor construir dinámicamente ambos textos
-- Declarar el cursor
declare cu_Atributos cursor
for select c.name As Atributo, t.name as Tipo, c.max_length as Longitud, c.precision as
Precision, c.scale as Decimales
from sys.columns c inner join sys.types AS t ON c.system_type_id=t.user_type_id
where Object_Id = (select Object_Id from sys.tables where Name = @NomTabla)
-- Declarar variables para utilizar en el cursor
declare @Atributo varchar(256), @Tipo varchar(24), @Longitud int, @Precision int,
@Decimales int;
-- Abrir el cursor
open cu_Atributos
-- Recuperar el primer registro en las variables
fetch next from cu_Atributos into @Atributo, @Tipo, @Longitud, @Precision, @Decimales
-- Procesar cada atributo
declare @Separador varchar(1);
set @Separador = '';

DAI - Mgt. Arturo Rozas Huacho 20


Sistemas de Base de Datos

Stored procedures. Generador de Stored procedures


while @@FETCH_STATUS = 0
begin
-- Construir textos
set @TextoParametros = @TextoParametros + @Separador + ' @' + @Atributo + ' ' + @Tipo +
case Upper(@Tipo)
when 'VARCHAR' then '('+Cast(@Longitud as varchar(4))+')'
when 'DATETIME' then ''
when 'INT' then ''
when 'NUMERIC' then '(' + Cast(@Precision as varchar(4))+','+Cast(@Decimales as varchar(4))+')'
when 'DECIMAL' then '(' + Cast(@Precision as varchar(4))+','+Cast(@Decimales as varchar(4))+')'
else ''
end;

set @TextoInsert = @TextoInsert + @Separador + '@' + @Atributo;


set @Separador = ',';
-- Recuperar siguiente registro
fetch next from cu_Atributos into @Atributo, @Tipo, @Longitud, @Precision, @Decimales
end
-- Cerrar el cursor
close cu_Atributos
deallocate cu_Atributos

DAI - Mgt. Arturo Rozas Huacho 21


Sistemas de Base de Datos

Stored procedures. Generador de Stored procedures


-- Completar TextoInsert
set @TextoInsert = @TextoInsert + ') ';

-- Declarar variable para generar sentencia SQL dinámicamente


declare @TextoSQL varchar(8000);
-- Borrar stored procedure si existiese
set @TextoSQL = 'if OBJECT_ID ( ''spu_'+@NomTabla+''', ''P'' ) IS NOT NULL '+
'drop procedure spu_'+@NomTabla+'; ';
exec(@TextoSQL)

-- Generar stored procedure


set @TextoSQL = 'create procedure spu_' + @NomTabla + ' ' + @TextoParametros+' '+
'as '+
'begin '+
@TextoInsert+ ' '+
'end; ';
exec(@TextoSQL)
end;
GO
-- exec spu_GeneradorStoredProcedure 'Entrada_Detalle'

DAI - Mgt. Arturo Rozas Huacho 22

You might also like