Oracle — PL-SQL

介绍

     Oracle PL/SQL是专为Oracle数据库设计的过程化编程语言,深度融合SQL语句与结构化编程逻辑,旨在高效处理复杂数据操作与业务规则。其核心特征为“块结构”,程序由声明、执行、异常处理三部分组成,支持模块化开发,显著提升代码复用性和可维护性。PL/SQL通过预编译机制将代码块整体发送至数据库执行,大幅减少网络交互频次,尤其擅长批量数据处理,可借助FORALL、BULK COLLECT等特性优化事务性能。开发者可创建存储过程、函数、触发器及程序包,将业务逻辑封装于数据库层,实现数据计算下沉,保障事务一致性与安全性。异常处理框架支持自定义错误捕获与响应,增强程序健壮性。游标机制提供灵活的数据逐行处理能力,动态SQL则支持运行时语句构造,适应复杂逻辑场景。随着版本迭代,PL/SQL持续集成JSON解析、面向对象编程等现代特性,并与Java、Python等语言深度互通,巩固其在企业级应用开发中的地位,成为Oracle生态中处理高并发事务、构建金融级系统的关键技术栈。


PL/SQL 块结构

Oracle PL/SQL 块是程序基本单元,包含声明(DECLARE)、执行(BEGIN-END)、异常处理(EXCEPTION)三部分,支持变量定义、逻辑控制及错误处理,用于封装数据库操作和业务逻辑。匿名块可直接执行,存储过程等具名块可重复调用。

PL/SQL采用块结构,分为:

  1. 声明部分(DECLARE):定义变量、游标、异常等(可选)。
  2. 执行部分(BEGIN ... END):包含主要逻辑代码。
  3. 异常处理(EXCEPTION):处理运行时错误(可选)。
DECLAREv_name VARCHAR2(50) := 'Alice';
BEGINDBMS_OUTPUT.PUT_LINE('Hello, ' || v_name);
EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('Error occurred');
END;

变量与数据类型

Oracle PL/SQL变量用于存储数据,需声明数据类型,包括标量(如NUMBER、VARCHAR2)、复合(记录、集合)、引用及LOB类型,支持%TYPE继承字段类型,确保数据一致性与灵活性。

  • 标量类型:NUMBER, VARCHAR2, DATE, BOOLEAN等。
  • 复合类型:
    • 记录(RECORD):结构体类型。
TYPE t_emp IS RECORD (id NUMBER, name VARCHAR2(100));
  • 集合:包括关联数组(INDEX BY)、嵌套表(TABLE)、可变数组(VARRAY)。
  • 引用类型:%TYPE(字段类型)和%ROWTYPE(整行类型)。
  v_emp_id employees.employee_id%TYPE; -- 引用表字段类型v_emp employees%ROWTYPE; -- 引用整行结构

流程控制

Oracle PL/SQL流程控制通过条件语句(IF/CASE)、循环(FOR/WHILE/LOOP)及顺序控制(GOTO/NULL)管理代码执行逻辑,实现灵活业务处理与逻辑分支。

条件语句:

  IF condition THEN ... ELSIF ... ELSE ... END IF;CASE WHEN ... THEN ... ELSE ... END CASE;

循环:

  1. 基本循环:LOOP ... EXIT WHEN ... END LOOP;
  2. WHILE循环:WHILE condition LOOP ... END LOOP;
  3. FOR循环:FOR i IN 1..10 LOOP ... END LOOP;

游标(Cursors)

Oracle PL/SQL游标用于逐行处理查询结果集,分显式(手动声明、打开、提取、关闭)和隐式(自动管理)两种,支持循环遍历数据,实现多行记录的精确操作与复杂业务逻辑处理。

  • 显式游标:
DECLARECURSOR c_emp IS SELECT * FROM employees;v_emp employees%ROWTYPE;BEGINOPEN c_emp;LOOPFETCH c_emp INTO v_emp;EXIT WHEN c_emp%NOTFOUND;-- 处理数据END LOOP;CLOSE c_emp;END;
  • 隐式游标:自动处理SELECT INTO或DML语句。
  • FOR循环游标:
  FOR emp_rec IN (SELECT * FROM employees) LOOPDBMS_OUTPUT.PUT_LINE(emp_rec.name);END LOOP;

异常处理

  1. 预定义异常:如NO_DATA_FOUND, TOO_MANY_ROWS。
  2. 自定义异常:
  DECLAREe_custom EXCEPTION;PRAGMA EXCEPTION_INIT(e_custom, -20001);BEGINRAISE e_custom;EXCEPTIONWHEN e_custom THENDBMS_OUTPUT.PUT_LINE('自定义错误');END;

存储过程与函数

Oracle PL/SQL存储过程(PROCEDURE)封装数据库操作,无返回值;函数(FUNCTION)返回计算结果,可在SQL中调用。两者均支持参数传递,提升代码复用性、模块化及执行效率。

  • 存储过程:
  CREATE OR REPLACE PROCEDURE proc_name (p_param IN NUMBER) ISBEGIN-- 逻辑代码END;
  • 函数(必须返回一个值):
