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

【DB】Oracle存储过程

目录

什么是存储过程?

为什么要使用存储过程?

创建存储过程

无参存储过程语法:

带参存储过程语法:

带有输入参数的存储过程

带有输出参数的存储过程

带有输入输出参数的存储过程

带有异常处理的存储过程

存储过程中游标定义使用

基本语法

示例

简单的游标使用

带有参数的游标

隐式游标属性

示例

检查UPDATE语句影响的行数

使用FOR循环遍历用户表中的所有记录

使用BEGIN和DECLARE关键字调用存储过程的区别

使用BEGIN

使用DECLARE

总结


什么是存储过程?

存储过程(Store Procedure)是一种在数据库中预先编译并存储的SQL代码合集,可以包含SQL语句和控制结构(如条件语句、循环等),用于完成一个或一系列数据库操作(比如对查询订单然后对订单进行修改)。存储过程可以接受输入参数、返回输出参数,并且可以返回结果集。它们通常用于执行复杂的数据操作和业务逻辑。

为什么要使用存储过程?

预编译:存储过程在首次执行时会被编译并存储在数据库中,后续调用时不需要重新编译,执行速度更快。

减少连接:当对数据库进行复杂操作时,可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序来完成,就变成了一条条的 SQL 语句需要等待执行结果进行后续操作,可能要多次连接数据库。而换成存储,只需要连接一次数据库就可以了。

代码重用:存储过程可以将复杂的业务逻辑封装在一个模块中,便于重用和维护。

事务管理:存储过程可以包含多个SQL语句,并且可以作为一个事务执行,确保操作的原子性。在存储过程中可以使用事务控制语句(如COMMIT和ROLLBACK)来管理事务,确保数据的一致性。

创建存储过程

Oracle存储过程包含三部分:过程声明,执行过程部分,存储过程异常。

无参存储过程语法:

CREATE OR REPLACE PROCEDURE NoParPro  -- NoParPro存储过程名称
AS  -- 声明部分
BEGIN  -- 执行部分-- 存储过程的主体代码
EXCEPTION  -- 存储过程异常处理部分-- 异常处理代码
END;

解释

  1. CREATE OR REPLACE PROCEDURE NoParPro

    • CREATE OR REPLACE PROCEDURE:这是创建或替换存储过程的关键字。如果存储过程已经存在,则会替换它;如果不存在,则会创建一个新的存储过程。

    • NoParPro:这是存储过程的名称。

  2. AS

    • 这是声明部分的开始。在这里可以声明变量、游标等。

  3. BEGIN

    • 这是存储过程的执行部分的开始。在这里编写存储过程的主体代码,包括SQL语句和PL/SQL控制结构(如条件语句、循环等)。

  4. EXCEPTION

    • 这是存储过程的异常处理部分的开始。在这里可以编写异常处理代码,用于捕获和处理在执行部分中可能发生的异常。

  5. END

    • 这是存储过程的结束标志。

举例:

CREATE OR REPLACE PROCEDURE NoParPro
ASv_count NUMBER;  -- 声明一个数字变量
BEGIN-- 执行部分SELECT COUNT(*) INTO v_countFROM Users;/* dbms_output.put_line(); 相当相当于JAVA中的System.out.println,注意记住一句话的结束使用分号结束,存储过程写完一定要执行将它保存到数据库中 (F8)快捷键,或者点击左上角执行*/DBMS_OUTPUT.PUT_LINE('用户总人数为: ' || v_count);
EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('执行出现异常。'|| SQLERRM);
END;
​

带参存储过程语法:

带有输入参数的存储过程

创建一个存储过程,用于插入一条记录到用户表中:

CREATE OR REPLACE PROCEDURE InsertUser (p_UserName IN VARCHAR2,p_Email IN VARCHAR2
) AS
BEGININSERT INTO Users (UserName, Email)VALUES (p_UserName, p_Email);  
END;调用存储过程:BEGINInsertUser('JohnDoe', 'john.doe@example.com');
END;
带有输出参数的存储过程

创建一个存储过程,用于查询用户的邮箱,并将结果返回给调用者:

