2016-03-29 10 views
1

Ich habe eine gespeicherte Prozedur, die zwei Tabellen aktualisiert und fügt dann eine Zeile in eine dritte Tabelle ein. (Und nach meinem Verständnis, rollt die Updates oder einfügen, wenn alle drei nicht getan werden können) Immer, wenn ich diese Prozedur ausführen, unabhängig davon, ob es erfolgreich ausgeführt wird die beiden Updates und einfügen oder nicht, wird es immer "erfolgreich" und falsch zurückgeben. Ich brauche es, um einen Wert (wahrscheinlich wahr) zurückzugeben, wenn es alle zwei Aktualisierungen erfolgreich durchführt, und eins fügt ein und falsch, wenn es nicht tut, kann ich die korrekte Fehlerüberprüfung auf der Serverseite tun. HierWie kann ich feststellen, ob mysql gespeicherte Prozedur erfolgreich ausgeführt wurde

ist das Verfahren:

CREATE DEFINER=`db1`@`%` PROCEDURE `completed_procedure`(IN insubmissionid INT) 
BEGIN 

DECLARE ingregid INT; 
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK; 
DECLARE EXIT HANDLER FOR SQLWARNING ROLLBACK; 

START TRANSACTION; 

SET @ingregid = (SELECT idgreg FROM submission WHERE idsubmission = insubmissionid); 

UPDATE submission SET status='a' WHERE idsubmission = insubmissionid; 

UPDATE greg SET iscomplete=1 WHERE idgreg = @ingregid; 

INSERT INTO completion (idperson, idgreg, datecompleted, idsubmission, mediaid, description, 
    privatestatus, contenttype, totalamount) 
SELECT s.idperson, s.idgreg, s.datesubmitted, s.idsubmission, 
    COALESCE(s.youtubeid, s.contentid) AS mediaidid, g.description, g.privatestatus, 
    g.contenttype, COALESCE(SUM(amount),0) AS totalamount 
FROM submission s 
INNER JOIN greg g on s.idgreg = g.idgreg 
INNER JOIN contribution c on s.idgreg = c.idgreg 
WHERE s.idsubmission = insubmissionid AND c.ispaid = 1; 

COMMIT; 
END 

Was ist der beste Weg, um dies zu realisieren?

+0

Sie können 'SELECT ROW_COUNT()' nach einer Datenmodifikationsabfrage verwenden, um herauszufinden, ob Änderungen vorgenommen wurden. – Barmar

+0

@Barmar Können Sie mir bitte ein Beispiel zeigen, wie dies funktionieren würde, um Erfolg = 1 zurückzugeben, wenn alle Updates und Einfügen erfolgreich sind? – Mitchell

+0

Was meinst du damit false zurück? Prozeduren geben nichts zurück, nur Funktionen haben einen Rückgabewert. – Barmar

Antwort

0

Sie könnten einen Wert zurückgeben, ein Beispiel.

+1

Ich denke 'SELECT Erfolg;' ist richtig. Warum @ benutzen? – huhushow

+0

Ich war mir nicht sicher. Vielen Dank! –

+0

Indem ich eine OUT-Variable als Parameter deklariere, muss ich ein extra Argument für den OUT-Parameter übergeben. Gibt es eine Möglichkeit, nur eine Variable zurückzugeben, die ich beim Aufruf nicht angeben muss? – Mitchell

Verwandte Themen