MySQL流程控制(二十八)

news2024/12/23 20:04:11

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

上一章简单介绍了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;


谢谢!!!

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

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

相关文章

跨境B2B2C多用户购物网站源码快速部署

​ 搭建跨境B2B2C多用户购物网站需要以下步骤&#xff1a; 1. 确定业务模式和定位&#xff1a;确定网站的业务模式&#xff0c;包括跨境B2B2C的商业模式以及目标用户定位。 2. 营业执照和域名注册&#xff1a;根据当地法律要求&#xff0c;注册一家具有法人资格的公司&#xff…

java Springboot02--Controller,文件上传,拦截器

因为前后端分离了&#xff0c;所以这个项目基本用不到controller 这句话意思&#xff1a; controller只能用get接受前端的请求 RequestMapping(value "/hello",method RequestMethod.GET) GetMapping("/hello") 这两句等价的 前段传递参数&#xff0…

炸裂,靠“吹牛”过京东一面,月薪40K

说在前面 在40岁老架构师尼恩的&#xff08;50&#xff09;读者社区中&#xff0c;经常有小伙伴&#xff0c;需要面试美团、京东、阿里、 百度、头条等大厂。 下面是一个5年小伙伴成功拿到通过了京东一面面试&#xff0c;并且最终拿到offer&#xff0c;月薪40K。 现在把面试…

搜索综合训练

搜索综合训练 选数详细注释的代码 小木棍详细注释的代码 费解的开关详细注释的代码 选数 详细注释的代码 #include <iostream> #include <vector>using namespace std;// 判断一个数是否为素数 bool isPrime(int num) {if (num < 1)return false;// 判断从2到s…

利用状态监测和机器学习提高冷却塔性能的具体方法

在现代工业生产中&#xff0c;冷却塔扮演着至关重要的角色&#xff0c;它们的性能直接影响着工艺流程的稳定性和效率。为了确保冷却塔的正常运行和减少系统故障&#xff0c;状态监测和机器学习成为了关键技术。 图.冷却塔&#xff08;PreMaint&#xff09; 在前文《基于人工智…

P1629 邮递员送信(最短路)(内附封面)

邮递员送信 题目描述 有一个邮递员要送东西&#xff0c;邮局在节点 1 1 1。他总共要送 n − 1 n-1 n−1 样东西&#xff0c;其目的地分别是节点 2 2 2 到节点 n n n。由于这个城市的交通比较繁忙&#xff0c;因此所有的道路都是单行的&#xff0c;共有 m m m 条道路。这…

02_kafka_基本概念_基础架构

文章目录 常见的消息队列工作模式基本概念kafka 特性Kafka 基本架构topic 分区的 目的/ 好处 日志存储形式消费者&#xff0c;消费方式 逻辑消费组 高性能写入&#xff1a; 顺序写 mmap读取&#xff1a;零拷贝DMA 使用场景 常见的消息队列工作模式 至多一次&#xff1a;消息被…

cnvd通用型证书获取姿势

因为技术有限&#xff0c;只能挖挖不用脑子的漏洞&#xff0c;平时工作摸鱼的时候通过谷歌引擎引擎搜索找找有没有大点的公司有sql注入漏洞&#xff0c;找的方法就很简单&#xff0c;网站结尾加上’&#xff0c;有异常就测试看看&#xff0c;没有马上下一家&#xff0c;效率至上…

基于Python++PyQt5马尔科夫模型的智能AI即兴作曲—深度学习算法应用(含全部工程源码+测试数据)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境PC环境配置 模块实现1. 钢琴伴奏制作1&#xff09;和弦的实现2&#xff09;和弦级数转为当前调式音阶3&#xff09;根据预置节奏生成伴奏 2. 乐句生成1&#xff09;添加音符2&#xff09;旋律生成3&#xff09;节…

Llama2 评测大公开!知识库场景下能否赶超 ChatGPT?

AIGC 人狂喜&#xff01;最近&#xff0c;Meta AI 发布了大语言模型 Llama2&#xff0c;为大模型的开发者注入了一剂强心针&#xff0c;因为无论从其灵活性、竞争力还是便捷性来看&#xff0c;都有不小的优势。 具体来看&#xff1a; Llama2 为开源产品且可免费商用&#xff0c…

