MySQL CREATE FUNCTION 语句似乎忽略了 WHERE 条件
MySQL CREATE FUNCTION statement seems to ignore WHERE condition
我正在编写我一生中的第一个 MySQL 存储函数,但我遇到了一些即使对我没有这方面经验的人来说也很愚蠢的事情。
这是我到现在为止写的:
CREATE FUNCTION `credits_per_course`(COURSE_ID INT, USER_ID INT)
RETURNS int(11)
BEGIN
DECLARE users_credits INT;
DECLARE course_credits INT;
DECLARE course_mandatory_credits INT;
DECLARE course_total_credits INT;
DECLARE lessons_count INT;
DECLARE lessons CURSOR FOR
SELECT * FROM t_lessons WHERE course_id = COURSE_ID;
SELECT COUNT(*) INTO lessons_count FROM t_lessons WHERE course_id = COURSE_ID;
RETURN lessons_count;
END
我用 SELECT credits_per_course(1019, 262)
来称呼它。 magic numbers是我知道课时数和测试用户的课程,在这个功能点上还是忽略了。
1019 课程有四节课。如果我 运行 这个函数,它会给我 2462 节课,这是所有课的总数。
为了测试,我尝试了:
- 在
SELECT COUNT(*)
查询之后添加一行 SET lessons_count = 42;
并且它 returns 42;
- 使用不存在的课程 ID(如 99999)更改 WHERE 子句,并且正确地 returns 0 节课;
- 更改 WHERE 子句明确传递 1019 课程 ID,但它仍然给我 2462 节课;
- 尝试 运行 在函数之外
SELECT COUNT(*)
查询课程 ID 为 1019 并且 returns 4 节课。
我知道我可能犯了一些愚蠢的错误,但我不知道是哪个...
正如 JohnHC 指出的那样,这是我对参数名称不区分大小写的无知的问题。
因此,一旦将参数名称更改为 CID
和 UID
之类的名称,它就可以正常工作。
谢谢!
我正在编写我一生中的第一个 MySQL 存储函数,但我遇到了一些即使对我没有这方面经验的人来说也很愚蠢的事情。
这是我到现在为止写的:
CREATE FUNCTION `credits_per_course`(COURSE_ID INT, USER_ID INT)
RETURNS int(11)
BEGIN
DECLARE users_credits INT;
DECLARE course_credits INT;
DECLARE course_mandatory_credits INT;
DECLARE course_total_credits INT;
DECLARE lessons_count INT;
DECLARE lessons CURSOR FOR
SELECT * FROM t_lessons WHERE course_id = COURSE_ID;
SELECT COUNT(*) INTO lessons_count FROM t_lessons WHERE course_id = COURSE_ID;
RETURN lessons_count;
END
我用 SELECT credits_per_course(1019, 262)
来称呼它。 magic numbers是我知道课时数和测试用户的课程,在这个功能点上还是忽略了。
1019 课程有四节课。如果我 运行 这个函数,它会给我 2462 节课,这是所有课的总数。
为了测试,我尝试了:
- 在
SELECT COUNT(*)
查询之后添加一行SET lessons_count = 42;
并且它 returns 42; - 使用不存在的课程 ID(如 99999)更改 WHERE 子句,并且正确地 returns 0 节课;
- 更改 WHERE 子句明确传递 1019 课程 ID,但它仍然给我 2462 节课;
- 尝试 运行 在函数之外
SELECT COUNT(*)
查询课程 ID 为 1019 并且 returns 4 节课。
我知道我可能犯了一些愚蠢的错误,但我不知道是哪个...
正如 JohnHC 指出的那样,这是我对参数名称不区分大小写的无知的问题。
因此,一旦将参数名称更改为 CID
和 UID
之类的名称,它就可以正常工作。
谢谢!