Stored Procedure Frage

Stored Procedure Frage

am 12.11.2007 18:37:49 von Stefan Braumeister

Hallo NG,

ich hab eine Frage bezüglich einer Stored Procedure, folgende Procedure:

CREATE DEFINER=`root`@`localhost` PROCEDURE `DELETE_USER`(IN id INT)
BEGIN


DECLARE done INT DEFAULT 0;
DECLARE usid INT;
DECLARE uscur CURSOR FOR SELECT us_id FROM usdb WHERE re_id = id;
OPEN uscur;
REPEAT
FETCH uscur INTO usid;
IF NOT done THEN
DELETE FROM userperms WHERE us_id = usid;
END IF;
UNTIL done END REPEAT;
CLOSE uscur;

DELETE FROM list WHERE us_id = id;

END


Mein Problem ist, wenn die Tabelle usdb leer ist dann gibt es nicht zu
löschen mit Delete. "Repeat" hat nichts zu tun und es sollte nur am
Schluss "DELETE FROM list WHERE us_id = id;" ausgeführt werden.

Rufe ich nun die Stored Procedure aus PHP auf, so bekomme ich den Fehler:

Error in CALL management.DELETE_USER(2): No data - zero rows fetched,
selected, or processed

Ist mir auch klar warum er meckert.
Gibts da jetzt ne Option in der Stored Procedure, damit er hier keinen
Fehler produziert und damit auch noch die Anweisungen danach ausführt(in
meinem Fall das Delete?


Grüße Stefan

[SOLVED]Re: Stored Procedure Frage

am 12.11.2007 22:31:28 von Stefan Braumeister

Stefan Braumeister schrieb:
> Hallo NG,
>
> ich hab eine Frage bezüglich einer Stored Procedure, folgende Procedure:
>
> CREATE DEFINER=`root`@`localhost` PROCEDURE `DELETE_USER`(IN id INT)
> BEGIN
>
>
> DECLARE done INT DEFAULT 0;
> DECLARE usid INT;
> DECLARE uscur CURSOR FOR SELECT us_id FROM usdb WHERE re_id = id;
> OPEN uscur;
> REPEAT
> FETCH uscur INTO usid;
> IF NOT done THEN
> DELETE FROM userperms WHERE us_id = usid;
> END IF;
> UNTIL done END REPEAT;
> CLOSE uscur;
>
> DELETE FROM list WHERE us_id = id;
>
> END
>
>
> Mein Problem ist, wenn die Tabelle usdb leer ist dann gibt es nicht zu
> löschen mit Delete. "Repeat" hat nichts zu tun und es sollte nur am
> Schluss "DELETE FROM list WHERE us_id = id;" ausgeführt werden.
>
> Rufe ich nun die Stored Procedure aus PHP auf, so bekomme ich den Fehler:
>
> Error in CALL management.DELETE_USER(2): No data - zero rows fetched,
> selected, or processed


Das Problem habe ich durch hinzufügen des Statements:

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

gelöst.
>
> Ist mir auch klar warum er meckert.
> Gibts da jetzt ne Option in der Stored Procedure, damit er hier keinen
> Fehler produziert und damit auch noch die Anweisungen danach ausführt(in
> meinem Fall das Delete?
>
>
> Grüße Stefan