【Spring AOP】什么是AOP

文章目录 1、AOP思想2、AOP入门案例3、AOP工作流程4、AOP切入点表达式5、AOP的五种通知类型6、AOP通知获取数据7、案例&#xff1a;百度网盘密码数据兼容处理8、AOP总结 1、AOP思想 AOP&#xff0c;即Aspect Oriented Programming&#xff0c;面向切面编程。是一种编程范式&am…

8.18信号量Semaphore和CountDownLatch

一 .Semaphore: 1.Semaphore是一个计数器(变量),描述可用资源的个数,用来判断是否有临界资源可用. 2.临界资源:多个进程或线程并发执行的实体可以公共使用到的资源. 3.pv操作:p操作(accquire(申请))表示计数器减一,v操作(release(释放))表示计数器加一. 4.锁是特殊的信号量…

RISC-V公测平台发布:如何在SG2042上玩转OpenMPI

About HS-2 HS-2 RISC-V通用主板是澎峰科技与合作伙伴共同研发的一款专为开发者设计的标准mATX主板&#xff0c;它预装了澎峰科技为RISC-V高性能服务器定制开发的软件包&#xff0c;包括各种标准bencmark、支持V扩展的GCC编译器、计算库、中间件以及多种典型服务器应用程序。…

[webpack] 处理样式 (二)

文章目录 1.介绍2.处理 Css 资源2.1 导入包2.2 功能配置2.3 添加 Css 资源 3.处理 Less 资源3.1 导入包3.2 功能配置3.3 添加 Less 资源 4.处理 Sass 和 Scss 资源4.1 导入包4.2 配置4.3 添加 Sass 资源4.4 运行webpack 5.处理 Styl 资源5.1 导入包5.2 配置5.3 添加 Styl 资源5…

微信开发之自动同意好友的技术实现

简要描述&#xff1a; 同意添加好友 请求URL&#xff1a; http://域名地址/acceptUser 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明…

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑 现在想对一个接口做性能测试&#xff0c;需要测试它多个线程并发下的调用 1.新建测试计划和线程组 略 2.新建http接口 一个完整的http接口包含请求头和请求&#xff0c;这里就需要两个组件&#xff1a;HTTP request、HT…

c语言函数作为形参的注意事项

1、c语言数组作为形参会退化成数组指针 #include "stdio.h" #include <stdlib.h>//数组作为函数的形参会退化成指针 void print_arr(int a[5]);// int *b int main() {int arr[5] { 1,2,3,4,5 };print_arr(arr);return 0; }void print_arr(int a[5]) {printf…

SocialFi 的开发中如何利用 NFTScan API 获取 NFT 数据

SocialFi 作为社交媒体与 Web3 的创新融合&#xff0c;致力于构建更加开放去中心化的社交平台。它赋能用户拥有数据控制权、实现内容价值&#xff0c;并通过代币经济建立起激励与治理机制&#xff0c;这正是 Web3 社交的独特魅力所在。SocialFi 为我们描绘了一个更加用户驱动、…

从0开始全栈深度学习工程师之路(四):VSCode提效设置和插件

在从0开始深度学习工程师之路&#xff08;三&#xff09;&#xff1a;Python开发环境搭建&#xff08;VSCode) 中,我们一步步搭建了基于VSCode的开发环境&#xff0c;这一篇我们继续优化我们的开发环境&#xff0c;毕竟工欲善其事&#xff0c;必先利其器。 配置 同步设置 我…

GG修改器安装与Root环境的安装

关于GG修改器大家应该都有一定的了解吧&#xff0c;就是类似于电脑端CE的一个软件。 GG修改器在百度云盘里请自行下载&#xff01; 百度网盘链接&#xff1a;https://pan.baidu.com/s/1p3KJRg9oq4s0XzRuEIBH4Q 提取码&#xff1a;vuwj 那我要开始了&#xff01; 本来不想讲GG…