PL/SQL 异常处理
目录
一、命名的系统异常
1.常见命名的系统异常
2.预定义的系统异常数量以及描述
3.处理命名的系统异常的一般步骤
二、程序员定义的异常
1.概念
2.自定义异常的定义与抛出
3.自定义异常的处理
三、未命名的系统异常
1.概述
2.处理未命名的系统异常的方法
3.使用场景
四、未命名的程序员自定义的异常
1.概述
2.作用
3. 使用方法及示例
未命名的程序员自定义异常与程序员定义异常的区别
1.声明与抛出
2.错误代码和信息
3.使用场景
引言
在设计PL/SQL程序时,经常会发生这样或者那样的错误,异常处理就是针对错误进行处理的程序段,Oracle中的异常处理分为系统预定义异常处理和自定义异常处理两部分。
异常的类型大概分为四类:
1.命名的系统异常
2.程序员定义的异常
3.未命名的系统异常
4.未命名的程序员定义的异常
一、命名的系统异常
命名的系统异常是Oracle数据库为了处理常见的错误情况而预定的一组异常。它们由Oracle数据库在特定条件下自动抛出,开发者就可以在PL/SQL程序中通过异常机制来捕获和处理这些异常。
1.常见命名的系统异常
NO_DATA_FOUND
错误代码:ORA-01403
错误描述:当执行SELECT INTO语句时,如果没有返回任何数据,就会抛出此异常。
示例:
DECLAREv_name varchar(10);
BEGINSELECT s_name INTO v_name from Students WHERE s_id = '001';
EXCEPTIONWHEN NOT_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('未找到编号为001的学生');
END;
TOO_MANY_ROWS
错误代码:ORA-01422
描述:当执行SELECT INTO语句时,如果返回多行,则会抛出异常。
示例:
DECLAREv_name varchar(10);
BEGINSELECT s_name INTO v_name from Students WHERE s_id = '001';
EXCEPTIONWHEN TOO_MANY_ROWS THENDBMS_OUTPUT.PUT_LINE('有多个编号为001的学生');
END;
2.预定义的系统异常数量以及描述
数量:大约24种。
异常名称 | 异常编号(SQLCODE) | 描述 |
---|---|---|
ACCESS_INTO_NULL | -6530 | 尝试为未初始化的对象属性赋值时触发。 |
CASE_NOT_FOUND | -6592 | CASE语句中没有匹配的WHEN子句且没有设置ELSE子句时触发。 |
COLLECTION_IS_NULL | -6531 | 尝试使用未初始化的集合元素时触发。 |
CURSOR_ALREADY_OPEN | -6511 | 尝试打开一个已经打开的游标时触发。 |
DUP_VAL_ON_INDEX | -1 | 尝试插入或更新数据时,唯一索引对应的列上有重复的值时触发。 |
INVALID_CURSOR | -1001 | 尝试使用无效的游标时触发。 |
INVALID_NUMBER | -1722 | 尝试将字符转换为数字失败时触发。 |
LOGIN_DENIED | -1017 | 尝试使用无效的用户名或密码登录Oracle数据库时触发。 |
NO_DATA_FOUND | -1403 | SELECT INTO语句未返回任何数据时触发。 |
NOT_LOGGED_ON | -1012 | 尝试在未登录的情况下访问Oracle数据库时触发。 |
PROGRAM_ERROR | -6501 | PL/SQL内部错误,可能需要重装数据字典或PL/SQL系统包时触发。 |
ROWTYPE_MISMATCH | -6504 | 宿主游标变量与PL/SQL游标变量的返回类型不兼容时触发。 |
SELF_IS_NULL | -(无固定编号) | 使用对象类型时,在NULL对象上调用对象方法时触发。 |
STORAGE_ERROR | -6500 | 运行PL/SQL时,超出内存空间或内存被破坏时触发。 |
SUBSCRIPT_BEYOND_COUNT | -6533 | 尝试访问嵌套表或VARRAY时,元素下标超出最大值时触发。 |
SUBSCRIPT_OUTSIDE_LIMIT | -6532 | 使用嵌套表或VARRAY时,元素下标为负数时触发。 |
SYS_INVALID_ID | -1410 | 尝试使用无效的ROWID字符串时触发。 |
TIMEOUT_ON_RESOURCE | -51 | 等待资源时超时触发。 |
TOO_MANY_ROWS | -1422 | SELECT INTO语句返回多行时触发。 |
VALUE_ERROR | -6502 | 赋值时,变量长度不足以容纳实际数据时触发。 |
ZERO_DIVIDE | -1476 | 尝试执行除数为零的除法运算时触发。 |
CURSOR_IS_OPEN | -(非标准,示例) | 尝试在游标已打开的情况下进行非法操作(如重复打开)时触发。 |
COLLECTION_IS_LOCKED | -(非标准,示例) | 尝试访问已锁定的集合元素时触发。 |
INVALID_TRANSACTION | -(非标准,示例) | 尝试执行无效的事务操作时触发。 |
NETWORK_ERROR | -(非标准,示例) | 网络通信错误时触发。 |
说明:
-
异常编号(SQLCODE):Oracle数据库为每种异常分配了一个唯一的错误编号(SQLCODE),用于标识该异常。在异常处理中,可以通过捕获异常编号来判断具体的错误类型。
-
异常名称:Oracle数据库为每种异常提供了一个名称,便于开发人员在代码中引用和处理。
-
描述:简要说明了触发每种异常的条件和场景。
-
非标准异常:上述列表中最后几种异常(如CURSOR_IS_OPEN、COLLECTION_IS_LOCKED、INVALID_TRANSACTION、NETWORK_ERROR)是示例性的,用于说明可能的异常类型,并非Oracle数据库标准预定义的异常。实际开发中,这些异常可能需要开发人员根据业务需求自定义。
-
异常处理:在PL/SQL程序中,可以通过
EXCEPTION
块来捕获和处理这些预定义异常,以确保程序的健壮性和可靠性。
3.处理命名的系统异常的一般步骤
捕获异常:在PL/SQL程序中,使用EXCEPTION
块来捕获可能抛出的命名系统异常。
处理异常:在捕获到异常后,执行相应的处理逻辑,如输出错误信息、记录日志、回滚事务等。
继续执行或者退出程序:根据需求,决定是继续执行后续代码还是退出程序。一旦进EXCEPTION块,后续的代码(指在BEGIN ... END块中EXCEPTION部分之后的代码)将不会被执行。(这过程简直和Java一摸一样)
示例:
DECLAREv_error_occurred BOOLEAN := FALSE;--变量v_error_occurred用于跟踪是否发生了错误,以便在后续代码中采取适当的操作。
BEGIN-- 尝试执行一些可能引发异常的代码BEGIN-- 这里是可能抛出异常的代码RAISE NO_DATA_FOUND; -- 示例异常EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('No data found, continuing with the next step.');v_error_occurred := TRUE; -- 标记错误已发生END;-- 后续的代码,无论是否发生异常都会执行IF v_error_occurred THENDBMS_OUTPUT.PUT_LINE('An error occurred, but we are continuing with the process.');END IF;DBMS_OUTPUT.PUT_LINE('This is the subsequent code that will always be executed.');-- 更多的后续代码...
END;
二、程序员定义的异常
1.概念
自定义异常是程序员根据业务逻辑需求,在PL/SQL程序中显示声明的异常。当程序中出现特定条件时,程序员可以显式地抛出这些自定义异常,并在异常处理部分(EXCEPTION)进行捕获和处理。
2.自定义异常的定义与抛出
定义异常:在块声明部分,使用DECLARE关键字声明异常
DECLAREmy_custom_exception EXCEPTION;
抛出异常:在程序执行部分,使用RAISE语句抛出自定义异常。
BEGINIF condition THENRAISE my_custom_exception;END IF
3.自定义异常的处理
捕获异常:在EXCEPTION块中,使用WHEN...TEHN语句捕获并处理自定义异常。
EXCEPTION WHEN my_custom_exception THENDBMS_OUTPUT.PUT_LINE('自定义异常被触发');--处理异常,记录日志,事务回滚等
END
与其他异常一起处理:在EXCEPTION块中,程序员可以捕获和处理多种异常,包括预定义异常和自定义异常。
EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('未找到数据');WHEN my_custom_exception THENDBMS_OUTPUT.PUT_LINE('自定义异常被触发');WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('发生其他异常: ' || SQLERRM);
OTHERS
子句用于捕获和处理所有未显式捕获的异常。
三、未命名的系统异常
在PL/SQL中,未命名的系统异常是指那些由Oracle数据库系统内部产生的、没有预定义异常名称的错误。这些异常通常以错误代码(Oracle错误号)的形式出现,而没有与之直接对应的异常名。为了处理这些未命名的系统异常,PL/SQL提供了相应的机制和语法。
1.概述
未命名的系统异常通常是由于违反Oracle数据库的内部规则或系统限制而产生的。这些异常没有预定义的异常名称,但Oracle数据库为每个异常分配了一个唯一的错误代码(Oracle错误号)。例如,当尝试删除一个具有子记录的父表记录时,Oracle会抛出错误代码为-2292
的未命名系统异常。
2.处理未命名的系统异常的方法
声明异常名称:使用EXCEPTION关键字声明一个自定义的异常名称。
DECLAREchild_record_exception EXCEPTION
将异常名称与错误代码关联:使用PRAGMA EXCEPTION_INT伪指令将自定义的异常名称与未命名的系统异常的错误代码关联起来。
PRAGMA EXCEPTION_INIT(child_record_exception, -2292);
在异常处理部分捕获异常:
在PL/SQL块的异常处理部分,使用WHEN
关键字捕获自定义的异常名称,并执行相应的处理逻辑。
BEGIN-- 执行可能导致异常的操作,例如删除具有子记录的父表记录DELETE FROM parent_table WHERE id = 1;
EXCEPTIONWHEN child_record_exception THENDBMS_OUTPUT.PUT_LINE('无法删除父记录,因为存在子记录。');
END;
完整示例
DECLAREchild_record_exception EXCEPTION;PRAGMA EXCEPTION_INIT(child_record_exception, -2292);
BEGIN-- 尝试删除一个具有子记录的父表记录DELETE FROM departments WHERE department_id = 10;
EXCEPTIONWHEN child_record_exception THENDBMS_OUTPUT.PUT_LINE('无法删除父记录,因为存在子记录。');WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('发生其他异常:' || SQLERRM);
END;
3.使用场景
-
处理特定的系统错误:Oracle数据库在运行时会产生各种系统错误,这些错误通常以错误代码的形式出现,而没有与之直接对应的异常名。例如,当尝试删除一个具有子记录的父表记录时,Oracle会抛出错误代码为
-2292
的系统错误。为了处理这种特定的系统错误,可以使用未命名的系统异常。 -
增强代码的可读性和可维护性:通过为未命名的系统异常定义一个明确的异常名称,并使用
PRAGMA EXCEPTION_INIT
伪指令将其与错误代码关联起来,可以使代码更加清晰易懂。这样,在异常处理部分,就可以直接使用自定义的异常名称,而不需要记住复杂的错误代码。 - 实现更细粒度的异常处理:在PL/SQL中,可以使用
WHEN OTHERS
子句来捕获所有未捕获的异常。然而,这种方式过于笼统,可能无法准确地定位问题。通过为特定的系统错误定义未命名的系统异常,可以实现更细粒度的异常处理,从而更好地定位问题并采取适当的解决措施。
四、未命名的程序员自定义的异常
1.概述
RAISE_APPLICATION_ERROR
在 Oracle PL/SQL 中用于引发用户自定义的异常。它主要用于在应用程序中主动抛出自定义的错误代码和错误消息,以便更好地处理异常情RAISE_APPLICATION_ERROR
引发的是用户自定义的异常。 这种异常不是由 Oracle 系统自动抛出的,而是由开发人员根据业务需求,在 PL/SQL 代码中显式抛出的。
2.作用
提供详细的错误信息:RAISE_APPLICATION_ERROR
允许开发人员自定义错误代码和错误消息。这样,当异常被抛出时,调用程序可以接收到更详细、更有意义的错误信息,而不是仅仅依赖于 Oracle 的标准错误消息。
增强错误处理灵活性:通过引发自定义异常,开发人员可以更灵活地控制错误处理流程。例如,可以在不同的业务逻辑分支中抛出不同的异常,以便调用程序根据异常类型采取相应的处理措施。
提高程序的可维护性:使用 RAISE_APPLICATION_ERROR
可以将错误处理逻辑与业务逻辑分离,使得程序更加清晰易读。同时,自定义的异常处理机制也便于后续的代码维护和升级。
3. 使用方法及示例
基本语法
RAISE_APPLICATION_ERROR(error_number,error_message [, kee_error]);
-
error_number:自定义的错误代码,必须是一个介于 -20000 和 -20999 之间的整数。这个范围内的错误代码不会与 Oracle 的保留错误代码冲突。
-
error_message:自定义的错误消息,是一个字符串。该消息的长度不应超过 2048 个字符。它将被传递给调用程序,以便调用程序了解异常的具体原因。
-
keep_errors(可选):这是一个布尔值参数,用于指示是否将当前的错误堆栈信息包含在异常中。在 Oracle 12c 及更高版本中引入。如果设置为
FALSE
(默认值),则当前的错误信息会替换已有的错误堆栈。如果设置为TRUE
,则当前的错误信息会被添加到已有的错误堆栈中。
使用示例
假设我们有一个存储过程,用于检查员工的薪水是否低于某个最低值。如果薪水低于最低值,则使用 RAISE_APPLICATION_ERROR
抛出异常:
CREATE OR REPLACE PROCEDURE check_salary (p_emp_id IN NUMBER, p_min_salary IN NUMBER) ISv_salary NUMBER;
BEGIN-- 查询员工薪水SELECT salary INTO v_salary FROM employees WHERE employee_id = p_emp_id;-- 检查薪水是否低于最低值IF v_salary < p_min_salary THEN-- 抛出自定义异常RAISE_APPLICATION_ERROR(-20001, 'Employee salary is below the minimum required.');END IF;EXCEPTIONWHEN NO_DATA_FOUND THEN-- 处理未找到员工数据的情况RAISE_APPLICATION_ERROR(-20002, 'Employee ID not found.');
END;
未命名的程序员自定义异常与程序员定义异常的区别
1.声明与抛出
- 自定义异常需要先声明,然后才能抛出。声明是在 PL/SQL 块的声明部分进行的,而抛出是在执行部分进行的。
RAISE_APPLICATION_ERROR
则不需要事先声明异常,它直接在执行部分抛出自定义的错误代码和消息。
2.错误代码和信息
- 自定义异常本身不包含错误代码和消息,这些需要在抛出异常时通过其他方式(如注释或文档)进行说明。
RAISE_APPLICATION_ERROR
则直接包含了错误代码和消息,使得异常信息更加完整和直观。
3.使用场景
- 自定义异常更适合用于处理那些与 Oracle 系统错误无关的业务逻辑错误,例如数据验证失败、业务规则违反等。
RAISE_APPLICATION_ERROR
则更适合用于处理那些需要自定义错误代码和消息的异常情况,例如当应用程序需要向用户显示特定的错误消息时。
相关文章:
PL/SQL 异常处理
目录 一、命名的系统异常 1.常见命名的系统异常 2.预定义的系统异常数量以及描述 3.处理命名的系统异常的一般步骤 二、程序员定义的异常 1.概念 2.自定义异常的定义与抛出 3.自定义异常的处理 三、未命名的系统异常 1.概述 2.处理未命名的系统异常的方法 3.使用场景 …...
【自学笔记】Spring Boot框架技术基础知识点总览-持续更新
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 Spring Boot框架技术基础知识点总览一、Spring Boot简介1.1 什么是Spring Boot?1.2 Spring Boot的主要特性 二、Spring Boot快速入门2.1 搭建Spring Boo…...
Redis 缓存穿透、击穿、雪崩:问题与解决方案
在使用 Redis 作为缓存中间件时,系统可能会面临一些常见的问题,如 缓存穿透、缓存击穿 和 缓存雪崩。这些问题如果不加以解决,可能会导致数据库压力过大、系统响应变慢甚至崩溃。本文将详细分析这三种问题的起因,并提供有效的解决…...
第一个CMAKE项目hello cmake
#注意! 这篇文章是为WINDWOS用户写的 #请检查你的电脑上已经安装了MINGW和CMAKE 快速检查方法如下 C:\Users\Basicoperation>g --version g (x86_64-win32-seh-rev1, Built by MinGW-Builds project) 14.2.0 Copyright (C) 2024 Free Software Foundation, Inc. …...

骶骨神经
骶骨肿瘤手术后遗症是什么_39健康网_癌症 [健康之路]匠心仁术(七) 勇闯禁区 骶骨肿瘤切除术...

基于Django的购物商城平台的设计与实现(源码+lw+部署文档+讲解),源码可白嫖!
摘要 当今社会进入了科技进步、经济社会快速发展的新时代。国际信息和学术交流也不断加强,计算机技术对经济社会发展和人民生活改善的影响也日益突出,人类的生存和思考方式也产生了变化。传统购物管理采取了人工的管理方法,但这种管理方法存…...

使用快捷键高效管理 VSCode:提升工作效率,告别鼠标操作
如果你想提高工作效率,减少鼠标操作,掌握键盘快捷键是一个非常有效的方式。在编程过程中,熟练使用快捷键能够快速管理文件、标签页,节省时间并提升效率。比如,Ctrl P 和 Ctrl W 可以快速打开和关闭文件,而…...
【找工作】C++和算法复习(自用)
文章目录 C头文件自定义排序函数stl 算法数据结构树状数组 数学 自用随便记录 C 排序 stl 头文件 全能头文件: #include<bits/stdc.h>自定义排序函数 bool compare(const int &odd1,const int &odd2) {return odd1>odd2; }stl 枚举map map&…...
大语言模型基础
简介 AI大模型是“人工智能预训练大模型”的简称,包含了“预训练”和“大模型”两层含义,二者结合产生了一种新的人工智能模式,即模型在大规模数据集上完成了预训练后无需微调,或仅需要少量数据的微调,就能直接支撑各类应用。AI大模型主要分为三类:大语言模型、CV大模型…...
深入浅出机器学习:概念、算法与实践
目录 引言 机器学习的基本概念 什么是机器学习 机器学习的基本要素 机器学习的主要类型 监督学习(Supervised Learning) 无监督学习(Unsupervised Learning) 强化学习(Reinforcement Learning) 机器…...

2024年国赛高教杯数学建模A题板凳龙闹元宵解题全过程文档及程序
2024年国赛高教杯数学建模 A题 板凳龙闹元宵 原题再现 “板凳龙”,又称“盘龙”,是浙闽地区的传统地方民俗文化活动。人们将少则几十条,多则上百条的板凳首尾相连,形成蜿蜒曲折的板凳龙。盘龙时,龙头在前领头&#x…...

老游戏回顾:d2
游戏中玩家创建属于自己的角色,在一片片暗黑大地上奔跑、杀敌、寻宝、成长,最终打败统治各个大陆的黑暗势力,拯救游戏中的各个种族。 《暗黑破坏神II》的制作团队包括编程小组、运动物体制作小组和背景制作小组。游戏设计很大程度上是开放的&…...

【深度学习】Pytorch的深入理解和研究
一、Pytorch核心理解 PyTorch 是一个灵活且强大的深度学习框架,广泛应用于研究和工业领域。要深入理解和研究 PyTorch,需要从其核心概念、底层机制以及高级功能入手。以下是对 PyTorch 的深入理解与研究的详细说明。 1. 概念 动态计算图(D…...
什么是 Vue 的自定义事件?如何触发和监听?
Vue 的自定义事件详解 什么是自定义事件? 在 Vue 中,自定义事件是组件之间通信的重要机制。自定义事件允许子组件向父组件发送消息,通常用于处理用户交互或异步操作的结果。这种机制使得组件间的通信更加灵活和解耦。 自定义事件的基本概念…...

windows上vscode cmake工程搭建
安装vscode插件: 1.按装fastc(主要是安装MinGW\mingw64比较方便) 2.安装C,cmake,cmake tools插件 3.准备工作完成之后,按F1,选择cmake:Quick Start就可以创建一个cmake工程。 4.设置Cmake: G…...
DEMF模型赋能多模态图像融合,助力肺癌高效分类
目录 论文创新点 实验设计 1. 可视化的研究设计 2. 样本选取和数据处理 3. 集成分类模型 4. 实验结果 5. 可视化结果 图表总结 可视化知识图谱 在肺癌早期筛查中,计算机断层扫描(CT)和正电子发射断层扫描(PET)作为两种关键的影像学手段,分别提供了丰富的解剖结构…...
Android:权限permission申请示例代码
Android应用项目每次最开始都要进行权限申请,贴一下权限申请的示例代码,方便后续Ctrl CV使用 1.AndroidManifest.xml 配置要申请的权限 <uses-permission android:name"android.permission.READ_CONTACTS" /> <uses-permission and…...

AI Agent Service Toolkit:一站式大模型智能体开发套件
项目简介 该工具包基于LangGraph、FastAPI和Streamlit构建,提供了构建和运行大模型Agent的最小原子能力,包含LangGraph代理、FastAPI服务、用于与服务交互的客户端以及一个使用客户端提供聊天界面的Streamlit应用。用户可以利用该工具包提供的模板快速搭建基于LangGraph框架…...

大数据SQL调优专题——Hive执行原理
引入 Apache Hive 是基于Hadoop的数据仓库工具,它可以使用SQL来读取、写入和管理存在分布式文件系统中的海量数据。在Hive中,HQL默认转换成MapReduce程序运行到Yarn集群中,大大降低了非Java开发者数据分析的门槛,并且Hive提供命令…...
Python程序打包 |《Python基础教程》第18章笔记
《Python基础教程》第1章笔记👉https://blog.csdn.net/holeer/article/details/143052930 第18章 程序打包 程序可以发布后,你可能想先将它打包。如果程序只包含一个.py文件,这可能不是问题。然而,如果用户不是程序员࿰…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...