Si no te interesa este enfoque y sólo necesitas ir haciendo un log de lo que ocurre propongo el siguiente sistema que he ido mejorando a partir de diversas fuentes y experiencias.
La idea se basa en la creación de una tabla temporal donde vamos realizando el log mediante una llamada al procedimiento doLog(msg).
Primero creamos una tabla de configuración:
CREATE TABLE `internal_config` (
`debug` tinyint(4) NOT NULL DEFAULT '1'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
insert into internal_config(debug) values(0);
Que nos servirá para activar/desactivar el debug con:
update internal_config set debug=true;
El procedimiento que crea la tabla temporal es:
CREATE PROCEDURE `setupTmpLog`()
BEGIN
CREATE TEMPORARY TABLE IF NOT EXISTS tmplog(
lin integer NOT NULL AUTO_INCREMENT primary key,
msg VARCHAR(512)
) ENGINE = MEMORY;
END
y el que escribe el log:
CREATE PROCEDURE `doLog`(IN logMsg VARCHAR(512))
BEGIN
declare do_debug bool default false;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET do_debug=false;
DECLARE CONTINUE HANDLER FOR 1146 -- Table not found
BEGIN
CALL setupTmpLog();
INSERT INTO tmplog(msg) VALUES ('resetup tmp table');
INSERT INTO tmplog(msg) VALUES (logMsg);
END;
select debug from internal_config limit 1 into do_debug;
-- escribimos en el log solo si debug esta activado
if (do_debug) then
INSERT INTO tmplog(msg) VALUES (logMsg);
end if;
END
y finalmente, un procedimiento que nos muestra el log (con el último mensaje primero) y después borra la tabla:
CREATE PROCEDURE `view_log`()
BEGIN
DECLARE CONTINUE HANDLER FOR 1146 -- Table not found
BEGIN
CALL setupTmpLog();
end;
select msg from tmplog order by lin desc;
drop table tmplog;
END
Ya lo tenemos todo, para ir logeando en nuestros procedimientos sólo tenemos que llamar a doLog así:
call doLog(concat("Hola", " que ", " tal " ));
Y cuando queramos ver (y limpiar) el log hacemos:
call view_log();
Espero que os sirva. Good Luck ;-)
Fuentes:
http://www.drdobbs.com/database/debugging-mysql-stored-procedures/218100564?pgno=1