当前位置: 首页 > news >正文

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可选,处理运行时异常
示例:最简单的匿名块
BEGINDBMS_OUTPUT.PUT_LINE('Hello, PL/SQL!');
END;

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

DECLAREv_name VARCHAR2(50) := '张三';v_age  NUMBER := 25;
BEGINDBMS_OUTPUT.PUT_LINE('姓名:' || v_name || ',年龄:' || v_age);
END;

🔹 3. 异常处理(EXCEPTION)

DECLAREv_num NUMBER := 10 / 0; -- 故意除以零
BEGINDBMS_OUTPUT.PUT_LINE(v_num);
EXCEPTIONWHEN ZERO_DIVIDE THENDBMS_OUTPUT.PUT_LINE('不能除以零!');WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('发生未知错误');
END;

二、变量与控制结构

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

示例:使用记录类型(RECORD)
DECLARETYPE emp_record IS RECORD (emp_id   employees.employee_id%TYPE,emp_name employees.first_name%TYPE);v_emp emp_record;
BEGINSELECT 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)

DECLAREv_score NUMBER := 85;
BEGINIF v_score >= 90 THENDBMS_OUTPUT.PUT_LINE('优秀');ELSIF v_score >= 70 THENDBMS_OUTPUT.PUT_LINE('良好');ELSEDBMS_OUTPUT.PUT_LINE('不及格');END IF;
END;

🔹 3. 循环结构

(1) LOOP 循环(需手动退出)
DECLAREi NUMBER := 1;
BEGINLOOPDBMS_OUTPUT.PUT_LINE(i);i := i + 1;EXIT WHEN i > 5;END LOOP;
END;
(2) FOR 循环(自动计数)
BEGINFOR i IN 1..5 LOOPDBMS_OUTPUT.PUT_LINE(i);END LOOP;
END;
(3) WHILE 循环(满足条件才执行)
DECLAREi NUMBER := 1;
BEGINWHILE i <= 5 LOOPDBMS_OUTPUT.PUT_LINE(i);i := i + 1;END LOOP;
END;

三、游标(Cursor)操作

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

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

🔹 2. 显式游标基本用法

示例:遍历部门表中的所有记录
DECLARECURSOR c_dept ISSELECT department_id, department_name FROM departments;v_dept departments%ROWTYPE;
BEGINOPEN c_dept;LOOPFETCH 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 循环简化游标操作

DECLARECURSOR c_emp ISSELECT employee_id, first_name FROM employees WHERE department_id = 60;
BEGINFOR r_emp IN c_emp LOOPDBMS_OUTPUT.PUT_LINE('员工ID:' || r_emp.employee_id || ',姓名:' || r_emp.first_name);END LOOP;
END;

🔹 5. 带参数的游标

DECLARECURSOR c_emp(dept_id NUMBER) ISSELECT employee_id, first_name FROM employees WHERE department_id = dept_id;
BEGINFOR r_emp IN c_emp(60) LOOPDBMS_OUTPUT.PUT_LINE('员工ID:' || r_emp.employee_id || ',姓名:' || r_emp.first_name);END LOOP;
END;

✅ 总结

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

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

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


📚 参考资料

  • Oracle PL/SQL 官方文档
http://www.dtcms.com/a/268579.html

相关文章:

  • idea 使用vscode 快捷键
  • UE 材质 变体 概念
  • ClickHouse 入门详解:它到底是什么、优缺点、和主流数据库对比、适合哪些场景?
  • 1.1_5_2 计算机网络的性能指标(下)
  • 【Vben3全解】【组件库开发】解决组件库开发中css的命名难题,保证代码质量,构建useNamespace函数
  • docker所占硬盘内存指令
  • 强化学习:Distributed PPO (DPPO) 学习笔记
  • Day08-Flask 或 Django 简介:构建 Web 应用程序
  • C++高频知识点(三)
  • 基于STM32设计的心率脉搏测量仪(项目资料)(ID:9)
  • 【Linux | 网络】网络编程套接字
  • Baklib作为赞助商参加RubyConf China 2025 技术大会
  • Java基础:随机数生成、循环结构与方法封装详解
  • 国产MCU学习Day10——CW32F030C8T6模拟电压比较器全解析
  • 【EGSR2025】材质+扩散模型+神经网络相关论文整理随笔
  • springsecurity03--异常拦截处理(认证异常、权限异常)
  • 【机器学习深度学习】多分类评估策略:混淆矩阵计算场景模拟示例
  • Rust 注释
  • OpenAI要开发能聊天的AI版Office挑战微软?
  • 【Spring】Spring Boot + OAuth2 + JWT + Gateway的完整落地方案,包含认证流程设计
  • window 服务器上部署前端静态资源以及nginx 配置
  • 揭秘图像LLM:从像素到语言的智能转换
  • 创意Python爱心代码
  • 基于Flink 1.20、StarRocks与TiCDC构建高效数据处理链路教程
  • linux如何下载github的一个项目
  • stm32与tp-linkv2接线、解决识别不到芯片问题
  • C++ -- string类的模拟实现
  • Go的标准库http原理解析
  • 【论文阅读】Few-Shot PPG Signal Generation via Guided Diffusion Models
  • Web Worker:让前端飞起来的隐形引擎