MySQL流程控制(二十八)

二八佳人体似酥,腰悬利剑斩愚夫,虽然不见人头落,暗里教君骨髓枯。

上一章简单介绍了MySQL变量(二十七) ,如果没有看过,请观看上一章

一. 定义条件与处理程序

定义条件是事先定义程序执行过程中可能遇到的问题,处理程序定义了在遇到问题时应当采取的处理方式,并且保证存储过程或函数在遇到警告或错误时能继续执行。这样可以增强存储程序处理问题的能力,避免程序异常停止运行。

说明:定义条件和处理程序在存储过程、存储函数中都是支持的。

一.一 存储过程报错便退出

创建一个存储过程,刚开始报错 user 表里面没有 email 字段

DELIMITER //

CREATE PROCEDURE UpdateDataNoCondition()
	BEGIN
		SET @x = 1;
		UPDATE user SET email = NULL WHERE id = '1';
		SET @x = 2;
		UPDATE user SET name = 'yjl' WHERE id = '1';
		SET @x = 3;
	END //

DELIMITER ;

调用存储过程:

--  1054 Unknown column 'email' in 'field list' 
call UpdateDataNoCondition();

-- 为1 
select @x;

可以看到,此时@x变量的值为1。结合创建存储过程的SQL语句代码可以得出:在存储过程中未定义条件和处理程序,

且当存储过程中执行的SQL语句报错时,MySQL数据库会抛出错误,并退出当前SQL逻辑,不再向下继续执行。

一.二 定义条件

定义条件就是给MySQL中的错误码命名,这有助于存储的程序代码更清晰。它将一个错误名字指定的错误条件关联起来。这个名字可以随后被用在定义处理程序的DECLARE HANDLER语句中。

定义条件使用DECLARE语句,语法格式如下:

DECLARE 错误名称 CONDITION FOR 错误码(或错误条件)

错误码的说明:

  • MySQL_error_codesqlstate_value都可以表示MySQL的错误。
    • MySQL_error_code是数值类型错误代码。
    • sqlstate_value是长度为5的字符串类型错误代码。
  • 例如,在ERROR 1418 (HY000)中,1418是MySQL_error_code,'HY000’是sqlstate_value。
  • 例如,在ERROR 1142(42000)中,1142是MySQL_error_code,'42000’是sqlstate_value。

**举例1:**定义“Field_Not_Be_NULL”错误名与MySQL中违反非空约束的错误类型是“ERROR 1048 (23000)”对应。

#使用MySQL_error_code
DECLARE Field_Not_Be_NULL CONDITION FOR 1048;

#使用sqlstate_value
DECLARE Field_Not_Be_NULL CONDITION FOR SQLSTATE '23000';

**举例2:**定义"ERROR 1148(42000)"错误,名称为command_not_allowed。

#使用MySQL_error_code
DECLARE command_not_allowed CONDITION FOR 1148;

#使用sqlstate_value
DECLARE command_not_allowed CONDITION FOR SQLSTATE '42000';

一.三 定义处理程序

可以为SQL执行过程中发生的某种类型的错误定义特殊的处理程序。定义处理程序时,使用DECLARE语句的语法如下:

DECLARE 处理方式 HANDLER FOR 错误类型 处理语句

  • 处理方式:处理方式有3个取值:CONTINUE、EXIT、UNDO。
    • CONTINUE:表示遇到错误不处理,继续执行。
    • EXIT:表示遇到错误马上退出。
    • UNDO:表示遇到错误后撤回之前的操作。MySQL中暂时不支持这样的操作。
  • 错误类型(即条件)可以有如下取值:
    • SQLSTATE '字符串错误码':表示长度为5的sqlstate_value类型的错误代码;
    • MySQL_error_code:匹配数值类型错误代码;
    • 错误名称:表示DECLARE … CONDITION定义的错误条件名称。
    • SQLWARNING:匹配所有以01开头的SQLSTATE错误代码;
    • NOT FOUND:匹配所有以02开头的SQLSTATE错误代码;
    • SQLEXCEPTION:匹配所有没有被SQLWARNING或NOT FOUND捕获的SQLSTATE错误代码;
  • 处理语句:如果出现上述条件之一,则采用对应的处理方式,并执行指定的处理语句。语句可以是像“SET 变量 = 值”这样的简单语句,也可以是使用BEGIN ... END编写的复合语句。

定义处理程序的几种方式,代码如下:

