Sei sulla pagina 1di 15

PROCEDIMIENTOS ALMACENADOS

STORED PROCEDURE

U
n procedimiento almacenado es un programa físicamente en una base de datos.
Su implementación varia de un gestor de base de datos a otro. La ventaja de un
procedimiento almacenado es que, al ser ejecutado, en respuesta a una petición
de usuario, es ejecutado directamente en el motor de base de datos el cual usualmente corre
en un servidor separado. Posee acceso directo a los datos que necesita manipular y solo necesita
enviar sus resultados de regreso al usuario deshaciéndose de la sobrecarga resultante de
comunicar grandes cantidades de datos salientes y entrantes.

 El procedimiento almacenado (stored procedure) es un conjunto de comando SQL que


pueden almacenarse en el servidor el cual ejecuta una acción o un conjunto de acciones.
 En los procedimientos almacenados pueden contener instrucciones, como pueden
contener muchas instrucciones distintas, puede haber
instrucciones SELECT, INSERT, UPDATE, DELETE contenidas dentro de un procedimiento
almacenado.

Ventajas
Procedimientos almacenados
en SQL Server

REUTILIZACIÓN DEL CÓDIGO


El encapsulamiento en un procedimiento es óptimo para reutilizar su código. Se elimina la
necesidad de escribir el mismo código, se reducen inconsistencias en el código y permite que
cualquier usuario ejecute el código aún sin tener acceso a los objetos que hace referencia.

1
MAYOR SEGURIDAD
Se pueden ejecutar SP con instrucciones que hacen referencia a objetos que los usuarios no
tienen permisos. El procedimiento realiza la ejecución del código y todas las instrucciones y
controla el acceso a los objetos a los que hace referencia. Esto hace más sencillo la asignación
de permisos. Se puede implementar la suplantación de usuarios usando Execute As. Existe un
nivel fuerte de encapsulamiento.

TRÁFICO DE RED REDUCIDO


Un SP se ejecuta en un único lote de código. Esto reduce el tráfico de red cliente servidor porque
únicamente se envía a través de la red la llamada que ejecuta el SP. La encapsulación del código
del SP permite que viaje a través de la red como un solo bloque.

MANTENIMIENTO MÁS SENCILLO


Se puede trabajar en los aplicativos en base a capas, cualquier cambio en la Base de datos, hace
sencillo los cambios en los procedimientos que hacen uso de los objetos cambiados en la BD.

RENDIMIENTO MEJORADO
Los procedimientos almacenados se compilan la primera vez que se ejecutan y crean un plan de
ejecución que vuelve a usarse en posteriores ejecuciones.

Desventajas
Procedimientos almacenados
en SQL Server

 Hacen que la base de datos sea más pesada tanto para la memoria como para el
procesador. En vez de estar concentrado en almacenar y devolver datos, uno puede
estarle pidiendo al SGBD que realice varias operaciones lógicas, la cual no es su función.

 Sólo contienen SQL declarativo, así que es muy dificultoso escribir procedimientos
complejos para negocios como en otros lenguajes de programación en la capa de
aplicación tales como Java, C#,C++.

2
 Algunos SGBD modernos (notablemente Microsoft SQL Server 2000 en adelante) no
ofrecen ninguna ventaja de desempeño usando SP: son compilados y almacenados en
caché de la misma forma dynamic SQL.

Tipos
Procedimientos almacenados
en SQL Server
DEFINIDOS POR EL USUARIO
Se crea por el usuario en las bases de datos definidas por el usuario o en las de sistema (Master,
Tempdb, Model y MSDB)

PROCEDIMIENTOS ALMACENADOS TEMPORALES


