所以这里是我写的存储过程。当我在单个sql选项卡中运行int sdk = android.os.Build.VERSION.SDK_INT;
if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
setBackgroundDrawable();
} else {
setBackground();
}
和DELETE
为:
UPDATE
它有效。它执行DELETE FROM curriculumsubjects WHERE curriculumId = 27;
INSERT INTO curriculumsubjects(curriculumId,subjectCode)
VALUES(27,'MATH101');
和delete
没有任何问题
但是如果我将存储过程称为:
insert
它会返回我在CALL `enrollmentdb`.`updateCurriculumSubjects`(27, 'MATH101');
'error'
字符串
如果在没有存储过程ROLLBACK
的情况下运行成功运行,可能导致存储过程体内的事务失败?
这是存储过程。
CALL
顺便说一下,我使用的是Mysql Workbench 6.3,我尝试做的是删除所有匹配CurriculumId的列,然后再插入。
在Java上,我将迭代调用存储过程以进行多次插入。
我希望你能提供帮助。我无法找到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
和delete
如果放入交易中而无法工作的原因。
感谢。
答案 0 :(得分: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