0% encontró este documento útil (0 votos)
181 vistas

Procedimientos Almacenados en MySQL

Este documento describe el uso de procedimientos almacenados y disparadores en MySQL. Los procedimientos almacenados son programas SQL que se almacenan en la base de datos para realizar operaciones como insertar o modificar registros. Los disparadores se ejecutan automáticamente ante eventos como inserciones, actualizaciones o eliminaciones en una tabla y permiten realizar acciones adicionales. Se proveen ejemplos de cómo crear procedimientos almacenados, disparadores e invocarlos.

Cargado por

Niños Arcoiris
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
181 vistas

Procedimientos Almacenados en MySQL

Este documento describe el uso de procedimientos almacenados y disparadores en MySQL. Los procedimientos almacenados son programas SQL que se almacenan en la base de datos para realizar operaciones como insertar o modificar registros. Los disparadores se ejecutan automáticamente ante eventos como inserciones, actualizaciones o eliminaciones en una tabla y permiten realizar acciones adicionales. Se proveen ejemplos de cómo crear procedimientos almacenados, disparadores e invocarlos.

Cargado por

Niños Arcoiris
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 6

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.

Para ejecutar un procedimiento almacenando usamos el comando CALL

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.

Estos eventos son:

• INSERT: Inserción de datos.


• UPDATE: Actualización de datos.
• DELETE: Eliminación de datos.

Con DROP TRIGGER eliminamos el disparador.

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:

• DEFINER: Especifica el usuario de BBDD con privilegios para desencadenar un


TRIGGER. Por defecto es el usuario que crear el TRIGGER.
• trigger_name: Nombre del TRIGGER/disparador.
• trigger_time: Especifica cuando se ha de ejecutar el TRIGGER, antes o después del
evento detectado.
• trigger_event: Evento que activa el TRIGGER –> INSERT, UPDATE y DELETE.
• tbl_name: Nombre de la tabla en la que detectaremos el trigger_event.
• trigger_order: Una tabla puede tener asociados varios TRIGGER, por defecto la
ejecución de cada uno es el orden en el que fueron creados. Para alterar ese orden
podemos definirlos con FOLLOWS (después de nombre_trigger) y con PRECEDE
(antes de nombre_trigger).
• trigger_body: Código del TRIGGER.
Ejemplo de Procedimientos Almacenados y
Disparadores en MySQL
-- Estructura de tabla para la tabla `inmuebles`

CREATE TABLE IF NOT EXISTS `inmuebles` (


`id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
`idusuario` int(11) DEFAULT NULL,
`idtipoinmueble` int(6) DEFAULT '0',
`precio` decimal(10,2) DEFAULT '0.00',
`comision` decimal(10,0) NOT NULL,
`descripcion` text,
`fechaAlta` date DEFAULT '0000-00-00',
`idprovincia` int(10) DEFAULT NULL,
`idlocalidad` int(10) DEFAULT NULL,
`direccion` varchar(150) DEFAULT NULL,
`pisoydepto` varchar(100) DEFAULT NULL,
`entre_calles` text,
`idoperacion` int(100) DEFAULT NULL,
`destacado` char(3) DEFAULT 'no',
`imagen1` varchar(255) DEFAULT NULL,
`imagen2` varchar(255) DEFAULT NULL,
`imagen3` varchar(255) DEFAULT NULL,
`imagen4` varchar(255) DEFAULT NULL,
`antiguedad` varchar(100) DEFAULT NULL,
`mt2cubiertos` int(11) DEFAULT NULL,
`superficie_lote` int(11) DEFAULT NULL,
`activado` enum('si','no') NOT NULL DEFAULT 'si'

) ENGINE=InnoDB DEFAULT CHARSET=UTF8;

Creamos un procedimiento almacenado para consultar la tabla inmuebles:

DELIMITER //
CREATE PROCEDURE pa_listainmuebles()
BEGIN
SELECT * FROM inmuebles;
END//
DELIMITER ;

A continuación crearemos un procedimiento almacenado para insertar un inmueble, para esto


necesitaremos parámetros tipo IN es decir que al procedimiento almacenado le asignaremos
datos y variables de entrada para hacer alguna transacción, en este caso guardarlos en la base
de datos.

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 ;

Luego podemos ejecutar el procedimiento almacenado invocando y asignado los parámetros.

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 ;

Crearemos a continuación la tabla de auditoria de inmuebles:

CREATE TABLE `auditoria` (


`usuario` VARCHAR(200) NULL DEFAULT NULL,
`descripcion` TEXT NULL,
`fecha` DATETIME NULL DEFAULT NULL
)

Crearemos un disparador que guarde en auditoria un mensaje si alguien cambia el precio de


un inmueble.

CREATE DEFINER=`root`@`localhost` TRIGGER `inmuebles_after_update` AFTER


UPDATE ON `inmuebles` FOR EACH ROW INSERT INTO auditoria
(usuario, descripcion,fecha)
VALUES (user( ),
CONCAT('Se modifico el precio del inmueble ',NEW.id,' (',
OLD.precio,') por (', NEW.precio,')'),NOW())

Este disparador se ejecuta automáticamente luego de producirse una actualización de precio,


podemos incluir mas campos si lo deseamos, con OLD especificamos el campo con el valor
antes de la modificación y con NEW especificamos el nuevo valor ingresado, con NOW()
especificamos la fecha y hora actual.

CALL `pa_editarinmueble`('80000', '2');


A continuación, veremos otra posible aplicación si un inmueble se alquila entonces que
cambie automáticamente de estado a no activa o la pondremos como no disponible.

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 TABLE `alquileres` (


`id` INT(10) NOT NULL,
`idinmueble` INT(10) NOT NULL,
`idinquilino` INT(11) NOT NULL,
PRIMARY KEY (`id`)
)

A continuación, crearemos el procedimiento almacenado para insertar un nuevo registro en la


tabla alquileres.

CREATE DEFINER=`root`@`localhost`
PROCEDURE `pa_nuevoalquiler`(IN `idinmueble` INT, IN `idinquilino` INT)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''

INSERT INTO `alquileres`(`idinmueble`, `idinquilino`) VALUES


(idinmueble,idinquilino)

Y luego el trigger para modificar inmuebles activado:

CREATE DEFINER=`root`@`localhost`
TRIGGER `alquileres_after_insert` AFTER INSERT ON `alquileres`
FOR EACH ROW UPDATE inmuebles
SET activado='no' where id=NEW.idinmueble

Luego invocamos el procedimiento almacenado donde asignamos el id del inmueble y el id


del cliente o inquilino que alquilo. (Por ejemplo el cliente con id 11 alquila el inmueble con
id 2)

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 ;

lo llamamos, suponemos un idinmueble=2

CALL pa_tipoinmueble (2);

Selecciona el precio del inmueble y lo almacena en la variable pvp, luego la estructura if


asignara el tipo de inmueble a la variable tipoinmueble y nos devolverá el valor.

<?
// Preparamos una consulta desde php
$resultado = $mysqli->query("CALL pa_tipoinmueble(2)");
$fila = $resultado->fetch_assoc();
echo 'Tipo de inmueble: '.$fila['tipoinmueble']; ?>

También podría gustarte