Procedimientos Almacenados en MySQL
Procedimientos Almacenados en MySQL
Son pequeños programas desarrollados en código SQL que se almacenan junto con la base de
datos y se utilizan para realizar transacciones u operaciones como insertar o modificar registros.
Además aumentamos la seguridad de nuestra base de datos MySQL al conceder únicamente
permisos para la ejecución de los procedimientos necesarios.
Sintaxis de la sentencia
CREATE PROCEDURE nombre (parámetros)
[características] definición
Ejemplo
DELIMITER //
CREATE PROCEDURE pa_listaclientes_tipo(IN tipoCliente INT)
BEGIN
SELECT * FROM clientes WHERE tipo = tipoCliente;;
END//
DELIMITER ;
MYSQL entiende que una sentencia finaliza con un punto y coma. La sentencia DELIMITER
cambia el carácter de finalización por cualquier otro carácter, por convención se utiliza // para
indicar el fin del procedimiento almacenado para que MySQL no finalice el procedimiento
almacenado al encontrar el primer punto y coma.
Ejemplo
CALL pa_listaclientes_tipo(30);
Disparadores en MySQL (TRIGGER)
Su funcionalidad es la de detectar ciertos eventos asociados a una tabla de la base de datos y
ejecutar una serie de acciones tras dicha detección. Estas acciones también son conocidas como
disparadores.
Sintaxis de la sentencia
CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name
trigger_time trigger_event
ON tbl_name FOR EACH ROW
[trigger_order]
trigger_body
Os explico la sintaxis:
DELIMITER //
CREATE PROCEDURE pa_listainmuebles()
BEGIN
SELECT * FROM inmuebles;
END//
DELIMITER ;
DELIMITER //
CREATE PROCEDURE pa_nuevoinmueble (
IN id INT,
IN idusuario INT,
IN idtipoinmueble INT,
IN precio DECIMAL,
IN comision DECIMAL)
BEGIN
INSERT INTO `inmuebles`( `id`,`idusuario`, `idtipoinmueble`, `precio`,
`comision`) VALUES (id,idusuario,idtipoinmueble,precio,comision);
END//
DELIMITER ;
CALL `pa_nuevoinmueble`('','12','15','10.00','0,05');
Podemos crear roles desde el campo Definidor donde podemos asignar un usuario definido en
el servidor Mysql, en este caso el usuario root del host localhost, para que pueda acceder a al
procedimiento almacenado.
Si queremos hacerlo desde código SQL, deberemos ejecutar los siguiente comandos:
DELIMITER //
CREATE DEFINER=`root`@`localhost`
PROCEDURE `pa_editarinmueble`(IN `precionuevo` DECIMAL(10,2), IN
`idinmueble` INT(11))
BEGIN
UPDATE inmuebles SET precio=precionuevo WHERE id=idinmueble;
END//
DELIMITER ;
Para ello deberemos tener una sencilla tabla donde almacenar que inmueble está alquilado,
para un ejemplo práctico no tomaremos mucha rigurosidad en los datos.
CREATE DEFINER=`root`@`localhost`
PROCEDURE `pa_nuevoalquiler`(IN `idinmueble` INT, IN `idinquilino` INT)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
CREATE DEFINER=`root`@`localhost`
TRIGGER `alquileres_after_insert` AFTER INSERT ON `alquileres`
FOR EACH ROW UPDATE inmuebles
SET activado='no' where id=NEW.idinmueble
CALL pa_nuevoalquiler(2,11);
A continuación, vamos a la tabla de inmuebles y deberemos ver que el campo activado cambio
de estado SI esta activo a NO esta activo.
Ejemplo de Procedimientos Almacenados con variables de
entrada y salida en MySQL, Por ejemplo las podemos usar
desde lenguajes externos como php
DELIMITER //
CREATE PROCEDURE `pa_tipoinmueble`(
IN `id` INT(11),
OUT `tipoinmueble` VARCHAR(20))
BEGIN
DECLARE `pvp` DECIMAL(10,2);
/* busco el precio del inmueble */
SELECT `precio` INTO `pvp` FROM `inmuebles` WHERE `idinmueble`=`ìd`;
/* condicional para escribir el tipo de inmueble */
IF `precio` < 1000 THEN
SET `tipoinmueble` = ‘Barato’;
ELSEIF (`precio` <= 5000 AND `precio` >= 1000) THEN
SET `tipoinmueble` = ‘Normal’;
ELSEIF (`precio` > 5000) THEN
SET `tipoinmueble` = ‘Caro’;
END IF;
END//
DELIMITER ;
<?
// Preparamos una consulta desde php
$resultado = $mysqli->query("CALL pa_tipoinmueble(2)");
$fila = $resultado->fetch_assoc();
echo 'Tipo de inmueble: '.$fila['tipoinmueble']; ?>