Oracle PL/SQL 编程基础详解(从块结构到游标操作)

关键词:Oracle PL/SQL、PL/SQL 块结构、变量控制结构、显式游标、隐式游标


✅ 摘要

在 Oracle 数据库开发中,PL/SQL(Procedural Language/SQL) 是一种强大的程序化 SQL 扩展语言,它允许开发者编写复杂的业务逻辑和数据库操作脚本。掌握 PL/SQL 是进行 Oracle 存储过程、函数、触发器等高级开发的基础。

本文将围绕 PL/SQL 编程基础内容 展开讲解:

  • PL/SQL 块结构(DECLARE、BEGIN、EXCEPTION)
  • 变量与控制结构(IF、LOOP、FOR、WHILE)
  • 游标操作(显式游标、隐式游标、带参数的游标)

每部分都配有 完整的 PL/SQL 示例代码,适合初学者入门学习,也适合中级开发者巩固提升。


一、PL/SQL 块结构

🔹 1. PL/SQL 块的基本组成

一个 PL/SQL 程序由三个基本部分构成:

部分 描述
DECLARE 可选,用于声明变量、常量、类型等
BEGIN 必须,包含执行语句
EXCEPTION 可选,处理运行时异常
示例:最简单的匿名块
sql 复制代码
BEGIN
    DBMS_OUTPUT.PUT_LINE('Hello, PL/SQL!');
END;

🔹 2. 使用 DECLARE 声明变量并赋值

sql 复制代码
DECLARE
    v_name VARCHAR2(50) := '张三';
    v_age  NUMBER := 25;
BEGIN
    DBMS_OUTPUT.PUT_LINE('姓名:' || v_name || ',年龄:' || v_age);
END;

🔹 3. 异常处理(EXCEPTION)

sql 复制代码
DECLARE
    v_num NUMBER := 10 / 0; -- 故意除以零
BEGIN
    DBMS_OUTPUT.PUT_LINE(v_num);
EXCEPTION
    WHEN ZERO_DIVIDE THEN
        DBMS_OUTPUT.PUT_LINE('不能除以零!');
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('发生未知错误');
END;

二、变量与控制结构

🔹 1. 变量与复合数据类型

示例:使用记录类型(RECORD)
sql 复制代码
DECLARE
    TYPE emp_record IS RECORD (
        emp_id   employees.employee_id%TYPE,
        emp_name employees.first_name%TYPE
    );
    v_emp emp_record;
BEGIN
    SELECT employee_id, first_name INTO v_emp FROM employees WHERE employee_id = 100;
    DBMS_OUTPUT.PUT_LINE('员工ID:' || v_emp.emp_id || ',姓名:' || v_emp.emp_name);
END;

🔹 2. 条件判断语句(IF - THEN - ELSE)

sql 复制代码
DECLARE
    v_score NUMBER := 85;
BEGIN
    IF v_score >= 90 THEN
        DBMS_OUTPUT.PUT_LINE('优秀');
    ELSIF v_score >= 70 THEN
        DBMS_OUTPUT.PUT_LINE('良好');
    ELSE
        DBMS_OUTPUT.PUT_LINE('不及格');
    END IF;
END;

🔹 3. 循环结构

(1) LOOP 循环(需手动退出)
sql 复制代码
DECLARE
    i NUMBER := 1;
BEGIN
    LOOP
        DBMS_OUTPUT.PUT_LINE(i);
        i := i + 1;
        EXIT WHEN i > 5;
    END LOOP;
END;
(2) FOR 循环(自动计数)
sql 复制代码
BEGIN
    FOR i IN 1..5 LOOP
        DBMS_OUTPUT.PUT_LINE(i);
    END LOOP;
END;
(3) WHILE 循环(满足条件才执行)
sql 复制代码
DECLARE
    i NUMBER := 1;
BEGIN
    WHILE i <= 5 LOOP
        DBMS_OUTPUT.PUT_LINE(i);
        i := i + 1;
    END LOOP;
