2016-06-26 7 views
0

Итак, вот хранимая процедура, которую я написал. Когда я побежал DELETE и UPDATE в одной вкладке SQLMySQL Transaction возвращает ошибку

как:

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

это работает. Он выполняет delete и insert без проблем

Но если я позвоню хранимой процедуры, как:

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

возвращает 'error' строку я положил во ROLLBACK

Что может быть причиной провала сделки в пределах тела хранимой процедуры, когда он успешно работает, если выполняется без хранимой процедуры CALL?

Вот хранимая процедура.

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 

Кстати, я использую MySQL Workbench 6.3 и то, что я пытаюсь сделать, это удалить все столбцы, соответствующие curriculumId, прежде чем вставить снова.

На Java я буду повторять вызов хранимой процедуры для нескольких вставок.

Надеюсь, вы сможете помочь. Я просто не могу найти причину, по которой delete и insert не будут работать, если они будут помещены в транзакцию.

Спасибо.

+1

Было бы проще, если бы вы сделали правильную отладку и определили точное число ошибок в обработчике продолжения, отменив его. – Shadow

+1

Попробуйте удалить код обработки ошибок и запустите хранимую процедуру только с удалением/вставкой и посмотрите, какая ошибка возникает. –

ответ

0

Вы просто ошибку в вашем синтаксисе вставки, которые вы написали p_subjCode но ваш входной переменной p_subjectCode и меняю булеву переменную типа в TinyInt (1) для получения дополнительной поддержки версии.

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

Смежные вопросы