#方法1:捕获sqlstate_value
DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SET @info = 'NO_SUCH_TABLE';

#方法2:捕获mysql_error_value
DECLARE CONTINUE HANDLER FOR 1146 SET @info = 'NO_SUCH_TABLE';

#方法3:先定义条件,再调用
DECLARE no_such_table CONDITION FOR 1146;
DECLARE CONTINUE HANDLER FOR NO_SUCH_TABLE SET @info = 'NO_SUCH_TABLE';

#方法4:使用SQLWARNING
DECLARE EXIT HANDLER FOR SQLWARNING SET @info = 'ERROR';

#方法5:使用NOT FOUND
DECLARE EXIT HANDLER FOR NOT FOUND SET @info = 'NO_SUCH_TABLE';

#方法6:使用SQLEXCEPTION
DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @info = 'ERROR';

一.四 定义条件和定义程序整合

一.四.一 对错误码进行处理程序

在存储过程中,定义处理程序,捕获sqlstate_value值,当遇到MySQL_error_code值为1048时,执行CONTINUE操作,并且将@proc_value的值设置为-1。

DELIMITER //

CREATE PROCEDURE UpdateDataNoCondition2()
	BEGIN
	 #定义处理程序
		DECLARE CONTINUE HANDLER FOR 1054 SET @proc_value = -1;
		
		SET @x = 1;
		UPDATE user SET email = NULL WHERE id = '1';
		SET @x = 2;
		UPDATE user SET name = 'yjl' WHERE id = '1';
		SET @x = 3;
	END //

DELIMITER ;

进行调用存储过程:

--  变  OK 了, 之前错误码是 1054
call UpdateDataNoCondition2();

-- 3   -1 
select @x,@proc_value;

一.四.二 对异常值进行处理信息

给用户表 user 添加 name 的唯一约束

ALTER TABLE user ADD CONSTRAINT uk_user_1 UNIQUE(name);

插入一条数据, 执行两次时,第二次就会报错, key 为 1062

insert into user(name,sex,age) values('岳泽霖','男',18);

image-20230807174723162

定义存储过程,创建是成功的

DELIMITER //

CREATE PROCEDURE UpdateDataNoCondition3()
	BEGIN
	 #定义处理程序
		DECLARE duplicate_entry CONDITION FOR SQLSTATE '23000' ;
		DECLARE EXIT HANDLER FOR duplicate_entry SET @proc_value = -1;
		
		SET @x = 1;
		insert into user(name,sex,age) values('abc','男',18);
		SET @x = 2;
		-- 第二回肯定报错的
		insert into user(name,sex,age) values('abc','男',18);
		SET @x = 3;
	END //

DELIMITER ;

调用并查询:

--  变  OK 了, 之前错误码是 1062 对应的是 23000
call UpdateDataNoCondition3();

-- 2   -1 
select @x,@proc_value;

二. 流程控制

解决复杂问题不可能通过一个 SQL 语句完成,我们需要执行多个 SQL 操作。流程控制语句的作用就是控制存储过程中 SQL 语句的执行顺序,是我们完成复杂操作必不可少的一部分。只要是执行的程序,流程就分为三大类:

  • 顺序结构:程序从上往下依次执行
  • 分支结构:程序按条件进行选择执行,从两条或多条路径中选择一条执行
  • 循环结构:程序满足一定条件下,重复执行一组语句

针对于MySQL 的流程控制语句主要有 3 类。注意:只能用于存储程序。

  • 条件判断语句:IF 语句和 CASE 语句
  • 循环语句:LOOP、WHILE 和 REPEAT 语句
  • 跳转语句:ITERATE 和 LEAVE 语句

一直定义这三条数据进行演示和处理, 每一次语句之前都进行重置。

image-20230807175554133

二.一 分支结构 IF

IF 语句的语法结构是:

IF 表达式1 THEN 操作1
[ELSEIF 表达式2 THEN 操作2]……
[ELSE 操作N]
END IF

根据表达式的结果为TRUE或FALSE执行相应的语句。这里“[]”中的内容是可选的。

  • 特点:① 不同的表达式对应不同的操作 ② 使用在begin end中

年龄小于18时,修改姓名:

DELIMITER //
CREATE
    PROCEDURE `demo`.`p1`(IN `s_id` INT)
	-- 存储过程体
	BEGIN
		 -- 查询年龄
		 declare s_age int;
		 
		 set s_age = 0;
		 
		 select age into s_age from user where id = s_id;
		 if s_age < 18 then
				update user set name ='未成年' where id = s_id ;
		 end if ;
		 
	END //
