En esta ocasión, vamos a analizar el siguiente ejercicio hipotético para una biblioteca en donde se requiere mantener una tabla con las estadísticas de los libros, especificamente la cantidad de libros y su precio promedio por cada género. La base de datos se llama biblioteca y las tablas que contiene son Autores, Libros y Estadisticas. Las sentencias SQL para crear la base de datos son las siguientes:

CREATE DATABASE biblioteca;

USE biblioteca;

CREATE  TABLE IF NOT EXISTS Autores (
idAutores INT NULL ,
Nombre VARCHAR(50) NULL ,
Apellidos VARCHAR(50) NULL ,
PRIMARY KEY (idAutores) );

CREATE  TABLE IF NOT EXISTS Libros (
isbn VARCHAR(10) NULL ,
genero VARCHAR(20) NULL ,
titulo VARCHAR(100) NULL ,
paginas DECIMAL(10,0)  NULL ,
precio DECIMAL(10,0)  NULL ,
copyright DECIMAL(4)  NULL ,
autor1 INT NULL ,
autor2 INT NULL ,
autor3 INT NULL ,
PRIMARY KEY (isbn) );

CREATE  TABLE IF NOT EXISTS Estadisticas (
idEstadisticas INT NULL ,
Genero VARCHAR(20) NULL ,
total_libros DECIMAL(10,0)  NULL ,
precio_medio VARCHAR(45) NULL ,
PRIMARY KEY (idEstadisticas) );

Una alternativa de solución para mantener siempre actualizada la tabla Estadísticas es por medio de disparadores o triggers, los cuales se deben ejecutar DESPUES que se  INSERTEN, BORREN o ACTUALICEN registros en la tabla libros. En seguida escribo el código SQL del Trigger que se ejecuta después de la operación de insertar que se llama ActualizarEstadisticas_insert.

DELIMITER //

CREATE TRIGGER ActualizarEstadisticas_insert AFTER INSERT ON Libros FOR EACH ROW
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE v_genero VARCHAR(20);
DECLARE v_total DECIMAL;
DECLARE v_precio VARCHAR(45);
DECLARE v_id INT DEFAULT 0;
DECLARE  c_Estadisticas cursor for
SELECT genero, COUNT(genero) AS total_libros, AVG(precio) AS precio_medio
FROM Libros
GROUP BY genero;
DECLARE CONTINUE HANDLER FOR SQLSTATE ‘02000’ SET done = 1;

DELETE FROM Estadisticas;

OPEN c_Estadisticas;
REPEAT
SET v_id = v_id + 1;
FETCH c_Estadisticas INTO v_genero, v_total, v_precio;
IF NOT done THEN
INSERT INTO Estadisticas (idEstadisticas, Genero, total_libros, precio_medio)
VALUES (v_id, v_genero, v_total, v_precio);
END IF;
UNTIL done END REPEAT;
END

En este código podemos observar el uso de variables locales, las cuales se declaran después de la sentencia DECLARE (done, v_genero, v_total, v_precio, v_id). Existe también una variable especial que se llama CURSOR. En SQL existen un tipo de control que es útil para recorrer los registros que devuelve una consulta SELECT y se denominan CURSORES. Se utiliza, también, estructuras de control condicionales (IF) y estructuras de control de iteración (REPEAT UNTIL). La sentencia FECHT obtiene del cursor, previamente abierto (OPEN), los valores para cada variable que contiene en el registro actual y mueve el puntero al siguiente registro. Lo más facil, insertar los datos ya minipulados en la tabla Estadisticas.

@tavoberry

Powered By DT Author Box

Written by Mtro. Gustavo Reyes Hernández

Maestro en Gestión de Tecnologías de la Información
Investigador sobre el uso de las TIC’s en la educación

Trigger que maneja un cursor
Tagged on:             

4 thoughts on “Trigger que maneja un cursor

Leave a Reply

Follow

Get every new post delivered to your Inbox

Join other followers:

%d bloggers like this: