miércoles, 3 de junio de 2009

User Functions en MySQL

Ejemplo de User Function en MySQL, con el uso de cursores.

DROP FUNCTION IF EXISTS importacion.set_tiponodo_adsl;


delimiter '/';
CREATE FUNCTION importacion.set_tiponodo_adsl() returns varchar(20)
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE val_edificio varchar(20);
DECLARE val_equipo varchar(20);
DECLARE cablepriaux VARCHAR(20);
DECLARE tiponodoaux VARCHAR(20);
DECLARE val_rangonodos VARCHAR(20);
DECLARE cur1 CURSOR FOR SELECT edificio, equipo FROM importacion.adslaux WHERE tiponodo = 'NO' OR tiponodo IS NULL;

OPEN cur1;
IF (Select FOUND_ROWS()>0) THEN
dependency_loop: LOOP
FETCH cur1 INTO val_edificio, val_equipo;
IF NOT done THEN
SET tiponodoaux = '';

SELECT tiponodo INTO val_rangonodos
FROM importacion.rangonodos
WHERE edificio = val_edificio
AND lim_inferior <>
AND lim_superior > cast(val_equipo as UNSIGNED );

IF val_rangonodos IS NULL THEN
SET tiponodoaux = 'NO';
ELSE
SET tiponodoaux = val_rangonodos;
END IF;

UPDATE importacion.adslaux
SET tiponodo = tiponodoaux
WHERE edificio = val_edificio
AND equipo = val_equipo;

ELSE
LEAVE dependency_loop;
END IF;
END LOOP dependency_loop;
END IF;
CLOSE cur1;

RETURN '';
END/
delimiter ';'/

Para invocarla simplemente hacer
SELECT importacion.set_tiponodo_adsl;

Stored Procedure en MySQL

Ejemplo de como crear un Stored Procedure en MySQL

DROP PROCEDURE IF EXISTS trafico.datos_calculo_circuitos_corresp;

delimiter '/';
CREATE PROCEDURE trafico.datos_calculo_circuitos_corresp(valor varchar(20))
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE val_corresponsal VARCHAR(6);
DECLARE val_minutos INT;

DECLARE cur1 CURSOR FOR SELECT b.corresponsal, sum(a.minutos) AS Minutos FROM trafico.rutas b INNER JOIN trafico.trafico a ON a.ruta = b.ruta WHERE substring(a.fecha,1,4) = valor AND b.habilitada = TRUE GROUP BY b.corresponsal;

DROP TABLE IF EXISTS tmp_set;
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_set (corresponsal varchar(6), minutos int);

OPEN cur1;
IF (Select FOUND_ROWS()>0) THEN
dependency_loop: LOOP
FETCH cur1 INTO val_corresponsal, val_minutos;
IF NOT done THEN
INSERT INTO tmp_set (corresponsal, minutos) values (val_corresponsal, val_minutos);
ELSE
LEAVE dependency_loop;
END IF;
END LOOP dependency_loop;
END IF;
CLOSE cur1;

SELECT * FROM tmp_set;
END/
delimiter ';'/

Para invocar al procedimiento hacer:
call
trafico.datos_calculo_circuitos_corresp('algo');


Nota: Para poder crear el stored procedure/función es necesario redefinir el delimitador de fin de linea que tiene por defecto MySQL para evitar que corte la definición por la mitad. Por eso se utiliza el comando delimeter y se termina el script asignando nuevamente el caracter de fin de linea abitual.

Mis fotos en TrekEarth