Material del curso de SQL de la UNACAR 2020
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

3.3 KiB

Procedimientos almacenados

Un procedimiento almacenado MySQL no es más que una porción de código que puedes guardar y reutilizar. Es útil cuando repites la misma tarea repetidas veces, siendo un buen método para encapsular el código. Al igual que ocurre con las funciones, también puede aceptar datos como parámetros, de modo que actúa en base a éstos.

Ventajas

  • Al reducir la carga en las capas superiores de al aplicación, se reduce el tráfico de red y, si el uso de los procedimientos almacenados es el correcto, puede mejorar el rendimiento.

  • Al encapsular las operaciones en el propio código SQL, nos aseguramos de que el acceso a los datos es consistente entre todas las aplicaciones que hagan uso de ellos.

  • En cuanto a seguridad, es posible limitar los permisos de acceso de usuario a los procedimientos almacenados y no a las tablas directamente. Des este modo evitamos problemas derivados de una aplicación mal programada que haga un mal uso de las tablas.

Desventajas

  • Al igual que ocurre con toda tecnología, tenemos que formarnos para aprender a crear procedimientos, por lo que existe cierta curva de aprendizaje.

  • Otro posible problema puede ocurrir con las migraciones. No todos los sistemas gestores de bases de datos usan los procedimientos del mismo modo, por lo que se reduce la portabilidad del código.

  • Al hacer cambios en las estructuras de datos habra que hacer modificaciones al codigo de los procedimientos.

Sintaxis

CREATE PROCEDURE nombre_procedimiento
AS
sentencias_sql
GO;

Parametros de entrada

En los procedimientos almacenados podemos tener tres tipos de parámetros:

  • Entrada: Se indican poniendo la palabra reservada IN delante del nombre del parámetro. Estos parámetros no pueden cambiar su valor dentro del procedimiento, es decir, cuando el procedimiento finalice estos parámetros tendrán el mismo valor que tenían cuando se hizo la llamada al procedimiento. En programación sería equivalente al paso por valor de un parámetro.
  • Salida: Se indican poniendo la palabra reservada OUT delante del nombre del parametro. Estos parámetros cambian su valor dentro del procedimiento. Cuando se hace la llamada al procedimiento empiezan con un valor inicial y cuando finaliza la ejecución del procedimiento pueden terminar con otro valor diferente. En programación sería equivalente al paso por referencia de un parámetro.
  • Entrada/Salida: Es una combinación de los tipos IN y OUT. Estos parámetros se indican poniendo la palabra reservada IN/OUT delante del nombre del parámetro.

Implementación

Crearemos un procedimiento que retornara el stock de un producto.

Sintaxis

DROP PROCEDURE IF EXISTS puntodeventa.calcularStock;

DELIMITER $$
$$
CREATE PROCEDURE puntodeventa.calcularStock(in id_producto int, out stock float)
begin	
	select sum(cantidad) into @altas
	from puntodeventa.movimientos 
	where producto_id = id_producto and tipo = 1;
	select sum(cantidad) into @bajas
	from puntodeventa.movimientos 
	where producto_id = id_producto and tipo != 1;
	set stock = @altas - @bajas;
END$$
DELIMITER ;

LLamar a un procedimiento almacenado

Sintaxis

set @stock=0;
CALL calcularStock(18, @stock);
select @stock as stock;

Borrar un procedimiento ya creado

Sintaxis

DROP PROCEDURE calcularStock;