Bei der Programmierung von gespeicherte Routinen für den MySQL vermisst man ein Äquivalent zum Oracle Package „dbms_output“. Wir haben uns mit folgender Lösung beholfen.
In einer zusätzlichen Datenbank „dbmc“ wird eine Tabelle „debug_output“ angelegt.
[code lang=“sql“]CREATE DATABASE dbmc;
DROP TABLE IF EXISTS `dbmc`.`debug_output`;
CREATE TABLE `dbmc`.`debug_output` (
`proc_id` varchar(100) default NULL,
`debug_output` text,
`line_id` int(11) NOT NULL auto_increment,
PRIMARY KEY (`line_id`)
);[/code]
Die drei Prozeduren „debug_on“, „debug_insert“ und „debug_show“ ermöglichen uns den Zugriff auf die Debugging-Informationen.
[code lang=“sql“]DELIMITER $$
DROP PROCEDURE IF EXISTS `dbmc`.`debug_on` $$
CREATE PROCEDURE `dbmc`.`debug_on`(in $proc_id varchar(100))
begin
declare $committer int default -1;
select count(proc_id) into $committer from dbmc.debug_output
where proc_id = $proc_id;
if $committer > 0 then
delete from dbmc.debug_output where proc_id = $proc_id;
end if;
insert into dbmc.debug_output (proc_id,debug_output)
values ($proc_id, concat(‚debug started: ‚, now()));
end $$
DROP PROCEDURE IF EXISTS `dbmc`.`debug_insert` $$
CREATE PROCEDURE `dbmc`.`debug_insert`(in $proc_id varchar(100),in $debug text)
begin
declare $committer int default -1;
select count(proc_id) into $committer from dbmc.debug_output
where proc_id = $proc_id;
if $committer > 0 then
insert into dbmc.debug_output (proc_id,debug_output)
values ($proc_id, $debug);
end if;
end $$
DROP PROCEDURE IF EXISTS `dbmc`.`debug_show` $$
CREATE PROCEDURE `dbmc`.`debug_show`(in $proc_id varchar(100))
begin
select debug_output from dbmc.debug_output where proc_id = $proc_id order by line_id;
end $$
DELIMITER ;[/code]
Bei der Anwendung schaltet man mit „dbmc.debug_on(‚ABC‘)“ die Protokollierung ein. Während der Ausführung erfasst man die Informtionen mit „dbmc.debug_insert(‚ABC‘, ‚hallo welt!‘)“. Bis zu einem Neustart der Anwendung kann man die erfassten Zeilen mit „dbmc.debug_show(‚ABC‘)“ abrufen.