Los procedimientos temporales son procedimientos definidos por el usuario, estos se
almacenan en tempdb. Existen dos tipos de procedimientos temporales: locales (primer
carácter es #) y globales (primer carácter ##). Se diferencian entre sí por los nombres, la
visibilidad y la disponibilidad. Los procedimientos temporales locales tienen como primer
carácter de sus nombres un solo signo de número (#); solo son visibles en la conexión actual del
usuario y se eliminan cuando se cierra la conexión. Los procedimientos temporales globales
presentan dos signos de número (##) antes del nombre; lo pueden usar todos los usuarios
conectados, se eliminan cuando se desconectan todos los usuarios.

PROCEDIMIENTOS ALMACENADOS DEL SISTEMA


Los procedimientos del sistema son propios de SQL Server. Los caracteres iniciales de estos
procedimientos son sp_ la cual no se recomienda para los procedimientos almacenados
definidos por el usuario.

Extendidos definidos por el usuario


Los procedimientos extendidos tienen instrucciones externas en un lenguaje de programación
como puede ser C. Estos procedimientos almacenados son DLL que una instancia de SQL Server
puede cargar y ejecutar dinámicamente.

3
Elementos de los procedimientos almacenados
Los procedimientos almacenados están compuestos por algunos de estos elementos:
 Parámetros de entrada (pueden esperar parámetros)
 Parámetros de salida (pueden devolver resultados)
 Declaración de variables (puede usarse variables en su cuerpo)
 Cuerpo del procedimiento (en su cuerpo se indican las acciones a realizar)

Tanto los parámetros de entrada como los de salida son opcionales. Podemos tener un
procedimiento que no tenga parámetros de entrada, pero sí de salida y viceversa. Como todo
buen programador sabe, los parámetros de entrada sirven para pasarle datos al procedimiento
que necesita para llevar a cabo una acción determinada. Los parámetros de salida devuelven al
programa cliente que ejecutó el procedimiento el resultado del mismo.

Utilidades
Los procedimientos almacenados son muy útiles sobre todo en arquitecturas cliente/servidor
donde hay un servidor muy potente el cual se puede aprovechar para ejecutar procesos,
consultas y actualizaciones complejas en la base de datos.
Posibles usos que pueden darse a estos objetos de la base de datos
 Por ejemplo, si deseamos obtener un reporte complejo que incluya instrucciones
condicionales y cálculos complejos con datos obtenidos de varias tablas, un
procedimiento almacenado es nuestro mejor aliado. También se pueden ejecutar
complejos procesos que a veces tardan horas cuando son ejecutados desde el cliente,
ya que en tales casos la información debe pasar del servidor al cliente y viceversa.
 Casi siempre las computadoras servidores son poderosas máquinas con mucha
memoria, discos rápidos y uno o más procesadores también muy rápidos. Por lo tanto,
al ejecutar los procesos mediante procedimientos almacenados estamos aprovechando
toda esa capacidad de cómputo disponible en el hardware del servidor.

Algunos casos en que pueden resultar particularmente útiles


 Cuando múltiples aplicaciones cliente se escriben en distintos lenguajes o funcionan en
distintas plataformas, pero necesitan realizar la misma operación en la base de datos.
Cuando la seguridad es muy importante. Los bancos, por ejemplo, usan procedimientos
almacenados para todas las operaciones comunes.

4
 Esto proporciona un entorno seguro y consistente, y los procedimientos pueden
asegurar que cada operación se loguea apropiadamente. En tal entorno, las aplicaciones
y los usuarios no obtendrían ningún acceso directo a las tablas de la base de datos, sólo
pueden ejecutar algunos procedimientos almacenados.

SINTAXIS

Create Procedure Procedimiento @NombreParametro Tipo de dato

As Instrucciones

A continuación, lo ejecutamos introduciendo un valor/res correspondiente al parámetro/os


introducido.

Exec Procedimiento Valor

Empecemos a trabajar

Create database StoreProcedureSQL


go

use StoreProcedureSQL
go

Create table Carreras


(
CarrerasCodigo nchar(5),
CarrerasDescripcion nvarchar(100),
CarrerasAcreditada nchar(1),
CarrerasVacantes Numeric(9,2),
CarrerasEstado nchar(1),
constraint CarrerasPK Primary key (CarrerasCodigo)
)
go

insert into Carreras values


('95642','Ing. de SISTEMAS','S',250,'A'),
('28596','ADMINISTRACION','S',290,'A'),
('05252','Ing. INDUSTRIAL','S',450,'A'),
('78596','MEDICINA','N',100,'A'),
('45687','Ing. AMBIENTAL','S',450,'A'),
('58795','PSICOLOGÍA','S',200,'A'),
('21458','Ing. EMPRESARIAL','S',350,'A'),
('45879','Ing. LOGÍSTICA','S',280,'A')
go

5
Store Procedure
Insertar

6
Store procedure

Resultado…

Store Procedure
Editar

Actual antes de editar

7
Resultado…

Store Procedure
Eliminar

Actual antes de eliminar

8
Resultado…

EJEMPLO N° 1
Crear un procedimiento para consultar los datos del empleado mediante su DNI

CREATE PROCEDURE EMPLEADO


DNI @DNI CHAR(8)
AS
SELECT *
FROM empleado
WHERE dni = @DNI;

EXEC EMPLEADODNI '75111097'

RESULTADO…

EJEMPLO N° 2
Crear un procedimiento donde se busque al empleado por su Apellido Paterno y visualizar
que tipo de empleado es.

CREATE PROCEDURE TIPOEMPLEADOAP


@APELLIDOOPATERNO VARCHAR(20) = 'Moreno'
AS
SELECT nombres, apellido_paterno, apellido_materno,dni, direccion, celular,
tipo_empleado.nombre_tipo as 'tipo empleado'
FROM empleado
INNER JOIN tipo_empleado ON tipo_empleado.id_tipo_empleado =
empleado.id_tipo_empleado
WHERE apellido_paterno = @APELLIDOOPATERNO;

EXEC TIPOEMPLEADOAP;

9
RESULTADO…

EJEMPLO N° 3
Crear un procedimiento para visualizar los detalles del cliente por su Apellido_Parterno
quien ha recibido el comprobante según la fecha determinada

CREATE PROCEDURE CLIENTEPORCOMPROBANTE1 (@APELLIDOPATERNO VARCHAR(20),@FECHA


datetime)
AS
SELECT *
FROM cliente
INNER JOIN comprobante ON comprobante.id_cliente = cliente.id_cliente
WHERE cliente.apellido_paterno = @APELLIDOPATERNO
AND comprobante.fecha = @FECHA;

EXEC CLIENTEPORCOMPROBANTE1 'Vilma','2018-03-12 09:00:00';

RESULTADO…

EJEMPLO N° 4
Crear un procedimiento donde se calcule las ventas que hace cada sucursal

CREATE PROCEDURE VENTASPORSUCURSAL @NOMBRESU VARCHAR(45)


AS
SELECT sucursal.nombre_sucursal,
(
SELECT COUNT(*)
FROM comprobante
WHERE comprobante.id_sucursal = sucursal.id_sucursal
) as 'numero comprobantes'
FROM sucursal
WHERE nombre_sucursal = @NOMBRESU;

EXEC VENTASPORSUCURSAL 'PharmaSEL';

10
RESULTADO…

EJEMPLO N° 5
Crear un procedimiento donde se inserte nuevos productos e indicarles los parámetros

CREATE PROCEDURE [INSERTA PRODUCTO]


(
@ID char(4),
@NOMBRE VARCHAR(50),
@DESCRIPCION TEXT,
@PRECIO DECIMAL(4,2),
@PRESENTACION VARCHAR(50),
@FECHA_FABRICACION DATE,
@FECHA_CADUCIDAD DATE,
@ID_CATEGORIA CHAR(4),
@ID_MARCA CHAR(4),
@ID_LABORATORIO CHAR(4),
@ID_CONCENTRACION CHAR(4)
)
AS
--Ingresar en la tabla 'producto' los siguientes datos
INSERT INTO producto VALUES
(
--Esto hara que se agreguen los datos como un nuevo producto
@ID, @NOMBRE, @DESCRIPCION, @PRECIO, @PRESENTACION, @FECHA_FABRICACION,
@FECHA_CADUCIDAD, @ID_CATEGORIA,
@ID_MARCA, @ID_LABORATORIO, @ID_CONCENTRACION
)

--Ejecutar el procedimiento nombrando los datos que quiero ingresar


EXEC [INSERTA PRODUCTO] 'PN01','Betametasona','crema','29.00','Envase','2017-05-
02','2018-01-02','CT01','M001','L001','CO10';

11
RESULTADO…

EJEMPLO N° 6
Crear un procedimiento donde permita conocer cuántos comprobantes ha emitido un
determinado empleado mediante su DNI y en una fecha establecida

CREATE PROCEDURE NCOMPROBANTESPOREMPLEADO (@DNI CHAR(8) , @FECHA date)


AS
BEGIN
SELECT nombres+', '+ apellido_paterno +' '+apellido_materno as 'nombres
completos',
dni, (
SELECT COUNT(*)
FROM comprobante
WHERE comprobante.id_empleado = id_empleado
AND comprobante.fecha = @FECHA
) as numero_comprobantes
FROM empleado
WHERE dni = @DNI;
END

EXEC NCOMPROBANTESPOREMPLEADO '75111097','2018-05-02';

RESULTADO…

12
EJEMPLO N° 7
Crear un procedimiento donde se pueda visualizar todas las marcas que puede tener un
determinado producto.

CREATE PROCEDURE LISTMARCAPRODUCT @NOMBREPRODUCTO VARCHAR(50)


AS
BEGIN
IF( (SELECT count(id_producto) as count_product
FROM producto
WHERE nombre = @NOMBREPRODUCTO) > 0)

SELECT id_producto,producto.nombre, producto.descripcion, precio,


producto.fecha_fabricacion, producto.fecha_caducidad,
marca_producto.nombre as 'marca producto'
FROM producto
INNER JOIN marca_producto ON marca_producto.id_marca_producto =
producto.id_marca
WHERE producto.nombre = @NOMBREPRODUCTO;
ELSE
PRINT 'El producto : ' +@NOMBREPRODUCTO+'que se ha ingresado no existe :('
END

EXEC LISTMARCAPRODUCT 'Deflazacort';

RESULTADO…

EJEMPLO N° 8
Crear un procedimiento donde se puede ingresar el tipo de producto y a partir de ahí dar
una lista de esos productos

CREATE PROCEDURE PRODUCTOSSTIPO


@NOMBRETIPOPRODUCTO VARCHAR(47)
AS
SELECT *
FROM categoria
INNER JOIN producto ON producto.id_categoria = categoria.id_categoria
WHERE categoria.nombre = @NOMBRETIPOPRODUCTO ;

EXEC PRODUCTOSSTIPO 'Dermatologia';

13
RESULTADO…

EJEMPLO N° 9
Crear un procedimiento para que cargo tiene un empleado, que se buscara por su
apellido_paterno

CREATE PROCEDURE NOMBRECARGOEMPLEADO


@APELLIDOPATERNO VARCHAR(20)
AS
DECLARE @APELLOPATERNODEFAULT VARCHAR(20)
SET @APELLOPATERNODEFAULT = NULL
SELECT @APELLOPATERNODEFAULT = apellido_paterno
FROM empleado
WHERE apellido_paterno = @APELLIDOPATERNO
IF( @APELLOPATERNODEFAULT IS NULL)
PRINT 'El apellido paterno introducido no es es válido: ' +
@APELLIDOPATERNO
ELSE
BEGIN
SELECT Emp.id_empleado, nombres, apellido_paterno,
apellido_materno, dni,
direccion, celular,
(
SELECT nombre_cargo
FROM cargo_empleado
WHERE cargo_empleado.id_cargo = Emp.id_cargo
) as 'nombre cargo'
FROM empleado as Emp
WHERE Emp.apellido_paterno = @APELLIDOPATERNO;
END

EXEC NOMBRECARGOEMPLEADO 'Jacome';

RESULTADO…

14
EJEMPLO N° 10
Crear un procedimiento donde se pueda visualizar los detalles de unos comprobantes
mediante fecha que se ha emitido

CREATE PROCEDURE FECHACOMPROBANTED @fecha datetime


AS
BEGIN
IF ( (select count(id_comprobante) AS 'count' from comprobante
where fecha = @fecha) > 0)

SELECT comprobante.id_comprobante, fecha,


numero_caja, cantidad,
(
SELECT nombre
FROM producto
WHERE producto.id_producto =
detalle_comprobante.id_producto
) as nombre_producto
FROM comprobante
INNER JOIN detalle_comprobante ON
detalle_comprobante.id_comprobante = comprobante.id_comprobante
WHERE fecha = @fecha;
ELSE
PRINT 'LA FECHA QUE HA INGRESADO NO CORRESPONDE A NINGUN
COMPROBANTE'
END

EXEC FECHACOMPROBANTED '2018-03-12 09:00:00'

RESULTADO…

Elaborar 20 Procedimientos Almacenados


con su respectiva interpretación en la base
de datos asignada.

15

Potrebbero piacerti anche