DELIMITER ;

image-20230807183248952

年龄小于18为未成年, 其余为成年

DELIMITER //
CREATE
    PROCEDURE `demo`.`p2`(IN `s_id` INT)
	-- 存储过程体
	BEGIN
		 -- 查询年龄
		 declare s_age int;
		 
		 set s_age = 0;
		 
		 select age into s_age from user where id = s_id;
		 if s_age < 18 then
				update user set name ='未成年' where id = s_id ;
		 else 
				update user set name ='成年' where id = s_id ;
		 end if ;
		 
	END //
DELIMITER ;

image-20230807183420277

小于 18 为未成年, 为 18时为刚成年, 大于 18为成年

DELIMITER //
CREATE
    PROCEDURE `demo`.`p3`(IN `s_id` INT)
	-- 存储过程体
	BEGIN
		 -- 查询年龄
		 declare s_age int;
		 
		 set s_age = 0;
		 
		 select age into s_age from user where id = s_id;
		 if s_age < 18 then
				update user set name ='未成年' where id = s_id ;
		 elseif s_age = 18 then 
		    update user set name ='刚成年' where id = s_id ;
		 else 
				update user set name ='成年' where id = s_id ;
		 end if ;
		 
	END //
DELIMITER ;

image-20230807183617412

二.二 分支结构 CASE

CASE 语句的语法结构1:

#情况一:类似于switch
CASE 表达式
WHEN1 THEN 结果1或语句1(如果是语句,需要加分号) 
WHEN2 THEN 结果2或语句2(如果是语句,需要加分号)
...
ELSE 结果n或语句n(如果是语句,需要加分号)
END [case](如果是放在begin end中需要加上case,如果放在select后面不需要)

CASE 语句的语法结构2:

#情况二:类似于多重if
CASE 
WHEN 条件1 THEN 结果1或语句1(如果是语句,需要加分号) 
WHEN 条件2 THEN 结果2或语句2(如果是语句,需要加分号)
...
ELSE 结果n或语句n(如果是语句,需要加分号)
END [case](如果是放在begin end中需要加上case,如果放在select后面不需要)

case when 形式:

DELIMITER //
CREATE
    PROCEDURE `demo`.`p4`(IN `s_id` INT)
	-- 存储过程体
	BEGIN
		 -- 查询年龄
		 declare s_age int;
		 
		 set s_age = 0;
		 
		 select age into s_age from user where id = s_id;
		 
		 case 
		  when s_age < 18 then
				update user set name ='未成年' where id = s_id ;
		  when s_age = 18 then 
		    update user set name ='刚成年' where id = s_id ;
		   else  
				update user set name ='成年' where id = s_id ;
		 end case ;
		 
	END //
DELIMITER ;

image-20230807184211959

case 表达式 形式:

DELIMITER //
CREATE
    PROCEDURE `demo`.`p5`(IN `s_id` INT)
	-- 存储过程体
	BEGIN
		 -- 查询年龄
		 declare s_age int;
		 
		 set s_age = 0;
		 
		 select age into s_age from user where id = s_id;
		 
		 case s_age
		  when  16 then
				update user set name ='16 未成年' where id = s_id ;
		  when 18 then 
		    update user set name ='18 刚成年' where id = s_id ;
		   else  
				update user set name ='成年' where id = s_id ;
		 end case ;
		 
	END //
DELIMITER ;

image-20230807184416128

二.三 循环 LOOP

LOOP循环语句用来重复执行某些语句。LOOP内的语句一直重复执行直到循环被退出(使用LEAVE子句),跳出循环过程。

LOOP语句的基本格式如下:

[loop_label:] LOOP
	循环执行的语句
END LOOP [loop_label]

其中,loop_label表示LOOP语句的标注名称,该参数可以省略。

查询最小的年龄 循环相加 10 次之后的值

DELIMITER //
CREATE
    PROCEDURE `demo`.`p7`(OUT sum_age int)
	-- 存储过程体
	BEGIN
		 -- 查询年龄
		 declare s_age int;
		 declare num1 int default 0;
		 set s_age = 0;
		 set sum_age = 0;
		 
		 
		 select min(age) into s_age from user ;
		 
		 add_loop: LOOP
			 set num1 = num1 +1;
			 if num1 > 10 then leave add_loop;
			 else 
				set sum_age = sum_age + s_age;
			 end if;
	    end LOOP add_loop;
	END //
DELIMITER ;

调用:


set @sum_age = 0;
call p7(@sum_age);

--  160 
select @sum_age;

二.四 循环结构 WHILE

WHILE语句创建一个带条件判断的循环过程。WHILE在执行语句执行时,先对指定的表达式进行判断,如果为真,就执行循环内的语句,否则退出循环。WHILE语句的基本格式如下:

[while_label:] WHILE 循环条件  DO
	循环体
END WHILE [while_label];

while_label为WHILE语句的标注名称;如果循环条件结果为真,WHILE语句内的语句或语句群被执行,直至循环条件为假,退出循环。

DELIMITER //
CREATE
    PROCEDURE `demo`.`p8`(OUT sum_age int)
	-- 存储过程体
	BEGIN
		 -- 查询年龄
		 declare s_age int;
		 declare num1 int default 0;
		 set s_age = 0;
		 set sum_age = 0;
		 
		 
		 select min(age) into s_age from user ;
		 
		 -- 循环处理
		 while  num1 < 10 DO
			  set sum_age = sum_age + s_age;
				set num1 = num1 +1;
	   end WHILE;
	END //
DELIMITER ;

调用:

set @sum_age = 0;
call p8(@sum_age);

--  160 
select @sum_age;

二.五 循环结构 REPEAT

REPEAT语句创建一个带条件判断的循环过程。与WHILE循环不同的是,REPEAT 循环首先会执行一次循环,然后在 UNTIL 中进行表达式的判断,

如果满足条件就退出,即 END REPEAT;如果条件不满足,则会就继续执行循环,直到满足退出条件为止。

REPEAT语句的基本格式如下:

[repeat_label:] REPEAT
    循环体的语句
UNTIL 结束循环的条件表达式
END REPEAT [repeat_label]

repeat_label为REPEAT语句的标注名称,该参数可以省略;REPEAT语句内的语句或语句群被重复,直至expr_condition为真。

DELIMITER //
CREATE
    PROCEDURE `demo`.`p9`(OUT sum_age int)
	-- 存储过程体
	BEGIN
		 -- 查询年龄
		 declare s_age int;
		 declare num1 int default 0;
		 set s_age = 0;
		 set sum_age = 0;
		 
		 
		 select min(age) into s_age from user ;
		 
		 -- 循环处理 
		 REPEAT 
				set sum_age = sum_age + s_age;
				set num1 = num1 +1;
		 until  num1 >= 10
		 end REPEAT;
	END //
DELIMITER ;

调用:

set @sum_age = 0;
call p9(@sum_age);

--  160 
select @sum_age;

对比三种循环结构:

1、这三种循环都可以省略名称,但如果循环中添加了循环控制语句(LEAVE或ITERATE)则必须添加名称。
2、
LOOP:一般用于实现简单的"死"循环
WHILE:先判断后执行
REPEAT:先执行后判断,无条件至少执行一次

二.六 跳转语句 LEAVE

LEAVE语句:可以用在循环语句内,或者以 BEGIN 和 END 包裹起来的程序体内,表示跳出循环或者跳出程序体的操作。

如果你有面向过程的编程语言的使用经验,你可以把 LEAVE 理解为 break。

基本格式如下:

LEAVE 标记名

其中,label参数表示循环的标志。LEAVE和BEGIN … END或循环一起被使用。

统计执行的次数, num1 最多执行10次就退出



DELIMITER //
CREATE
    PROCEDURE `demo`.`p10`(OUT sum_age int ,OUT num1 int)
	-- 存储过程体
	BEGIN
		 -- 查询年龄
		 declare s_age int;
		 set s_age = 0;
		 set sum_age = 0;
		 set num1 = 0;
		 
		 select min(age) into s_age from user ;
		 
		 -- 循环处理
		 A: while  num1 < 10 DO
		    if s_age < 20 then 
					set num1 = num1 +1;
					LEAVE A;
				else 
					set sum_age = sum_age + s_age;
					set num1 = num1 +1;
				end if;
	   end WHILE;
	END //
DELIMITER ;



调用:


set @sum_age = 0;
set @num1 = 0;
call p10(@sum_age,@num1);

--  0   1 
select @sum_age, @num1;

二.七 跳转语句 ITERATE

ITERATE语句:只能用在循环语句(LOOP、REPEAT和WHILE语句)内,表示重新开始循环,将执行顺序转到语句段开头处。如果你有面向过程的编程语言的使用经验,你可以把 ITERATE 理解为 continue,意思为“再次循环”。

语句基本格式如下:

ITERATE label

label参数表示循环的标志。ITERATE语句必须跟在循环标志前面。

DELIMITER //
CREATE
    PROCEDURE `demo`.`p11`(OUT sum_age int ,OUT num1 int)
	-- 存储过程体
	BEGIN
		 -- 查询年龄
		 declare s_age int;
		 set s_age = 0;
		 set sum_age = 0;
		 set num1 = 0;
		 
		 select min(age) into s_age from user ;
		 
		 -- 循环处理
		 A: while  num1 < 10 DO
		    if s_age < 20 then 
					set num1 = num1 +1;
					iterate A;
				else 
					set sum_age = sum_age + s_age;
					set num1 = num1 +1;
				end if;
	   end WHILE;
	END //
DELIMITER ;

调用:


set @sum_age = 0;
set @num1 = 0;
call p11(@sum_age,@num1);

--  0   10
select @sum_age, @num1;


谢谢!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

BIO,NIO,AIO总结

文章目录 1. BIO (Blocking I/O)1.1 传统 BIO1.2 伪异步 IO1.3 代码示例 1.4 总结2. NIO (New I/O)2.1 NIO 简介2.2 NIO的特性/NIO与IO区别1)Non-blocking IO&#xff08;非阻塞IO&#xff09;2)Buffer(缓冲区)3)Channel (通道)4)Selector (选择器) 2.3 NIO 读数据和写数据方式…

SpringMVC基于SpringBoot的最基础框架搭建——包含数据库连接

SpringMVC基于SpringBoot的最基础框架搭建——包含数据库连接 背景目标依赖配置文件如下项目结构如下相关配置如下启动代码如下Controller如下启动成功接口调用成功 背景 工作做了一段时间&#xff0c;回忆起之前有个公司有线下笔试&#xff0c;要求考生做一个什么功能&#x…

无涯教程-Perl - fileno函数

描述 此函数返回指定的FILEHANDLE的文件描述符号(由C和POSIX函数使用)。通常,这仅在使用select函数和任何低级tty函数时才有用。 语法 以下是此函数的简单语法- fileno FILEHANDLE返回值 此函数返回FILEHANDLE的文件描述符(数字),失败时不确定。 Perl 中的 fileno函数 - 无…

考研算法38天:反序输出 【字符串的翻转】

题目 题目收获 很简单的一道题&#xff0c;但是还是有收获的&#xff0c;我发现我连scanf的字符串输入都忘记咋用了。。。。。我一开始写的 #include <iostream> #include <cstring> using namespace std;void deserve(string &str){int n str.size();int…

c语言每日一练(3)

前言&#xff1a;每日一练系列&#xff0c;每一期都包含5道选择题&#xff0c;2道编程题&#xff0c;博主会尽可能详细地进行讲解&#xff0c;令初学者也能听的清晰。每日一练系列会持续更新&#xff0c;暑假时三天之内必有一更&#xff0c;到了开学之后&#xff0c;将看学业情…

element-plus:el-date-picker日期只选择年月不要日

<el-date-picker v-model"value" type"month" format"YYYY-MM" value-format"YYYY-MM" />使用format属性将时间显示格式修改为YYYY–MM 年月格式 使用value-format将绑定值的格式修改为YYYY–MM年月格式

vcruntime140_1.dll修复的方法大全,缺失vcruntime140_1.dll解决方法分享

vcruntime140_1.dll这个文件在电脑里属于挺重要的一个文件&#xff0c;一但它缺失了&#xff0c;那么很多程序都是运行不了的&#xff0c;今天我们就来讲解一下这个vcruntime140_1.dll修复以及它的一些作用和属性。 一.vcruntime140_1.dll的作用 vcruntime140_1.dll是Microso…

【java安全】无Commons-Collections的Shiro550反序列化利用

文章目录 【java安全】无Commons-Collections的Shiro550反序列化利用Shiro550利用的难点CommonsBeanutils1是否可以Shiro中&#xff1f;什么是serialVersionUID&#xff1f;W 无依赖的Shiro反序列化利用链POC 【java安全】无Commons-Collections的Shiro550反序列化利用 Shiro5…

使用go-zero快速构建微服务

本文是对 使用go-zero快速构建微服务[1]的亲手实践 编写API Gateway代码 mkdir bookstore && cd bookstorego mod init bookstore mkdir api && goctl api -o api/bookstore.api syntax "v1"info(title: "xx使用go-zero"desc: "xx用…

Visual Studio配置PCL库

Visual Studio配置PCL库 Debug和Release配置新建项目配置属性表测试参考 Debug和Release Debug和Release的配置过程一模一样&#xff0c;唯一区别就在于最后一步插入的附加依赖项不同&#xff0c;因此下面以debug为例。 配置新建项目 1、新建一个C空项目&#xff0c;模式设置…

SQL分类及通用语法数据类型(超详细版)

一、SQL分类 SQL是结构化查询语言&#xff08;Structured Query Language&#xff09;的缩写。它是一种用于管理和操作关系型数据库系统的标准化语言。SQL分类如下&#xff1a; DDL: 数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库、表、字段&#xff09;DML:…

16-2_Qt 5.9 C++开发指南_使用样式表Qss自定义界面

进行本篇介绍学习前&#xff0c;请先参考链接01_1_Qt工程实践_Qt样式表Qss&#xff0c;后再结合本篇进行融合学习如何使用样式表定义界面。 文章目录 1. Qt样式表2. Qt样式表句法2.1 一般句法格式2.2 选择器 (selector)2.3 子控件&#xff08;sub-controls&#xff09;2.4 伪状…

UE5.2 LyraDemo源码阅读笔记(四)

上一篇&#xff08;三&#xff09;讲到在模式玩法UI点击Elimination进入淘汰赛模式。 UI选择点击Elimination后&#xff0c;触发蓝图W_HostSessionScreen的HostSession节点&#xff0c;有&#xff1a; 调用这个方法切换关卡后&#xff0c;会调用到LyraGameMode.cpp的 ALyraGam…

【Gitee的使用】Gitee的简单使用,查看/创建SSH公匙、创建版本库、拉取代码、提交代码

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 本篇文章简单介绍&#xff0c;如何在Gitee上面创建版本库、拉取…

Zookeeper基础操作

搭建Zookeeper服务器 windows下部署 下载地址: https://mirrors.cloud.tencent.com/apache/zookeeper/zookeeper-3.7.1/ 修改配置文件 打开conf目录&#xff0c;将 zoo_sample.cfg复制一份&#xff0c;命名为 zoo.cfg打开 zoo.cfg&#xff0c;修改 dataDir路径&#xff0c…

2023最新性能测试面试题(带答案)

一、性能测试开展过程&#xff1a; 答&#xff1a;第一步&#xff1a;找产品沟通哪些接口需要压测&#xff0c;需要达到什么样的预期值(TPS和响应时间) 第二步&#xff1a;编写测试计划&#xff0c;人员、时间周期、工具 第三步&#xff1a;环境搭建 第四步&#xff1a;造数…

产品缺陷管理软件:了解功能与选择要点

在现代社会&#xff0c;产品缺陷管理软件已经成为了各个行业必不可少的工具。它可以帮助企业更好地管理和解决产品中存在的缺陷问题&#xff0c;提高产品质量和客户满意度。然而&#xff0c;市场上存在着众多的产品缺陷管理软件&#xff0c;如何选择一款好用、适合自己的软件成…

山东气象 × 和鲸科技:第一届齐鲁风云气象智能算法挑战赛圆满收官

7 月 20 日&#xff0c;中国气象局印发《人工智能气象应用工作方案&#xff08;2023 - 2030年&#xff09;》&#xff0c;旨在加快布局国产人工智能气象应用技术体系建设&#xff0c;推动人工智能技术在气象观测、预报及服务中的深度融合应用&#xff0c;为监测精密、预报精准、…

word转pdf怎么转?几种常用方法分享

word转pdf怎么转&#xff1f;在日常工作和学习中&#xff0c;将Word文档转换为PDF格式是一项必要的任务。不仅可以保证文档的格式不变&#xff0c;还可以防止文档被他人篡改。但是&#xff0c;Word文档并不是所有人都能够轻松打开和编辑的&#xff0c;而PDF文件则可以在各种设备…

【vue3】vue3和vue2的区别:

文章目录 Vue3框架的优点特点:一、生命周期:二、组合式api&#xff08;Composition API&#xff09;三、setup函数四、响应式原理1. 原理2. Object.defineProperty的缺陷3.proxy的优势 五、reactive函数和ref函数1. reactive函数》通常使用它复杂类型的响应式数据2. ref函数》使…