CREATE OR REPLACE PROCEDURE GetUserEmail (p_UserName IN VARCHAR2, // 输入参数p_Email OUT VARCHAR2   // 输出参数
) AS
BEGINSELECT Email INTO p_EmailFROM UsersWHERE UserName = p_UserName;
END;

调用存储过程:

DECLAREv_Email VARCHAR2(100);
BEGINGetUserEmail('JohnDoe', v_Email);DBMS_OUTPUT.PUT_LINE('Email: ' || v_Email);
END;
带有输入输出参数的存储过程

创建一个存储过程,用于更新用户的邮箱,并返回更新后的邮箱:

CREATE OR REPLACE PROCEDURE UpdateUserEmail (p_UserName IN VARCHAR2,p_Email IN OUT VARCHAR2
) AS
BEGINUPDATE UsersSET Email = p_EmailWHERE UserName = p_UserName;
​SELECT Email INTO p_EmailFROM UsersWHERE UserName = p_UserName;
END;

调用存储过程:

​DECLAREv_Email VARCHAR2(100);
BEGINv_Email := 'new.email@example.com';UpdateUserEmail('JohnDoe', v_Email);DBMS_OUTPUT.PUT_LINE('Updated Email: ' || v_Email);
END;
带有异常处理的存储过程

创建一个存储过程,用于删除用户,并处理可能的异常:

CREATE OR REPLACE PROCEDURE DeleteUser (p_UserName IN VARCHAR2
) AS
BEGINDELETE FROM UsersWHERE UserName = p_UserName;
EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('User not found.');WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('An error occurred: ' || SQLERRM);
END;

调用存储过程:

BEGINDeleteUser('JohnDoe');
END;

存储过程中游标定义使用

在Oracle PL/SQL中,游标(Cursor)是用于逐行处理查询结果集的机制。游标允许你遍历查询结果集中的每一行,并对每一行执行特定的操作。以下是游标的基本语法和示例。

基本语法

声明游标

CURSOR cursor_name ISSELECT column1, column2, ...FROM table_nameWHERE condition;

打开游标

OPEN cursor_name;

获取游标数据

FETCH cursor_name INTO variable1, variable2, ...;

关闭游标

CLOSE cursor_name;
示例
简单的游标使用

创建一个存储过程,用于遍历用户表中的所有记录,并输出每个用户的用户名和邮箱:

CREATE OR REPLACE PROCEDURE ListUsers
AS-- 声明游标CURSOR user_cursor ISSELECT UserName, EmailFROM Users;
​-- 声明变量v_UserName/v_Email,其数据类型与表Users中的列UserName/v_Email相同v_UserName Users.UserName%TYPE;v_Email Users.Email%TYPE;
BEGIN-- 打开游标OPEN user_cursor;
​-- 循环遍历游标LOOPFETCH user_cursor INTO v_UserName, v_Email;EXIT WHEN user_cursor%NOTFOUND;
​-- 输出用户信息DBMS_OUTPUT.PUT_LINE('UserName: ' || v_UserName || ', Email: ' || v_Email);END LOOP;
​-- 关闭游标CLOSE user_cursor;
EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('An error occurred: ' || SQLERRM);
END;

调用存储过程:

BEGINListUsers;
END;
带有参数的游标

创建一个存储过程,用于根据用户名查询用户信息,并输出用户的邮箱:

CREATE OR REPLACE PROCEDURE GetUserInfo (p_UserName IN VARCHAR2
) AS-- 声明游标CURSOR user_cursor ISSELECT EmailFROM UsersWHERE UserName = p_UserName;
​-- 声明变量v_Email Users.Email%TYPE;
BEGIN-- 打开游标OPEN user_cursor;
​-- 获取游标数据FETCH user_cursor INTO v_Email;
​-- 检查是否找到记录IF user_cursor%FOUND THENDBMS_OUTPUT.PUT_LINE('Email: ' || v_Email);ELSEDBMS_OUTPUT.PUT_LINE('User not found.');END IF;
​-- 关闭游标CLOSE user_cursor;
EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('An error occurred: ' || SQLERRM);
END;

