2016-06-26 4 views
0

これは私が書いたストアドプロシージャです。私のように単一のSQLタブMySQL Transaction returns error

DELETEUPDATEを実行したとき:

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

それが動作します。これは、任意の問題

なしdeleteinsertを実行しかし、私のように、ストアドプロシージャを呼び出す場合:

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

それはトランザクションの失敗の原因となることができるか、私はROLLBACK

中に入れ'error'文字列を返します。ストアドプロシージャ本体なしで実行した場合に正常に実行されたときのストアドプロシージャ本文内CALL

ここにストアドプロシージャがあります。私はMySQLのワークベンチ6.3と私は何をしようとしているを使用していますところで

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 

は、私は再び挿入する前にcurriculumIdに一致するすべての列を削除することです。

Javaでは、ストアドプロシージャを複数回挿入するための呼び出しを繰り返します。

お手伝いができたら幸いです。トランザクション内に入ればdeleteinsertが動作しない理由が見つかりません。

ありがとうございました。

+1

適切なデバッグを行って、それを再開することによって、継続ハンドラ内の正確なエラー番号を判断する方が簡単です。 – Shadow

+1

エラー処理コードを削除して、削除/挿入のみでストアドプロシージャを実行し、エラーが発生していないか確認してください。 –

答えて

0

はあなたがp_subjCodeを書かれているあなたの挿入構文でちょうど間違いを持っ​​ていますが、あなたの入力変数は、p_subjectCodeであると私はより多くのバージョンのサポートのために(1)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

ご協力ありがとうございます。私はそれに気付かなかった。あなたは正しい、私の悪いです。それは単にタイプミスです。私はこれに尋ねてはならない。しかし、ありがとう。 – p3ace

+0

@ p3ace幸運な男:) – HosSeinM