END;

三、游标(Cursor)操作

🔹 1. 显式游标与隐式游标

类型 特点
显式游标 开发者手动定义并控制打开、读取、关闭
隐式游标 Oracle 自动管理,适用于单行查询或 DML 操作

🔹 2. 显式游标基本用法

示例:遍历部门表中的所有记录
sql 复制代码
DECLARE
    CURSOR c_dept IS
        SELECT department_id, department_name FROM departments;
    v_dept departments%ROWTYPE;
BEGIN
    OPEN c_dept;
    LOOP
        FETCH c_dept INTO v_dept.department_id, v_dept.department_name;
        EXIT WHEN c_dept%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE('部门ID:' || v_dept.department_id || ',名称:' || v_dept.department_name);
    END LOOP;
    CLOSE c_dept;
END;

🔹 3. 游标属性说明

属性 含义
%FOUND 最后一次 FETCH 是否成功
%NOTFOUND 最后一次 FETCH 是否失败
%ISOPEN 游标是否已打开
%ROWCOUNT 已获取的记录数

🔹 4. 使用 FOR 循环简化游标操作

sql 复制代码
DECLARE
    CURSOR c_emp IS
        SELECT employee_id, first_name FROM employees WHERE department_id = 60;
BEGIN
    FOR r_emp IN c_emp LOOP
        DBMS_OUTPUT.PUT_LINE('员工ID:' || r_emp.employee_id || ',姓名:' || r_emp.first_name);
    END LOOP;
END;

🔹 5. 带参数的游标

sql 复制代码
DECLARE
    CURSOR c_emp(dept_id NUMBER) IS
        SELECT employee_id, first_name FROM employees WHERE department_id = dept_id;
BEGIN
    FOR r_emp IN c_emp(60) LOOP
        DBMS_OUTPUT.PUT_LINE('员工ID:' || r_emp.employee_id || ',姓名:' || r_emp.first_name);
    END LOOP;
END;

✅ 总结

通过本文的学习,你应该已经掌握了以下内容:

模块 技能点
PL/SQL 块结构 DECLARE、BEGIN、EXCEPTION 的使用
变量与控制结构 基本变量、记录类型、IF 判断、各种循环
游标操作 显式游标、隐式游标、游标属性、带参游标
实战能力 能够独立编写小型 PL/SQL 程序处理数据逻辑

这些技能是你进一步学习 Oracle 存储过程、函数、触发器等高级特性的坚实基础。建议你将文中示例复制到本地环境中运行练习,加深理解。


📚 参考资料

相关推荐
哈__12 分钟前
MongoDB 平替新方案:金仓多模数据库驱动电子证照国产化落地
数据库·1024程序员节
微学AI1 小时前
国产数据库替代MongoDB的技术实践过程:金仓多模数据库在电子证照系统中的深度应用
数据库·人工智能·1024程序员节
TDengine (老段)1 小时前
TDengine 数据函数 ROUND 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·1024程序员节
TDengine (老段)1 小时前
TDengine 数学函数 RAND 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
野犬寒鸦1 小时前
从零起步学习MySQL || 第十章:深入了解B+树及B+树的性能优势(结合底层数据结构与数据库设计深度解析)
java·数据库·后端·mysql·1024程序员节
GZ_TOGOGO1 小时前
Oracle OCP考试报名常见问题详解
数据库·oracle·ocp认证
睡不醒的猪儿1 小时前
nginx日志同步阿里云datahub后写入数据库
数据库·nginx·阿里云
xie_zhr2 小时前
【PB案例学习笔记】-46在数据窗口中编辑数据
数据库·his·1024程序员节·干货分享·pb·powerbuilder
小小的木头人2 小时前
Redis 集群安装指南
数据库·redis
星空的资源小屋2 小时前
Antares SQL,一款跨平台开源 SQL 客户端
数据库·人工智能·pdf·开源·电脑·excel·1024程序员节