调用存储过程:

BEGINGetUserInfo('JohnDoe');
END;
隐式游标属性

在PL/SQL中,SQL%ROWCOUNT是一个隐式游标属性,用于返回最近执行的SQL语句(如INSERTUPDATEDELETE)影响的行数。这个属性可以用于检查SQL语句的执行结果,从而进行相应的处理。

示例

以下是一个示例,展示了如何使用SQL%ROWCOUNT属性来检查UPDATE语句影响的行数,并根据结果执行不同的操作。

检查UPDATE语句影响的行数

创建一个存储过程,用于更新用户的邮箱,并检查更新操作影响的行数:

​
CREATE OR REPLACE PROCEDURE UpdateUserEmail (p_UserName IN VARCHAR2,p_NewEmail IN VARCHAR2
) AS
BEGIN-- 更新用户的邮箱UPDATE UsersSET Email = p_NewEmailWHERE UserName = p_UserName;
​-- 检查更新操作影响的行数IF SQL%ROWCOUNT = 0 THENDBMS_OUTPUT.PUT_LINE('No rows updated. User not found.');ELSEDBMS_OUTPUT.PUT_LINE('Email updated successfully for user: ' || p_UserName);END IF;
EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('An error occurred: ' || SQLERRM);
END;

调用存储过程:

BEGINUpdateUserEmail('JohnDoe', 'new.email@example.com');
END;

在PL/SQL中,FOR循环可以用于遍历游标返回的结果集。通过使用FOR循环,可以简化游标的打开、获取和关闭操作。以下是一个示例,展示了如何使用FOR循环在存储过程中遍历游标返回的结果集。

使用FOR循环遍历用户表中的所有记录

创建一个存储过程,用于遍历用户表中的所有记录,并输出每个用户的用户名和邮箱:

CREATE OR REPLACE PROCEDURE ListUsers
AS-- 声明游标CURSOR user_cursor ISSELECT UserName, EmailFROM Users;
BEGIN-- 使用FOR循环遍历游标FOR user_record IN user_cursor LOOP-- 输出用户信息DBMS_OUTPUT.PUT_LINE('UserName: ' || user_record.UserName || ', Email: ' || user_record.Email);END LOOP;
EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('An error occurred: ' || SQLERRM);
END;

调用存储过程:

BEGINListUsers;
END;

使用BEGINDECLARE关键字调用存储过程的区别

BEGINUpdateOrInsertUser('JohnDoe', 'john.doe@example.com');
END;
​
DECLAREv_Email VARCHAR2(100);
BEGINGetUserEmail('JohnDoe', v_Email);DBMS_OUTPUT.PUT_LINE('Email: ' || v_Email);
END;

在调用Oracle存储过程时,使用BEGINDECLARE关键字的区别主要在于是否需要声明变量或处理异常。以下是详细解释:

使用BEGIN

当你只需要简单地调用存储过程,而不需要声明变量或处理异常时,可以直接使用BEGIN关键字。例如:

​BEGINNoParPro;
END;

在这个例子中,NoParPro是一个不需要参数的存储过程。BEGINEND关键字用于标记PL/SQL代码块的开始和结束。

使用DECLARE

当你需要在调用存储过程之前声明变量或处理异常时,可以使用DECLARE关键字。DECLARE块用于声明变量、游标等,并且可以包含异常处理部分。例如:

DECLAREv_count NUMBER;  -- 声明一个数字变量
BEGINNoParPro;  -- 调用存储过程-- 其他PL/SQL代码
EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('No data found.');WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('An error occurred: ' || SQLERRM);
END;

在这个例子中:

  1. DECLARE

    • 用于声明变量、游标等。在这里,我们声明了一个数字变量v_count

  2. BEGIN

    • 用于标记PL/SQL代码块的开始。在这里,我们调用了存储过程NoParPro,并且可以包含其他PL/SQL代码。

  3. EXCEPTION

    • 用于处理在BEGIN块中可能发生的异常。在这里,我们捕获了NO_DATA_FOUND异常和其他异常,并输出相应的错误消息。

总结

  • 使用BEGIN:当你只需要简单地调用存储过程,而不需要声明变量或处理异常时。

  • 使用DECLARE:当你需要在调用存储过程之前声明变量或处理异常时。

相关文章:

【DB】Oracle存储过程

目录 什么是存储过程? 为什么要使用存储过程? 创建存储过程 无参存储过程语法: 带参存储过程语法: 带有输入参数的存储过程 带有输出参数的存储过程 带有输入输出参数的存储过程 带有异常处理的存储过程 存储过程中游标…...

亚博microros小车-原生ubuntu支持系列:14雷达跟踪与雷达守卫

背景知识 激光雷达的数据格式参见: 亚博microros小车-原生ubuntu支持系列:13 激光雷达避障-CSDN博客 本节体验雷达跟踪跟守卫 PID控制 从百度百科摘一段介绍 比例积分微分控制(proportional-integral-derivative control)&am…...

c++迷宫问题(migong)

今天的题目叫“迷宫问题(migong&#xff09;”&#xff0c;是“DFS深度优先搜索 递归”一类的。 题目描述 设有一个N*N(2<N<10)方格的迷宫&#xff0c;入口和出口分别在左上角和右上角。迷宫格子中 分别放0和1&#xff0c;0表示可通&#xff0c;1表示不能&#xff0c;入…...

深度学习项目--基于LSTM的糖尿病预测探究(pytorch实现)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 LSTM模型一直是一个很经典的模型&#xff0c;一般用于序列数据预测&#xff0c;这个可以很好的挖掘数据上下文信息&#xff0c;本文将使用LSTM进行糖尿病…...

Java Swing 基础组件详解 [论文投稿-第四届智能系统、通信与计算机网络]

大会官网&#xff1a;www.icisccn.net Java Swing 是一个功能强大的 GUI 工具包&#xff0c;提供了丰富的组件库用于构建跨平台的桌面应用程序。本文将详细讲解 Swing 的基础组件&#xff0c;包括其作用、使用方法以及示例代码&#xff0c;帮助你快速掌握 Swing 的核心知识。 一…...

深圳大学-智能网络与计算-实验三:网络容量优化分析实验

实验目的与要求 了解什么是凸优化问题&#xff1b;学会使用 Matlab CVX 工具箱解决最优功率分配问题&#xff0c;使得信道容量最大化&#xff1b;了解注水算法&#xff1b; 方法&#xff0c;步骤 深入理解最优功率分配问题。使用 CVX 找出最优的功率分配。使用凸优化数学分析…...

嵌入式基础 -- PCIe 控制器中断管理之MSI与MSI-X简介

PCIe 控制器中断管理技术文档 1. 背景 在现代计算机系统中&#xff0c;中断是设备与 CPU 通信的重要机制&#xff0c;PCIe 控制器提供了从传统线中断到基于消息的中断&#xff08;MSI/MSI-X&#xff09;的演进&#xff0c;以提升中断处理效率和可扩展性。x86 和 ARM 架构虽然…...

Android-okhttp详解

目录 一&#xff0c;介绍 二&#xff0c;简单使用 三&#xff0c;流程分析 四&#xff0c;分发器 五&#xff0c;拦截器 5.1 重试及重定向拦截器 5.1.1 重试 5.1.2 重定向 5.2 桥接拦截器 5.3 缓存拦截器 5.4 连接拦截器 5.5 请求服务器拦截器 一&#xff0c;介绍 OkHttp是当下…...

CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测(Matlab完整源码和数据)

CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测&#xff08;Matlab完整源码和数据&#xff09; 目录 CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测&#xff08;Matlab完整源码和数据&#xff09;预测效果基本介绍 CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测一…...

数字图像处理:实验七

uu们&#xff01;这是我们目前数字图像系列的最后一张&#xff0c;之后有关人工智能结合的数字图像处理咸鱼哥正在学习和创作中&#xff0c;所以还请大家给咸鱼哥点时间&#xff0c;同时也提前预祝大家2025年新春快乐&#xff01;&#xff08;咸鱼哥真诚的祝愿每一个人&#xf…...

Excel分区间统计分析(等步长、不等步长、多维度)

在数据分析过程中&#xff0c;可能会需要统计不同数据区间的人数、某个数据区间的平均值或者进行分组区间统计&#xff0c;本文从excel函数到数据透视表的方法&#xff0c;从简单需求到复杂需求&#xff0c;采用不同的方法进行讲解&#xff0c;尤其是通过数据透视表的强大功能大…...

QWindow类使用介绍与代码演示

深入浅出C++ Qt开发技术专栏 https://blog.csdn.net/yao_hou/category_9276099.html?spm=1001.2014.3001.5482 文章目录 QWindow主要功能和特性常用的函数示例代码适用场景QWindow父类QSurface`QSurface` 类概述主要功能和特性常用的函数相关的子类示例代码`QSurface` 的实际应…...

OpenCV图像显示imshow()函数——详解

OpenCV图像显示imshow()函数——详解 本文目录&#xff1a; 零、时光宝盒 一、OpenCV 图像显示使用imshow()函数语法 二、imshow()显示图片时发生图片显示不全的解决方法 解决办法&#xff08;1&#xff09; 解决办法&#xff08;2&#xff09; 总结 三、imshow()图像显…...

Oracle 12c 中的 CDB和PDB的启动和关闭

一、简介 Oracle 12c引入了多租户架构&#xff0c;允许一个容器数据库&#xff08;Container Database, CDB&#xff09;托管多个独立的可插拔数据库&#xff08;Pluggable Database, PDB&#xff09;。本文档旨在详细描述如何启动和关闭CDB及PDB。 二、容器数据库 (CDB) 2.1…...

二次封装的方法

二次封装 我们开发中经常需要封装一些第三方组件&#xff0c;那么父组件应该怎么传值&#xff0c;怎么调用封装好的组件原有的属性、插槽、方法&#xff0c;一个个调用虽然可行&#xff0c;但十分麻烦&#xff0c;我们一起来看更简便的方法。 二次封装组件&#xff0c;属性怎…...

【BQ3568HM开发板】如何在OpenHarmony上通过校园网的上网认证

引言 前面已经对BQ3568HM开发板进行了初步测试&#xff0c;后面我要实现MQTT的工作&#xff0c;但是遇到一个问题&#xff0c;就是开发板无法通过校园网的认证操作。未认证的话会&#xff0c;学校使用的深澜软件系统会屏蔽所有除了认证用的流量。好在我们学校使用的认证系统和…...

安装Ubuntu22.04

1.引用教程 如何安装Ubuntu Server 22.04 LTS_ubuntu22.04 server-CSDN博客 2.空间分配 要使用 docker 比较多所以分别的 docker 空间大...

Charles 4.6.7 浏览器网络调试指南:流量过滤与分析(六)

1. 概述 在网络调试和优化过程中&#xff0c;Charles 不仅可以实现简单的网络抓包操作&#xff0c;还支持更高级的抓包技巧和流量分析功能。这些功能能够帮助开发者深入挖掘网络请求的细节&#xff0c;为复杂问题提供有效的解决方案。本文将重点讲解 Charles 的过滤规则、自定…...

浅拷贝(Shallow Copy)和深拷贝(Deep Copy)

浅拷贝&#xff08;Shallow Copy&#xff09;和深拷贝&#xff08;Deep Copy&#xff09;是对象复制的两种方式&#xff0c;它们在处理对象内部引用类型成员时有不同的行为。下面我将详细解释这两种拷贝的区别&#xff0c;并提供具体的 Java 示例代码。 浅拷贝&#xff08;Shal…...

解决双系统引导问题:Ubuntu 启动时不显示 Windows 选项的处理方法

方法 1&#xff1a;检查 GRUB 引导菜单是否隐藏 启动进入 Ubuntu 系统。打开终端&#xff0c;输入以下命令编辑 GRUB 配置文件&#xff1a;sudo nano /etc/default/grub检查以下配置项&#xff1a; GRUB_TIMEOUT0&#xff1a;如果是 0&#xff0c;将其改为一个较大的值&#x…...

宏_wps_宏修改word中所有excel表格的格式_设置字体对齐格式_删除空行等

需求&#xff1a; 将word中所有excel表格的格式进行统一化&#xff0c;修改其中的数字类型为“宋体&#xff0c; 五号&#xff0c;右对齐&#xff0c; 不加粗&#xff0c;不倾斜”&#xff0c;其中的中文为“宋体&#xff0c; 五号&#xff0c; 不加粗&#xff0c;不倾斜” 数…...

行政办公管理系统的需求设计和实现

前言&#xff1a; 总裁办/综合部&#xff0c;作为综合行政管理部门服务于整个公司&#xff0c;工作职责包含从最基础的行政综合到协调督办、对外政务、品牌建设等等&#xff0c;工作量繁多而且琐碎。如何通过信息化来实现标准化和常态化的管理手段&#xff0c;确保总裁办的各项…...

996引擎 - NPC-动态创建NPC

996引擎 - NPC-动态创建NPC 创建脚本服务端脚本客户端脚本参考资料有个小问题,创建NPC时没有控制朝向的参数。所以。。。自己考虑怎么找补吧。 创建脚本 服务端脚本 Mir200\Envir\Market_Def\test\test001-3.lua -- NPC入口函数 function main(player)-- 获取玩家的用户名…...

HTML<hgroup>标签

例子&#xff1a; 使用hgroup元素标记标题和段落是相关的&#xff1a; <hgroup> <h2>Norway</h2> <p>The land with the midnight sun.</p> </hgroup> 定义和用法&#xff1a; 标签<hgroup>用于包围标题和一个或多个<p&g…...

GIS 中的 SQLAlchemy:空间数据与数据库之间的桥梁

利用 SQLAlchemy 在现代应用程序中无缝集成地理空间数据导言 地理信息系统&#xff08;GIS&#xff09;在管理城市规划、环境监测和导航系统等各种应用的空间数据方面发挥着至关重要的作用。虽然 PostGIS 或 SpatiaLite 等专业地理空间数据库在处理空间数据方面非常出色&#…...

机试题——最小矩阵宽度

题目描述 给定一个矩阵&#xff0c;包含 N * M 个整数&#xff0c;和一个包含 K 个整数的数组。 现在要求在这个矩阵中找一个宽度最小的子矩阵&#xff0c;要求子矩阵包含数组中所有的整数。 输入描述 第一行输入两个正整数 N&#xff0c;M&#xff0c;表示矩阵大小。 接下…...

【C++图论】1761. 一个图中连通三元组的最小度数|2005

本文涉及知识点 C图论 LeetCode1761. 一个图中连通三元组的最小度数 给你一个无向图&#xff0c;整数 n 表示图中节点的数目&#xff0c;edges 数组表示图中的边&#xff0c;其中 edges[i] [ui, vi] &#xff0c;表示 ui 和 vi 之间有一条无向边。 一个 连通三元组 指的是 …...

【力扣:新动计划,编程入门 —— 题解 ③】

—— 25.1.26 231. 2 的幂 给你一个整数 n&#xff0c;请你判断该整数是否是 2 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 如果存在一个整数 x 使得 n 2x &#xff0c;则认为 n 是 2 的幂次方。 示例 1&#xff1a; 输入&#xff1a;…...

「全网最细 + 实战源码案例」设计模式——工厂方法模式

核心思想 简单工厂模式是一种创建者模式&#xff0c;它通过一个工厂类负责创建不同类型的对象&#xff0c;根据传入的参数决定实例化的具体类&#xff0c;也被称为“静态工厂方法”模式&#xff0c;因为工厂方法通常是静态的。 结构 1. 工厂类&#xff1a; 提供一个静态方法…...

SpringBoot使用MockMVC通过http请求controller控制器调用测试

说明 在Spring Boot中编写测试控制器调用是一个常见的需求,通常使用Spring的测试框架来完成。Spring Boot提供了多种方式来测试控制器,包括使用MockMvc进行模拟HTTP请求和响应的测试。 基本示例 1. 创建Spring Boot项目 首先,确保你已经创建了一个Spring Boot项目。如果…...

电子应用设计方案105:智能家庭AI拖把系统设计

智能家庭 AI 拖把系统设计 一、引言 智能家庭 AI 拖把系统旨在为用户提供更高效、便捷和智能化的地面清洁解决方案&#xff0c;减轻家务劳动负担。 二、系统概述 1. 系统目标 - 自动清洁地面&#xff0c;包括吸尘、拖地和擦干功能。 - 智能识别地面材质和污渍程度&#xff0c…...

Android13源码下载和编译过程详解

前言 作为Android开发者人人都应该有一份自己Android源码,这样我们就可以随时对自己有疑惑的地方通过亲手调试来加强理解 一 源码下载 1.1 配置要求 官方推荐配置请参考&#xff1a;AOSP使用入门文档&#xff0c;重点有如下几项&#xff1a; 1.1.1 硬件配置要求 至少需要…...

Greenplum临时表未清除导致库龄过高处理

1.问题 Greenplum集群segment后台日志报错 2.回收库龄 master上执行 vacuumdb -F -d cxy vacuumdb -F -d template1 vacuumdb -F -d rptdb 3.回收完成后检查 仍然发现segment还是有库龄报警警告信息发出 4.检查 4.1 在master上检查库年龄 SELECT datname, datfrozen…...

SD-WAN站点和客户端的区别

很多用户在使用比扬云SD-WAN的时候不清楚站点和员工客户端的区别&#xff0c;尤其是很多从ZeroTier迁移过来的用户&#xff0c;这篇文章我们会详细介绍比扬云SD-WAN的站点和客户端使用场景。 ZeroTier只有客户端&#xff0c;没有站点&#xff0c;但是有路由配置&#xff0c;允…...

Arduino大师练成手册 -- 控制 MH-SD 卡模块

要在 Arduino 上控制 MH-SD 卡模块&#xff0c;你可以按照以下步骤进行&#xff1a; 硬件连接 VCC&#xff1a;连接到 Arduino 的 3.3V 或 5V 引脚&#xff08;根据模块的要求&#xff09;。 GND&#xff1a;连接到 Arduino 的 GND 引脚。 CS&#xff1a;连接到 Arduino 的…...

【MQ】RabbitMq的可靠性保证

消息队列中的可靠性主要是分为三部分&#xff1a; 消息不丢失&#xff1a;确保消息从生产者发送到消费者消息不丢失消息不重复&#xff1a;确保消息不被重复消费消息顺序性&#xff1a;确保消费的顺序性 解决方案主要有以下几部分&#xff1a; 消息不丢失 生产者确认机制持久…...

自签证书的dockerfile中from命令无法拉取镜像而docker的pull命令能拉取镜像

问题现象&#xff1a; docker pull images拉取镜像正常 dockerfile中的from命令拉取镜像就会报出证书错误。报错信息如下&#xff1a; [bjxtbwj-kvm-test-jenkins-6-243 ceshi_dockerfile]$ docker build . [] Building 0.4s (3/3) FINISHED …...

LAPD协议

实现LAPD&#xff08;Link Access Procedure on the D-channel&#xff09;协议的具体步骤和代码示例会比较复杂&#xff0c;通常涉及到底层网络编程和对ISDN协议的深入理解。以下是一个更详细的实现指导&#xff0c;主要集中在C/C环境中。 环境准备 确保你有一个支持ISDN的开发…...

jupyter版本所引起的扩展插件问题

文章目录 如何永久切换python安装源为https://mirrors.aliyun.com/pypi/simple方法一&#xff1a;通过配置文件永久设置&#xff08;推荐&#xff09;步骤 1&#xff1a;创建或修改 pip 配置文件步骤 2&#xff1a;验证配置是否生效 方法二&#xff1a;通过命令行直接配置效果验…...

连接 OpenAI 模型:基础操作

在这一部分中&#xff0c;我们将介绍如何连接 OpenAI 模型&#xff0c;设置 API 密钥&#xff0c;并使用 Spring AI 的 ChatClient 与 OpenAI 模型进行简单的对话。Spring AI 为集成 OpenAI 模型提供了方便的工具&#xff0c;使得开发者能够更轻松地与 GPT 系列模型进行交互。 …...

Vue.js组件开发-实现对视频预览

在 Vue 中实现视频文件预览 实现步骤 创建 Vue 组件&#xff1a;构建一个 Vue 组件用于处理视频文件的选择和预览。文件选择&#xff1a;添加一个文件输入框&#xff0c;允许用户选择视频文件。读取文件&#xff1a;监听文件选择事件&#xff0c;使用 FileReader API 读取所选…...

基于 Arduino Uno 和 RFID-RC522 的 RFID 卡号读取技术详解

引言 射频识别&#xff08;RFID&#xff09;技术因其非接触式、高效性和低成本的特点&#xff0c;广泛应用于门禁系统、物流管理和智能设备等领域。本文将通过 Arduino Uno 和 MFRC522 RFID 模块&#xff0c;手把手教你实现 RFID 卡号的读取&#xff0c;并提供完整的代码解析和…...

AI Agent的测试与监控:保障稳定性的实战经验

在前面的文章中&#xff0c;我们讨论了 AI Agent 的各个核心模块。今天&#xff0c;我想聊聊如何保障 AI Agent 的稳定性。说实话&#xff0c;这个话题我一直很关注&#xff0c;因为在生产环境中&#xff0c;稳定性往往比功能更重要。 从一次线上事故说起 还记得去年一个深夜…...

Servlet项目依赖管理

一、Servlet 相关技术选型 思路: 先选择 Servlet 容器&#xff0c;再找支持当前 JDK 版本的 Servlet 容器版本。 已知Servlet容器有两种市场占用率较高&#xff0c;Tomcat&Jetty。接下来分别按照上述思路进行选择容器版本。 Tomcat 官网: https://tomcat.apache.org/ 版本…...

戴尔电脑设置u盘启动_戴尔电脑设置u盘启动多种方法

最近有很多网友问&#xff0c;戴尔台式机怎么设置u盘启动&#xff0c;特别是近两年的戴尔台式机比较复杂&#xff0c;有些网友不知道怎么设置&#xff0c;其实设置u盘启动有两种方法&#xff0c;下面小编教大家戴尔电脑设置u盘启动方法。 戴尔电脑设置u盘启动方法一、戴尔进入b…...

大数据治理实战指南:数据质量、合规与治理架构

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 引言 随着企业数字化转型的加速&#xff0c;大数据已成为驱动业务决策的核心资产。然而&#xff0c;数据治理的缺失或不完善&…...

2025年01月26日Github流行趋势

项目名称&#xff1a;onlook 项目地址url&#xff1a;https://github.com/onlook-dev/onlook项目语言&#xff1a;TypeScript历史star数&#xff1a;4871今日star数&#xff1a;207项目维护者&#xff1a;Kitenite, drfarrell, iNerdStack, abhiroopc84, apps/dependabot项目简…...

03-画P封装(制作2D+添加3D)

画P封装的方法2D制作3D添加 使用P封装自己画0603格式的电阻的P封装1. 看规格书,找参数2. 创建一个新的P封装3. 灯泡两侧放焊盘4.设置焊盘大小和形状5.根据坐标定义中间间隔: L/2原则6. 画最外层丝印(丝印层直接围住即可)7.在平面的P封装上,添加3D立体封装库 立创商城下载P封装向…...

WPF5-x名称空间

1. x名称空间2. x名称空间内容3. x名称空间内容分类 3.1. x:Name3.2. x:Key3.3. x:Class3.4. x:TypeArguments 4. 总结 1. x名称空间 “x名称空间”的x是映射XAML名称空间时给它取的名字&#xff08;取XAML的首字母&#xff09;&#xff0c;里面的成员&#xff08;如x:Class、…...

UDP 广播组播点播的区别及联系

1、网络IP地址的分类 组播地址是分类编址的IPv4地址中的D类地址&#xff0c;又叫多播地址&#xff0c;他的前四位必须是1110&#xff0c;所以网络地址的二进制取值范围是11100000~11101111对应的十进制为 224~~239。所以以224~239开头的网络地址都是组播地址。 组播地址的功能…...