题目:
创建一个名为select_zl的存储过程,根据输入的学号查询此生的姓名,所选课程名,成绩。调用此过程。(调用时用自己的学号)。
皮皮用的是MySQL8.0,运行环境是MySQL Workbench。
首先尝试运行了下面这段代码:
Delimiter $$
CREATE PROCEDURE select_zl(
IN xsno VARCHAR(20),
OUT ysno VARCHAR(20),
OUT xsname VARCHAR(20),
OUT xcname VARCHAR(20),
OUT xgrade INT
)
BEGIN
SELECT student.sno,sname,cname,grade
INTO ysno,xsname,xcname,xgrade
FROM student
INNER JOIN sc ON student.sno = sc.sno
INNER JOIN course ON course.cno = sc.cno
WHERE student.sno=xsno;
END; $$
CALL select_zl('200518',@x41,@x42,@x43,@x44);
SELECT @x41 学号,@x42 姓名,@x43 课程名,@x44 成绩;
但是报错:Error Code: 1172. Result consisted of more than one row
查询报错原因,得到的解释是有多个输出值。
于是皮皮尝试实现存储过程遍历输出,并未成功。
随后皮皮看了一下老师发的PPT,
比较之后,发现存储过程是可以直接SELECT出结果的,
所以只要删除OUT语句和INTO语句就可以了,正确运行的代码如下:
DROP PROCEDURE IF EXISTS select_zl;
Delimiter $$
CREATE PROCEDURE select_zl(IN xsno VARCHAR(20))
BEGIN
SELECT student.sno 学号,sname 姓名,cname 课程名,grade 成绩
FROM student
INNER JOIN sc ON student.sno = sc.sno
INNER JOIN course ON course.cno = sc.cno
WHERE student.sno=xsno;
END; $$
CALL select_zl('200518');
运行结果: