lunes, 12 de mayo de 2014

Procedimientos almacenados en MySQL



Los procedimientos almacenados son un conjunto de comandos SQL que se almacenan en el gestor de la base de datos; facilitando en alguna medida que los desarrolladores sigan el lema DRY (No te repitas tu mismo), pues las sentencias se escriben una sola ves y pueden ser llamadas en cualquier momento y estas devolverán el resultado de los valores solicitados.

Poner en practica esta utilidad nos brinda ventajas y desventajas, como estas:
Ventajas:
  • Mejoran el rendimiento ya que se envía menos información entre cliente y servidor.
  • La respuesta a una petición, está directamente bajo el control del motor de base de datos.
  • Aseguran la integridad de los datos, validando la información que será ingresada o editada.
  • Brinda seguridad pues en la red solo está visible la llamada al procedimiento almacenado mas no los nombres de los objetos de base de datos y tablas.

Desventajas:
  • Carga de procesos excesiva en el servidor de base de datos.

Ejemplo de procedimientos almacenados en MySQL
Estos son los necesarios para realizar el mantenimiento (CRUD) a las entidades, así como la búsqueda de información dentro de ella:

SELECT:
-- --------------------------------------------------------------------------------
-- Autor: Kevin Eduardo Moran Ramirez
-- Note: Procedimiento almacenado en MySQL para consulta select
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE PROCEDURE `consulta_select` (
 IN Tabla VARCHAR(50),
 IN Campos VARCHAR(255),
 IN Donde VARCHAR(255),
 IN AgruparPor VARCHAR(50),
 IN OrdenarPor VARCHAR(50)
)
BEGIN
 # Verifico que si las variables contienen parametros
 IF Donde <> '' THEN SET Donde = CONCAT(' WHERE ', Donde); END IF;
 IF AgruparPor <> '' THEN SET AgruparPor = CONCAT(' GROUP BY ', AgruparPor); END IF;
 IF OrdenarPor <> '' THEN SET OrdenarPor = CONCAT(' ORDER BY ', OrdenarPor); END IF;
 SET @VConsulta = CONCAT(
  "SELECT ", Campos , " FROM ", Tabla, Donde, AgruparPor, OrdenarPor, ";"
 );
 #Preparo y ejecuto la sentencia SQL
 PREPARE Declaracion FROM @VConsulta;
 EXECUTE Declaracion;
END

INSERT:
-- --------------------------------------------------------------------------------
-- Autor: Kevin Eduardo Morán Ramirez
-- Note: Procedimiento almacenado en MySQL para consulta insert into
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE PROCEDURE `consulta_insertar` (
 IN Tabla VARCHAR(50),
 IN Campos VARCHAR(255),
 IN Valores VARCHAR(255)
)
BEGIN
 SET @VConsulta = CONCAT(
  "INSERT INTO ", Tabla , "(" , Campos , ") VALUES(" , Valores , ")"
 );
 PREPARE Declaracion FROM @VConsulta;
 EXECUTE Declaracion;
END

UPDATE:
-- --------------------------------------------------------------------------------
-- Autor: Kevin Eduardo Morán Ramirez
-- Note: Procedimiento almacenado en MySQL para consulta update
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE PROCEDURE `consulta_actualizar` (
 IN Tabla VARCHAR(50),
 IN Establecer VARCHAR(255),
 IN Donde VARCHAR(255)
)
BEGIN
 SET @VConsulta = CONCAT(
  "UPDATE " , Tabla , " SET " , Establecer ," WHERE " , Donde
 );
 PREPARE Declaracion FROM @VConsulta;
 EXECUTE Declaracion;
END

DELETE:
-- --------------------------------------------------------------------------------
-- Autor: Kevin Eduardo Morán Ramirez
-- Note: Procedimiento almacenado en MySQL para consulta delete
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE PROCEDURE `consulta_eliminar` (
 IN Tabla VARCHAR(50),
 IN Donde VARCHAR(255)
)
BEGIN
 SET @VConsulta = CONCAT(
  "DELETE " , Tabla , " WHERE " , Donde
 );
 PREPARE Declaracion FROM @VConsulta;
 EXECUTE Declaracion;
END