MySQL存储过程的麻烦

时间:2012-09-02 00:09:47

标签: mysql stored-procedures

基本上,我会在学生注册/放弃课程的任何时候运行此程序。 我正在尝试在课程中设置student_total =#的学生,然后使用(student_total + 1)更新相应的部分,我无法找到存储过程的良好文档。我的Declare student_total int;行收到错误。我做得不对吗?

DELIMITER $$

CREATE PROCEDURE `mydb`.`update_seats` (IN section_ID varchar(20))
BEGIN

SET @section_id=section_id;

DECLARE student_total int;
-- count the number of students in the course --

SET student_total = SELECT count(student_ID) from course
WHERE section_ID = @section_id;


Update Section SET students_enrolled = (student_total + 1) 
WHERE section_ID = @section_id;




END

2 个答案:

答案 0 :(得分:2)

问题

错误1

来自MySql documentation

  

DECLARE只允许在BEGIN ... END复合语句中使用,并且必须在任何其他语句之前的开头。

因此,您应该在DECLARE...语句之前移动SET @section_id...语句。

错误2

您正在尝试使用无效的snytax为变量选择值!您应该使用SELECT ... INTO而不是SET ... = SELECT ...(这是无效的语法)。

删除冗余

无需将参数(section_ID)分配给全局变量(@section_ID)。您只需更改参数名称即可避免名称与section.section_ID列发生冲突。

解决方案

DELIMITER ;;

CREATE PROCEDURE `update_seats` (IN p_section_ID VARCHAR(20))
BEGIN
    DECLARE student_total INT;

    SELECT  count(student_ID)
    INTO    student_total
    FROM    course
    WHERE   section_ID = p_section_ID;

    UPDATE  section
    SET     students_enrolled = (student_total + 1)
    WHERE   section_ID = p_section_ID;
END;;

DELIMITER ;

答案 1 :(得分:0)

您正在使用命令行工具,是吗?

了解您收到的错误消息会有所帮助但是基于您发布的代码我看不到您在BEGIN ... END块之后重置分隔符命令的位置。

取自http://dev.mysql.com/doc/refman/5.1/en/stored-programs-defining.html