【基础6】存储过程的 创建与调用
目录
什么是存储过程
用户自定义存储过程
练习
什么是存储过程
-
什么是存储过程
- 类似于C语言中的函数。
- 用来执行管理任务或应用复杂的业务规则
- 存储过程可以带参数,也可以返回结果
- 存储过程可以包含数据操纵等语句、变量、逻辑控制语句等。(单个select语句、select语句块、select语句与逻辑控制语句)
-
存储过程的优点
- 执行速度更快
- 允许模块化程序设计
- 提高系统安全性
- 减少网络流量
-
存储过程的分类
- 系统存储过程
- 由系统定义,存放在master数据库中。
- 类似c语言中的系统函数
- 系统存储过程的名称都以“SP_ ”开头或“XP_ ”开头
- 用户自定义存储过程
- 由用户在自己的数据库中创建的存储过程
- 类似C语言中的用户自定义函数
- 系统存储过程
-
常用的系统存储过程:XP_cmdshell
--系统存储过程 exec xp_cmdshell 'mkdir D:\bank' ,no_output --加上no_output 只提示命令已完成,不显示 几行受影响,也不显示执行结果 exec xp_cmdshell 'dir D:\bank' --查看文件信息exec sp_helpdb Sales --查看数据库信息 exec sp_databases --查看当前服务器的所有数据库use Sales go exec sp_help Employees --查看Employees表的所有 信息 exec sp_helpconstraint Employees --查看Employees表的所有 约束 exec sp_helpindex Employees --查看Employees表的所有 索引exec sp_helptext V_number --显示未加密的存储过程exec sp_stored_procedures --列出当前库中的所有存储过程
-
可以执行dos命令下的一些操作
-
以文本方式返回任何输出
-
调用语法:
exec xp _ cmdshell DOS命令[no_output] -
在sql 2005中启用扩展存储过程:xp_cmdshell
要在外围配置管理器中启用
-
在sql 2008及以上中启用扩展存储过程:xp_cmdshell
--启用xp_cmdshell USE master EXEC sp_configure 'show advanced options', 1 RECONFIGURE WITH OVERRIDE EXEC sp_configure 'xp_cmdshell', 1 RECONFIGURE WITH OVERRIDE EXEC sp_configure 'show advanced options', 0 RECONFIGURE WITH OVERRIDE --关闭xp_cmdshell USE master EXEC sp_configure 'show advanced options', 1 RECONFIGURE WITH OVERRIDE EXEC sp_configure 'xp_cmdshell', 0 RECONFIGURE WITH OVERRIDE EXEC sp_configure 'show advanced options', 0 RECONFIGURE WITH OVERRIDE
-
用户自定义存储过程
-
用户自定义存储过程
定义存储过程的语法
create proc[edure] 存储过程名@参数1 数据类型@参数2 数据类型=默认值 --有默认值的话才有(=默认值 ),这个是带默认值的输入参数。@参数3 数据类型=默认值 output --默认值后面有output的,这个是带默认值的输出参数········@参数n 数据类型=默认值 output as SQL语句 --可以是学过的任何语句 go无参存储过程的创建,调用存储过程 对存储过程的加密,显示创建存储过程的文本
--创建存储过程:proc_销售额 ,查看每个人的销售情况--这个存储过程是显示所有人的销售额,不需要传参数,所以创建的是无参的存储过程use Salesgoselect * from Employeesselect * from Goodsselect * from Sellif exists (select * from sysobjects where name='proc_销售额') --视图、表、存储过程 都是存储过程,全部的数据库对象:sysobjectsdrop procedure proc_销售额gocreate procedure proc_销售额as --因为是没有参数,所以as前面不用写参数print '各员工的销售情况如下:'select 编号,姓名,销售额=casewhen sum(G.零售价*S.数量) is null then '无销售信息'else cast(sum(G.零售价*S.数量) as char(20))end from Employees E left join Sell S on E.编号=S.售货员工编号 left join Goods G on G.商品编号=S.商品编号 group by E.编号,E.姓名--调用存储过程 execute 简写:exec --在创建存储过程的过程中,已经编译过一次,以后再也不需要进行编译,直接调用就可以 --语法:exec 过程名 [参数] --有参数的话加参数,没有就不用。 exec proc_销售额--查看存储过程创建的文本 exec sp_helptext proc_销售额--修改存储过程文本 为加密 --1、if exists (select * from sysobjects where name='proc_销售额') --视图、表、存储过程 都是存储过程,全部的数据库对象:sysobjectsdrop procedure proc_销售额gocreate procedure proc_销售额--在这里加一个 with encryptionwith encryption --加密存储过程创建的文本as --因为是没有参数,所以as前面不用写参数print '各员工的销售情况如下:'select 编号,姓名,销售额=casewhen sum(G.零售价*S.数量) is null then '无销售信息'else cast(sum(G.零售价*S.数量) as char(20))end from Employees E left join Sell S on E.编号=S.售货员工编号 left join Goods G on G.商品编号=S.商品编号 group by E.编号,E.姓名--2、取消对文本的加密,创建存储过程的文本中,create 改成 alter 然后把加密的那行文本注释/删除 alter procedure proc_销售额 --with encryption --加密存储过程创建的文本 as --因为是没有参数,所以as前面不用写参数 print '各员工的销售情况如下:' select 编号,姓名,销售额=casewhen sum(G.零售价*S.数量) is null then '无销售信息'else cast(sum(G.零售价*S.数量) as char(20))end from Employees E left join Sell S on E.编号=S.售货员工编号 left join Goods G on G.商品编号=S.商品编号 group by E.编号,E.姓名 -
输入过程的参数分为两种:
- 输入参数:往里面传值,
- 输出参数 :调用完成后,传出一个结果值,这个值可以进一步使用
--输入参数的存储过程 if exists (select * from sysobjects where name='proc_销售额') drop procedure proc_销售额 go create procedure proc_销售额 @EmployeesID int as set nocount on print '编号为'+cast(@EmployeesID as char(4))+'的员工销售情况如下:' select 编号,姓名,销售额=casewhen sum(G.零售价*S.数量) is null then '无销售信息'else cast(sum(G.零售价*S.数量) as char(20))end from Employees E left join Sell S on E.编号=S.售货员工编号 left join Goods G on G.商品编号=S.商品编号 where 编号=@EmployeesID group by E.编号,E.姓名 go--调用输入参数的存储过程 如果有多个输入参数,那么调用时,要与创建时的参数一一对应 exec proc_销售额 '1301' --另一种调用:按名称调用,与参数位置无关 exec proc_销售额 @EmployeesID='1301'--带输入参数的默认值的存储过程 if exists (select * from sysobjects where name='proc_销售额') drop procedure proc_销售额 go create procedure proc_销售额 @EmployeesID int='1301' as set nocount on print '编号为'+cast(@EmployeesID as char(4))+'的员工销售情况如下:' select 编号,姓名,销售额=casewhen sum(G.零售价*S.数量) is null then '无销售信息'else cast(sum(G.零售价*S.数量) as char(20))end from Employees E left join Sell S on E.编号=S.售货员工编号 left join Goods G on G.商品编号=S.商品编号 where 编号=@EmployeesID group by E.编号,E.姓名 go--调用有输入参数的存储过程 exec proc_销售额 --使用默认值 exec proc_销售额 '1302' --不使用默认值--多个参数只有一个默认值调用时 --按位置 这个默认值一般放在最后,调用时只用写不是默认值的,最后的默认值省略不写,就是调用的默认值。 --按名称 如要使用默认值,则默认值不用写,其他按名称调用即可 -
带输出参数的存储过程的创建
如果希望调用存储过程后,返回了一个或多个值,这时就需要使用输出函数了。
--输出参数的存储过程 --根据销售额判断是什么员工 if exists (select * from sysobjects where name='proc_销售额') drop procedure proc_销售额 go create proc proc_销售额 @EmployeesID int='1301', @sellsum money output as set nocount on print '编号为'+cast(@EmployeesID as char(4))+'的员工销售情况如下:' select 编号,姓名,销售额=casewhen sum(G.零售价*S.数量) is null then '无销售信息'else cast(sum(G.零售价*S.数量) as char(20))end from Employees E left join Sell S on E.编号=S.售货员工编号 left join Goods G on G.商品编号=S.商品编号 where 编号=@EmployeesID group by E.编号,E.姓名 if @EmployeesID in (select 售货员工编号 from Sell)select @sellsum=sum(零售价*S.数量) from Goods G , Sell S where G.商品编号=S.商品编号 and 售货员工编号=@EmployeesID elseset @sellsum=0 go--调用有输出参数的存储过程 --调用时,要再定义一个变量接收输出值(类型要与输出值对应),且调用时变量后要+output declare @a money exec proc_销售额 '1302' ,@a output if @a>=30000print '优秀员工' else if @a>=10000print '合格员工' else print '无销售员工'--按名称调用 declare @a money exec proc_销售额 @EmployeesID='1302' ,@sellsum=@a output if @a>=30000print '优秀员工' else if @a>=10000print '合格员工' else print '无销售员工'--使用默认值 declare @a money exec proc_销售额 @sellsum=@a output if @a>=30000print '优秀员工' else if @a>=10000print '合格员工' else print '无销售员工' -
- 可以使用print语句显示错误信息,但是这些信息是临时的,只能显示给用户
- raiserror 显示用户定义的错误信息时:可指定严重级别,设置系统变量@@error ,记录发生的错误等
-
返回值
调用时要专门定义一个变量返回这个值,然后用输出语句输出
总结:
- 存储过程是一组预编译的SQL语句,它可以包含数据操纵语句、变量、逻辑控制语句等。
- 存储过程允许带参数,参数分为:输入参数 / 输出参数
- 其中,输入参数可以有默认值
- 输入参数:可以在调用时向存储过程传递参数,此类参数可用来向存储过程中传入值
- 输出参数从存储过程中返回(输出)值,后面跟output关键字
- raiserror语句用来向用户报告错误
练习
use XK
goselect * from Student
select * from StuCou
select * from Course
select * from Class--1、在Xk数据库中,创建存储过程proc_学生选课情况1,完成如下功能。
--查询学生的选课信息(要求显示学号、姓名,课程名,志愿号)(1)对存储过程进行加密(2)调用存储过程if exists (select * from sysobjects where name='proc_学生选课情况1')
drop procedure proc_学生选课情况1
go
create procedure proc_学生选课情况1with encryptionasset nocount on print '学生选课信息如下:'select S.StuNo 学号,StuName 姓名,CouName 课程名,WillOrder 志愿号 from Student S ,StuCou SC ,Course C where S.StuNo=SC.StuNo and SC.CouNo=C.CouNo
go--调用
exec proc_学生选课情况1--2、在Xk数据库中,创建存储过程proc_学生选课情况2,完成如下功能。
--(1)查询给定学号的学生选课情况(要求显示学号、姓名,课程名,志愿号);
--(2)存储过程带1个输入参数,表示学号;
--(3)执行存储过程完成指定学号'00000001' , '00000025', '000000001'的选课信息查询if exists (select * from sysobjects where name='proc_学生选课情况2')
drop procedure proc_学生选课情况2
go
create procedure proc_学生选课情况2
@StuID nvarchar(8) --这里的类型一定要与StuNo相匹配
as
set nocount on
if @StuId in (select StuNo from StuCou)beginprint '该学生选课信息如下:'select S.StuNo 学号,StuName 姓名,CouName 课程名,WillOrder 志愿号 from Student S ,StuCou SC ,Course C where S.StuNo=SC.StuNo and SC.CouNo=C.CouNo and S.StuNo=@StuIDend
else if @StuId in (select StuNo from Student)print '该学生无选课信息!'
elseprint '无此人,请重新输入'
go--调用
exec proc_学生选课情况2 '00000001'
exec proc_学生选课情况2 '00000025'
exec proc_学生选课情况2 '000000001' --3、在Xk数据库中,创建存储过程proc_学生选课情况3,完成如下功能。
--(1)查询指定学号的学生的选课情况(要求显示学号、姓名、课程名称,志愿号)。
--(2)存储过程带2个参数,输入参数表示学号,输出参数用于返回每个学生的选课门数。
--(3)完成指定学号的选课情况查询,选过课程的,存储过程返回1; 若没有选过课程的则给出提示“该学生没有选过程课程!”,存储过程返回0。
--(4)选课门数等于5门,显示“已经达到选课要求!”;选课门数大于等于4门,显示“请继续选课,还差1门达到选课要求!”;选课门数等于3门,显示“请继续选课,还差2门达到选课要求!”;选课门数等于2门,显示“请继续选课,还差3门达到选课要求!”;选课门数等于1门,显示“请继续选课,还差4门达到选课要求!”
--(5)对创建存储过程的文本进行加密。
--(6)分别以'00000001' , '00000005', '00000025', '000000001'学号进行存储过程调用的测试。(执行结果如下图所示)if exists (select * from sysobjects where name='proc_学生选课情况3')
drop procedure proc_学生选课情况3
go
create procedure proc_学生选课情况3
@StuID nvarchar(8) ,
@Choosesum int output
with encryption
as
set nocount on
if @StuId in (select StuNo from StuCou)beginprint '该学生选课信息如下:'select S.StuNo,StuName,CouName,WillOrder from Student S ,StuCou SC ,Course C where S.StuNo=SC.StuNo and SC.CouNo=C.CouNo and S.StuNo=@StuIDselect @Choosesum=count(StuName) from ( select S.StuNo,StuName,CouName,WillOrder from Student S ,StuCou SC ,Course C where S.StuNo=SC.StuNo and SC.CouNo=C.CouNo and S.StuNo=@StuID) xuanke print '该学生选课门数:'+cast(@Choosesum as char(4))if @Choosesum=5print '已达到选课计划要求'else if @Choosesum=4print '请继续选课,还差1门达到选课要求!'else if @Choosesum=3print '请继续选课,还差2门达到选课要求!'else if @Choosesum=2print '请继续选课,还差3门达到选课要求!'elseprint '请继续选课,还差4达到选课要求!'return 1end
else if @StuId in (select StuNo from Student)beginprint '该学生没有选过课程!'return 0end
elseraiserror('非本校学生,请重新输入!',16,1)
go--调用
declare @sum int ,@a int
exec @a=proc_学生选课情况3 '00000001',@sum output
print '返回值:'+cast(@a as char(1))--调用
declare @sum int,@a int
exec @a=proc_学生选课情况3 '00000005',@sum output
print '返回值:'+cast(@a as char(1))--调用
declare @sum int,@a int
exec @a=proc_学生选课情况3 '00000025',@sum output
print '返回值:'+cast(@a as char(1))--调用
declare @sum int,@a int
exec @a=proc_学生选课情况3 '000000001',@sum output
print '返回值:'+cast(@a as char(100))
相关文章:
【基础6】存储过程的 创建与调用
目录 什么是存储过程 用户自定义存储过程 练习 什么是存储过程 什么是存储过程 类似于C语言中的函数。用来执行管理任务或应用复杂的业务规则存储过程可以带参数,也可以返回结果存储过程可以包含数据操纵等语句、变量、逻辑控制语句等。(单个select语…...
如何快速实现接口自动化测试,常规接口断言封装实践
目录 前言: 一、框架设计思路 1. 封装请求方法 2. 断言封装 3. 接口封装 4. 接口统一管理 二、框架使用 三、总结 前言: 在当今互联网行业中,接口自动化测试已经成为了非常重要的测试手段之一。而在这个过程中,接口自动化…...
java+nodejs+vue+python+php家教信息管理系统
任何网友都可以自由地查看、搜索、发布该家教信息平台的信息。该平台是区别于传统的家教中介的服务平台。学生可以免费查看网站上的家教信息,挑选适合自己的家教;教师可以免费查看网站上的需求信息,挑选适合自己的学生;学生可以发…...
课程分享:鸿蒙HarmonyOS系统及物联网开发实战课程(附课程视频及源码下载)
课程名称: 鸿蒙HarmonyOS系统及物联网开发实战课程 课程介绍: HarmonyOS 是一款面向万物互联时代的、全新的分布式操作系统。在传统的单设备系统能力基础上,HarmonyOS 提出了基于同一套系统能力、适配多种终端形态的分布式理念,…...
【数据结构】线性表之栈、队列
前言 前面两篇文章讲述了关于线性表中的顺序表与链表,这篇文章继续讲述线性表中的栈和队列。 这里讲述的两种线性表与前面的线性表不同,只允许在一端入数据,一段出数据,详细内容请看下面的文章。 顺序表与链表两篇文章的链接&…...
StringUtils.substring\[XX]()字符串截取方法总结
StringUtils.substring[XX]()字符串截取方法总结 StringUtils (Apache Commons Lang 3.12.0 API) 文章目录 StringUtils.substring\[XX]()字符串截取方法总结导入依赖方法介绍substring(String str, int start)substring(String str, int start, int end)substringAfter(String…...
SeaweedFs使用-通过http接口实现文件操作
通过http接口实现文件操作 SeaweedFs可通过filer的http接口/master中的http接口来进行文件上传 1.通过master的接口进行上传文件 通过各种方式进行请求接口:http://localhost:9333/submit, ip和端口号是master服务的信息。此接口通过post请求方式将文件的二进制流…...
成绩管理系统
系列文章 任务28 成绩管理系统 文章目录 系列文章一、实践目的与要求1、目的2、要求 二、课题任务三、总体设计1.存储结构及数据类型定义2.程序结构3.所实现的功能函数4、程序流程图 四、小组成员及分工五、 测试读入数据浏览全部信息增加学生信息保存数据删除学生信息修改学生…...
【MYSQL】事务的4大属性,对隔离级别的详细讲解
目录 1.原子性和持久性 1.1.手动提交事务 1.2.自动提交事务 1.3.事务的原理: 2.隔离性 1.读未提交(Read Uncommitted) 2.读提交(Read Committed) 3.可重复读 4.串行化 3.一致性 4.理解读提交和可重复读的实现…...
如何在宝塔面板后的阿里云服务器运行Flask项目并公网可以访问?
在你的服务器安装宝塔面板 宝塔面板是服务器运维管理系统 使用宝塔前: 手工输入命令安装各类软件,操作起来费时费力并且容易出错,而且需要记住很多Linux的命令,非常复杂。 使用宝塔后: 2分钟装好面板,一键…...
HTTP(九)-- response对象 -- 向页面响应数据
目录 1. 服务器输出字符数据到浏览器 1.1 获取字符输出流 1.2 实例演示:...
音视频windows安装ffmpeg6.0并使用vs调试源码笔记
建立在上一步,vs已经能够正常调试qt项目,可以实现: 1:qt可以使用mvsc (使用cdb)进行调试。 2:vs已经可以加载qt项目,借助vs进行调试。 本文目标:编译ffmpeg库…...
Midjourney|文心一格prompt教程[进阶篇]:Midjourney Prompt 高级参数、各版本差异、官方提供常见问题
Midjourney|文心一格prompt教程[进阶篇]:Midjourney Prompt 高级参数、各版本差异、官方提供常见问题 1.Midjourney Prompt 高级参数 Quality 图片质量是另一个我比较常用的属性,首先需要注意这个参数并不影响分辨率,并不改变分辨率&#x…...
什么是Java虚拟机(JVM)?
Java虚拟机(Java Virtual Machine,JVM)是Java平台的关键组成部分之一。它是一种虚拟的计算机,可以在计算机上运行Java字节码(即编译后的Java程序)。 JVM具有以下主要功能: 字节码执行ÿ…...
【HISI IC萌新虚拟项目】Package Process Unit模块整体方案·PART3
5. 模块方案说明 5.1CRG 模块方案说明 5.1.1简介 CRG 模块实现复位信号的滤抖功能,可滤除小于100ns的低电平复位毛刺,并对复位信号进行同步化处理。同时,对100MHz的输入时钟信号进行2分频,作为 CPU_IF模块和TEST_CORE模块的工作时钟。 5.1.2接口信号 信号位宽I/O描述...
分布式事务常见解决方案
分布式事务常见解决方案 一、事务介绍 事务是一系列的动作,它们综合在一起才是一个完的工作单元,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开始的状态,仿佛什么都没发生过一样。 1、单事务概念…...
061:cesium设置棋盘图材质(material-5)
第061个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置棋盘材质,请参考源代码,了解CheckerboardMaterialProperty的应用。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共89行)相关API参考:专栏目标…...
【AI Earth试玩】权限配置与openAPI调用工具库
前言 AI earth是阿里达摩院出的遥感云计算平台,我简单体验下来感觉像是GEE的python版本遥感深度学习计算平台,整体体验还是挺不错的,尤其是多分类的结果还是挺惊艳的。 平台提供工具箱和notebook两种模式,工具箱整个交互简单易用…...
Tomcat安装与使用
Tomcat 是HTTP服务器,用于使用HTTP协议。 1、下载Tomcat 下载链接:https://tomcat.apache.org/ 进入官网后,根据自己想要下载的版本进行下载,我这里选择下载的版本是Tomcat 8. 点击选择自己想要下载的对应版本,下载Z…...
大数据课程-学习二十四周总结
6.Hive函数 Hive的函数分为三类: 聚合函数、内置函数,表生成函数,聚合函数之前已经学习过了,接下来学习内置函数和表生成函数. 6.1.Hive的内置函数 6.1.1.数学函数 6.1.1.1. 取整函数: round 语法: round(double a) 返回值: BIG…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