CREATE OR REPLACE FUNCTION func_name RETURN NUMBER ISBEGINRETURN 100;END;
  • 参数模式:IN(输入,默认)、OUT(输出)、IN OUT(双向)。

动态SQL

  • EXECUTE IMMEDIATE:
  EXECUTE IMMEDIATE 'UPDATE employees SET salary = :1 WHERE id = :2' USING 5000, 101;
  • DBMS_SQL包:处理复杂动态SQL。

事务控制

  1. 显式提交:COMMIT;
  2. 回滚:ROLLBACK;或回滚到保存点:ROLLBACK TO sp1;
  3. 保存点:SAVEPOINT sp1;

集合类型

  • 关联数组:
  TYPE t_dict IS TABLE OF VARCHAR2(20) INDEX BY PLS_INTEGER;
  • 嵌套表:
TYPE t_list IS TABLE OF NUMBER;
  • 可变数组(VARRAY):固定大小的数组。

触发器(Triggers)

  1. 行级触发器(FOR EACH ROW)可访问:NEW和:OLD。
  2. 事件:BEFORE/AFTER INSERT/UPDATE/DELETE。
CREATE TRIGGER trg_audit
BEFORE UPDATE ON employees
FOR EACH ROW
BEGININSERT INTO audit_table VALUES (:OLD.salary, :NEW.salary);
END;

注意事项

  1. 异常处理中避免过度使用WHEN OTHERS,应捕获具体异常。
  2. 显式游标使用后需及时关闭。
  3. 动态SQL需防范SQL注入,优先使用绑定变量(USING子句)。
  4. 事务控制需谨慎,存储过程内通常不自动提交,由调用者决定。

总结

     Oracle PL/SQL是Oracle数据库专用的过程化编程语言,深度融合SQL的数据处理能力与结构化编程特性。它以块(BLOCK)为基本单元,每个块由声明部分(DECLARE)、执行部分(BEGIN-END)和异常处理(EXCEPTION)构成,支持模块化开发,提升代码可读性与复用性。PL/SQL通过变量、条件分支(IF/CASE)、循环(LOOP/WHILE/FOR)等语法实现复杂逻辑控制,并允许开发者创建存储过程、函数、包(Package)及触发器(Trigger),将业务逻辑封装在数据库层,减少网络交互,提高执行效率。

     其异常处理机制通过预定义和自定义异常捕获错误,确保程序健壮性。游标(显式/隐式)支持逐行处理查询结果集,而集合类型(关联数组、嵌套表等)可高效操作批量数据。动态SQL技术(如EXECUTE IMMEDIATE)赋予SQL语句运行时动态构建的能力,适应灵活场景需求。PL/SQL与SQL无缝集成,支持直接在代码中嵌入DML、事务控制语句,同时通过BULK COLLECT、FORALL等特性优化批量操作性能。随着版本迭代,PL/SQL持续增强对JSON、云计算的支持,并强化调试工具(如DBMS_OUTPUT、UTL_FILE),成为企业级数据处理、事务管理和自动化任务的核心工具,广泛应用于金融、电信等领域的高性能数据库系统中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/79878.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高防ip支持哪些网络协议

高防IP通常支持多种网络协议,以提供全面的网络安全防护。以下是一些主要支持的网络协议及其相关说明: TCP协议(传输控制协议): TCP协议是最常见的传输协议,广泛应用于互联网通信。高防IP通过对TCP协议的防…

Flutter基础()

导航栏 appBar: AppBar() title: const Text(搜索) //标题 backgroundColor: Colors.blue //背景颜色 centerTitle: true //标题居中leading 属性 作用: 放置在应用栏左侧的控件,通常是一个图标按钮,用于导航或打开菜单。 AppBar(le…

ESP系列单片机选择指南:结合实际场景的最优选择方案

前言 在物联网(IoT)快速发展的今天,ESP系列单片机凭借其优异的无线连接能力和丰富的功能特性,已成为智能家居、智慧农业、工业自动化等领域的首选方案。本文将深入分析各款ESP芯片的特点,结合典型应用场景,帮助开发者做出最优选择…

搭建Caffeine+Redis多级缓存机制

本地缓存的简单实现方案有HashMap,CucurrentHashMap,成熟的本地缓存方案有Guava 与 Caffeine ,企业级应用推荐下面说下两者的区别 1. 核心异同对比 特性Guava CacheCaffeine诞生背景Google Guava 库的一部分(2011年)…

【Linux系统】第四节—详解yum+vim

hello 我是云边有个稻草人 Linux—本节课所属专栏—欢迎订阅—持续更新中~ 目录 画板—本节课知识点详解 一、软件包管理器 1.1 什么是软件包 1.2 Linux软件⽣态 1.3 yum具体操作 【查看软件包】 【安装软件】 【卸载软件】 【注意事项】 1.4 安装源 二、vim 2.1 …

