Oracle进阶篇 - 我的Oracle学习笔记:实践、优化与深思

oracle进阶篇

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;
/

Pages: 1 2 3 4 5 6 7 8 9 10 11

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注