Ejemplo de usar funciones almacenadas y cursores usando MySQL.


En este ejemplo se desea correr una vista que actualize un juego de datos.

Creamos la tabla nota que contiene las notas de ciertos estudiantes de una clase de Bases de datos.
CREATE TABLE `nota` (
          `id` int(11) NOT NULL auto_increment,
          `nota1` int(11) default NULL,
          `nota2` int(11) default NULL,
          `nota3` int(11) default NULL,
          `final` int(11) default NULL,
          `definitiva` int(11) default NULL,
        )
Seguidamente creamos la funcion que actualiza para cada registro la nota final como la sumatoria de las notas 1,2,3
DELIMITER $$
 
DROP FUNCTION IF EXISTS F03$$
 
CREATE FUNCTION F03( arg_id INT )
    RETURNS VARCHAR(500)
    BEGIN
 
  DECLARE done BOOL DEFAULT FALSE;
  DECLARE a INT;
  DECLARE b INT;
  DECLARE c INT;
  DECLARE d INT;
  DECLARE rowid INT;
  DECLARE total INT;
  DECLARE cur1 CURSOR FOR SELECT id , nota1 , nota2 , nota3 from nota where id=arg_id;
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = TRUE;
 
  set total = 0;
 
   OPEN cur1; myLoop: LOOP
 
   FETCH cur1 INTO rowid , a, b, c;
     set d = a + b + c;
     update nota set final=d where id=rowid;
 
 
     IF done THEN
      CLOSE cur1;
      LEAVE myLoop;
     END IF;
 
    set total = total + 1;
   END LOOP;
 
    IF TOTAL=1 THEN
     RETURN concat(' Se actualizaron ' , total , ' registros, ID= ', arg_id , ' , NotaFinal= ',d);
    ELSE
     RETURN concat(' No Se actualizaron registros');
    END IF;
 
 
    END$$
 
DELIMITER ;
Así mismo ejecutamos y voila! ha corrido nuestro primer ejemplo de fnciones con cursores.
select F03(1)
Para finalizar usamos un disparador que efectua la tarea automaticamente.
DELIMITER $$
 
DROP TRIGGER /*!50114 IF EXISTS */ updateNotas$$
 
CREATE TRIGGER updateNotas BEFORE UPDATE on nota
FOR EACH ROW BEGIN
  set new.definitiva = new.nota1 + new.nota2 + new.nota3;
END$$
 
DELIMITER ;
Por tener en cuenta:
select id , F03(id) from nota where id=25
Lanzará un error, pues mientas se tome la tabla para consulta no se podrán alterar registros de ella misma.

Fabio Andrés Palmieri Villa
Cuando trabajaba en la ETB / Soporte posfacturación