Oracle数据库进阶篇
一、PL/SQL编程基础
1.1 PL/SQL块结构
DECLARE
-- 声明变量
v_student_name students.姓名%TYPE;
v_avg_score NUMBER;
v_subject_count NUMBER;
BEGIN
-- 获取学生平均分和科目数
SELECT 姓名, AVG(成绩), COUNT(*)
INTO v_student_name, v_avg_score, v_subject_count
FROM students
WHERE 学号 = 1;
-- 输出结果
DBMS_OUTPUT.PUT_LINE('学生: ' || v_student_name);
DBMS_OUTPUT.PUT_LINE('平均分: ' || v_avg_score);
DBMS_OUTPUT.PUT_LINE('科目数: ' || v_subject_count);
-- 条件判断
IF v_avg_score >= 120 THEN
DBMS_OUTPUT.PUT_LINE('成绩优秀');
ELSIF v_avg_score >= 90 THEN
DBMS_OUTPUT.PUT_LINE('成绩良好');
ELSE
DBMS_OUTPUT.PUT_LINE('需要努力');
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('未找到该学生');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('找到多个学生记录');
END;
/
1.2 存储过程
-- 创建更新学生成绩的存储过程
CREATE OR REPLACE PROCEDURE update_student_score(
p_student_id IN students.学号%TYPE,
p_subject IN students.学科%TYPE,
p_new_score IN students.成绩%TYPE
) AS
v_old_score students.成绩%TYPE;
v_student_exists NUMBER;
BEGIN
-- 检查学生是否存在
SELECT COUNT(*) INTO v_student_exists
FROM students
WHERE 学号 = p_student_id AND 学科 = p_subject;
IF v_student_exists = 0 THEN
DBMS_OUTPUT.PUT_LINE('错误: 未找到该学生的' || p_subject || '成绩记录');
RETURN;
END IF;
-- 获取旧成绩
SELECT 成绩 INTO v_old_score
FROM students
WHERE 学号 = p_student_id AND 学科 = p_subject;
-- 更新成绩
UPDATE students
SET 成绩 = p_new_score
WHERE 学号 = p_student_id AND 学科 = p_subject;
COMMIT;
DBMS_OUTPUT.PUT_LINE('成绩更新成功: ' || v_old_score || ' → ' || p_new_score);
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('更新失败: ' || SQLERRM);
END;
/
-- 调用存储过程
BEGIN
update_student_score(1, '语文', 115);
END;
/