0

基本上,每当学生注册/放弃课程时,我都会运行此程序。我正在尝试在课程中设置 student_total = # of students,然后用 (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
4

2 回答 2

2

问题

错误 1

MySql 文档

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

所以,你应该在DECLARE...语句之前移动SET @section_id...语句。

错误 2

您正在尝试使用无效的语法将值选择到变量中!您应该使用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 ;
于 2012-09-02T00:41:35.290 回答
0

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

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

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

于 2012-09-02T00:37:53.370 回答