EasyRTC嵌入式音视频通信SDK打造带屏IPC全场景实时通信解决方案

一、方案概述​ 在智能安防与物联网快速发展的背景下,带屏IPC(网络摄像机)不仅承担着视频采集与监控的基础功能,还逐渐向多样化交互与智能化方向演进。EasyRTC作为一款强大的实时通信框架,具备低延迟、高稳定性、跨平…

Linux下的c/c++开发之操作Redis数据库

C/C 操作 Redis 的常用库 在 C/C 开发中操作 Redis 有多种方式,最主流的选择是使用第三方客户端库。由于 Redis 官方本身是使用 C 编写的,提供的 API 非常适合 C/C 调用。常见的 Redis C/C 客户端库包括: hiredis:官方推荐的轻量…

go 通过汇编学习atomic原子操作原理

文章目录 概要一、原理1.1、案例1.2、关键汇编 二、LOCK汇编指令2.1、 LOCK2.2、 原理2.2.1、 缓存行2.2.2、 缓存一致性之MESI协议2.2.3、lock原理 三、x86缓存发展四、x86 DMA发展参考 概要 在并发操作下,对一个简单的aa2的操作都会出错,这是因为这样…

mapreduce打包运行

maven打包 MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序(例如:jar包)&#xff0…

小白成长之路-LInux系统文件与目录管理(二)

提示:第二部分对第一部分收尾 文章目录 常见的命令如下一、文件查看命令1. more命令2.less命令3.head命令4.tail命令5.nl命令(了解)6.创建目录命令7.创建文件命令>: 覆盖重定向>>: 追加重定向 8.touch命令9.echo命令10.文件或目录复…

JVM之虚拟机运行

虚拟机运行快速复习 try-catch:catch-异常表栈展开,finally-代码复制异常表兜底 类的生命周期:加载,连接(验证,准备,解析),初始化,使用,卸载 类…

AI数字人实现原理

随着人工智能与数字技术的快速发展,AI数字人(Digital Human)作为新一代人机交互媒介,正在多个行业中快速落地。无论是在虚拟主播、在线客服、教育培训,还是在数字代言、元宇宙中,AI数字人都扮演着越来越重要…

Android开发-数据库SQLite

在Android应用开发中,当需要存储结构化数据时,SQLite是一个非常强大的工具。SQLite是一款轻量级的关系型数据库管理系统,它内嵌于Android系统中,支持SQL语法,并且不需要单独的服务器进程或系统配置。本文将介绍如何在A…

android实现USB通讯

在 Android 上枚举 USB 设备除了使用 UsbManager.getDeviceList() 方法外,还有以下几种常见的方式: 1. 使用 USB 设备过滤器(XML 配置) 通过在 AndroidManifest.xml 中配置 USB 设备过滤器,可以让系统自动检测并通知…

FFmpeg视频编码的完整操作指南

步骤如下: 安装和准备FFmpeg:确保包含所需编码器(如libx264)。基本命令行编码:使用ffmpeg命令进行转码,设置视频编码器、CRF、预设等。API编码流程(针对开发者): a. 注册…

鸿蒙 UIAbility组件与UI的数据同步和窗口关闭

使用 EventHub 进行数据通信 Stage模型概念图 根据 Stage 模型概念图 UIAbility 先于 ArkUI Page 创建 所以,事件要先 .on 订阅 再 emit 发布 假如现在有页面 Page1 和他的 UIAbility // src/main/ets/page1ability/Page1Ability.ets onCreate(want: Want, laun…

全栈工程师实战手册:LuatOS日志系统开发指南!

本文聚焦LuatOS-log库的实战应用场景,通过完整案例演示日志模块集成、格式定制及远程同步方案,帮助全栈开发者构建灵活可靠的日志管理框架。下面,我们一起来认识LuatOS的log库! 一、 log.info() log info()主要打印一些正常的…

STM32-USART串口通信(9)

一、通信接口介绍 通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统。 当STM32想要实现一些功能,但是需要外挂一些其他模块才能实现,这就需要在两个设备之间连接上一根或多跟通信线,通过通信线路发送或者接…

【MoveIt 2】使用 MoveIt 任务构造器(MoveIt Task Constructor)进行拾取和放置

本教程将引导您创建一个使用 MoveIt 任务构造器规划抓取和放置操作的包。MoveIt 任务构造器(https://github.com/moveit/moveit_task_constructor/tree/ros2/)提供了一种为包含多个不同子任务(称为阶段)的任务进行规划的方法。如果…

破解商业综合体清洁管理困局:商业空间AI智能保洁管理系统全场景解决方案

方案整体概述 随着商业综合体日益向智能化、精细化管理转型,传统保洁工作面临人员监管难、清洁效果评估难、应急响应滞后等诸多挑战。为解决这些痛点,本系统依托计算机视觉、行为识别、图像分割与深度学习等AI技术,构建一套集人员管理、工作…