(6)利用存储过程返回给定课程号课程的平均成绩(要求使用输出参数)。
时间: 2023-06-15 11:05:28 浏览: 78
假设我们有一个名为`student_scores`的表,其中包含学生的成绩信息,包括学生id、课程id和分数。我们可以使用以下存储过程来返回给定课程号课程的平均成绩:
```mysql
DELIMITER $$
CREATE PROCEDURE get_course_avg_score(
IN course_id INT,
OUT avg_score FLOAT
)
BEGIN
SELECT AVG(score) INTO avg_score FROM student_scores WHERE course_id = course_id;
END $$
DELIMITER ;
```
在这个存储过程中,我们声明了一个输入参数`course_id`和一个输出参数`avg_score`。存储过程的主体部分使用`SELECT AVG(score) INTO avg_score`语句计算给定课程号课程的平均成绩,并将结果存储在`avg_score`变量中。最后,我们可以调用存储过程并传入课程号来获得平均成绩,如下所示:
```mysql
CALL get_course_avg_score(101, @avg_score);
SELECT @avg_score;
```
这将返回课程号为`101`的课程的平均成绩,并将结果存储在`@avg_score`变量中。注意,在调用存储过程之前,我们需要使用`@avg_score`变量声明它。
相关问题
在学生课程数据库中完成: 编写一个存储过程,修改给定学号、课程号的学生成绩。
好的,以下是一个可能的练习题,希望能够帮助你巩固Oracle存储过程的知识。
题目要求:
在一个学生课程数据库中,有一个名为SC(学生-课程)的表格,其中每条记录包含三个字段:学生ID、课程ID和成绩。现在需要你编写一个存储过程,用于修改给定学号、课程号的学生成绩。
要求实现的存储过程应该满足以下条件:
1. 存储过程的名称为update_score,其中学生ID、课程ID和新的成绩作为输入参数。
2. 存储过程应该能够找到SC表格中指定学生、指定课程的记录,并将其成绩更新为新的成绩。
3. 存储过程应该返回成功更新的记录数目。
参考答案:
下面是一个可能的参考答案,仅供参考。请注意,实际的存储过程实现可能会因为具体的数据库结构和要求而有所不同。
```
CREATE OR REPLACE PROCEDURE update_score(p_student_id IN NUMBER, p_course_id IN NUMBER, p_new_score IN NUMBER, p_updated_count OUT NUMBER) AS
BEGIN
UPDATE SC SET score = p_new_score WHERE student_id = p_student_id AND course_id = p_course_id;
p_updated_count := SQL%ROWCOUNT;
END;
```
在这个存储过程中,我们首先使用UPDATE语句更新SC表格中指定学生、指定课程的记录,并将其成绩更新为新的成绩。然后,我们使用SQL%ROWCOUNT内置变量来获取成功更新的记录数目,并将其赋值给输出参数p_updated_count。
你可以使用以下代码来调用这个存储过程,并查看返回结果:
```
DECLARE
updated_count NUMBER;
BEGIN
update_score(1, 1, 85, updated_count);
DBMS_OUTPUT.PUT_LINE('Updated ' || updated_count || ' records.');
END;
```
在这个例子中,我们将学生ID设为1,课程ID设为1,新的成绩设为85,然后调用存储过程update_score,并将返回的记录数存储在变量updated_count中。最后,我们使用DBMS_OUTPUT.PUT_LINE函数将结果输出到控制台。
编写存储过程,要求给定员工编号,输出员工姓名
在Oracle数据库中,你可以创建一个存储过程来接收员工编号作为输入,并返回相应的员工姓名。这里是一个基本的示例:
```sql
CREATE OR REPLACE PROCEDURE get_employee_name (p_employee_id IN NUMBER)
AS
BEGIN
SELECT employee_name
INTO v_employee_name
FROM employees
WHERE employee_id = p_employee_id;
IF SQL%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE('抱歉,找不到员工ID为 ' || p_employee_id || ' 的员工');
ELSE
DBMS_OUTPUT.PUT_LINE('员工名称:' || v_employee_name);
END IF;
END get_employee_name;
/
-- 调用存储过程
EXEC get_employee_name(123); -- 替换为实际需要查找的员工编号
```
这个存储过程名为`get_employee_name`,接受一个整数类型的参数`p_employee_id`。它首先从`employees`表中查找对应员工ID的姓名,如果找到就将其赋值给局部变量`v_employee_name`,然后打印出来;如果没有找到,则输出一条消息告知未找到该员工。
阅读全文