2016-06-26 2 views
0

Also hier ist die gespeicherte Prozedur, die ich geschrieben habe. Als ich die DELETE und UPDATE in einem einzigen SQL-Registerkarte liefMySQL-Transaktion gibt Fehler

wie:

DELETE FROM curriculumsubjects WHERE curriculumId = 27; 
INSERT INTO curriculumsubjects(curriculumId,subjectCode) 
VALUES(27,'MATH101'); 

funktioniert es. Er führt delete und insert ohne Probleme

Aber wenn ich die gespeicherte Prozedur wie nennen:

CALL `enrollmentdb`.`updateCurriculumSubjects`(27, 'MATH101'); 

es gibt die 'error' String i während ROLLBACK setzen

Was das Scheitern der Transaktion verursachen könnte innerhalb der gespeicherten Prozedur body, wenn es erfolgreich ausgeführt wird, wenn ohne gespeicherte Prozedur ausgeführt CALL?

Hier ist die gespeicherte Prozedur.

CREATE DEFINER=`root`@`localhost` PROCEDURE `updateCurriculumSubjects`(IN p_curriculumId int, IN p_subjectCode varchar(100)) 
BEGIN 
    DECLARE hasError BOOLEAN DEFAULT 0; 
    DECLARE CONTINUE HANDLER FOR sqlexception SET hasError = 1; 

    START TRANSACTION; 
     DELETE FROM curriculumsubjects WHERE curriculumId = p_curriculumId; 
     INSERT INTO curriculumsubjects(curriculumId,subjectCode) 
           VALUES(p_curriculumId,p_subjCode); 
    IF hasError THEN 
     ROLLBACK; 
     SELECT 'error'; 
    ELSE 
     COMMIT; 

    END IF; 
END 

Durch die Art, wie ich bin mit MySQL Workbench 6.3 und was ich versuche zu tun, um alle Spalten löschen Sie die curriculumId passende, bevor ich wieder ein.

In Java werde ich den Aufruf der gespeicherten Prozedur für mehrere Einfügungen wiederholen.

Ich hoffe, Sie können helfen. Ich kann einfach keinen Grund finden, warum delete und insert nicht funktionieren, wenn sie in eine Transaktion eingefügt werden.

Danke.

+1

Es wäre einfacher, wenn Sie eine ordnungsgemäße Fehlersuche durchgeführt und die genaue Fehlernummer im Continue-Handler ermittelt haben, indem Sie es residieren. – Shadow

+1

Versuchen Sie, den Fehlerbehandlungscode zu entfernen, und führen Sie die gespeicherte Prozedur nur mit delete/insert aus, und sehen Sie, welcher Fehler auftaucht. –

Antwort

0

Sie haben nur einen Fehler in Ihrem Einsatz Syntax, die Sie p_subjCode geschrieben haben aber Ihre Eingangsgröße ist p_subjectCode und ich Boolesche Variable vom Typ ändern (1) für mehr Version Unterstützung tinyint.

CREATE DEFINER=`root`@`localhost` PROCEDURE `updateCurriculumSubjects`(IN p_curriculumId int, IN p_subjectCode varchar(100)) 
BEGIN 
DECLARE hasError TINYINT(1) DEFAULT 0; 
DECLARE CONTINUE HANDLER FOR sqlexception SET hasError = 1; 
START TRANSACTION; 
    DELETE FROM curriculumsubjects WHERE curriculumId = p_curriculumId; 
    INSERT INTO curriculumsubjects(curriculumId,subjectCode) 
          VALUES(p_curriculumId,p_subjectCode); 

IF hasError=1 THEN 
    ROLLBACK; 
    SELECT 'error'; 
ELSE 
    COMMIT; 

END IF; 
END 
+0

Danke für Ihre Hilfe. Das habe ich nicht bemerkt. Du hast Recht, mein Böses. Es ist nur ein Tippfehler. Ich hätte das nicht fragen sollen. Aber danke. – p3ace

+0

@ p3ace Viel Glück Mann :) – HosSeinM