MYSQL十、MYSQL的存储过程和触发器的基本认识

存储过程

  1. 存储过程:存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合。调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。

    • 存储过程思想上很简单,其实就是数据库 SQL 语言层面的代码封装与重用
  2. 存储过程的特点:

    • 封装,复用 -----------------------> 可以把某一业务SQL封装在存储过程中,需要用到的时候直接调用即可。
    • 可以接收参数,也可以返回数据 --------> 在存储过程中,可以传递参数,也可以接收返回值。
    • 减少网络交互,效率提升 -------------> 如果涉及到多条SQL,每执行一次都是一次网络传输。 而如果封装在存储过程中,我们只需要网络交互一次可能就可以了。

1、存储过程的基本语法

  • 创建存储过程
CREATE  PROCEDURE   存储过程名称 ([ 参数列表 ])
BEGIN-- SQL语句
END ;
  • 创建例子:
-- 创建一个名为p1的存储过程,无参的
create procedure p1()beginselect count(*) from student;end;
  • 调用存储过程
 CALL  名称  ([ 参数 ]); 
  • 调用的例子:
-- 调用p1存储过程
call p1();
  • 查看存储过程
-- 查询指定数据库的存储过程及状态信息SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = 'xxx';  -- 查询某个存储过程的定义
SHOW  CREATE  PROCEDURE   存储过程名称 ;  
  • 查看存储过程的例子
-- 查看dadao数据库的存储过程和状态信息
select * from information_schema.ROUTINES where ROUTINE_SCHEMA = 'dadao';-- 查询p1存储过程的定义
show create procedure p1;
  • 删除存储过程
DROP  PROCEDURE   [ IF EXISTS ]  存储过程名称 ;
  • 删除存储过程的例子
-- 删除存储过程p1
drop procedure if exists p1;
  • 在命令行中,执行创建存储过程的SQL时,需要通过关键字 delimiter 指定SQL语句的结束符

2、变量

  1. 在MySQL中变量分为三种类型: 系统变量用户定义变量局部变量

系统变量

  1. 系统变量是MySQL服务器提供,不是用户定义的,属于服务器层面。分为全局变量(GLOBAL)会话变量(SESSION)
  • 查看系统变量的语法:
-- 查看所有系统变量SHOW  [ SESSION | GLOBAL ]   VARIABLES ;   -- 可以通过LIKE模糊匹配方式查找变量           
SHOW  [ SESSION | GLOBAL ]   VARIABLES  LIKE  '......';    --  查看指定变量的值
SELECT  @@[SESSION. | GLOBAL.]系统变量名;                  
  • 查看系统变量的例子:
-- 查看所有的系统变量
show variables;-- 查看所有的全局系统变量
show session variables-- 查看所有的会话系统变量
show session variables ;-- 进行模糊匹配
show session variables like 'auto%';
show global variables like 'auto%';# 查看指定的系统变量,两个@@表示要查看系统变量,@@系统变量名
select @@autocommit;select @@global.autocommit;select @@session.autocommit;
  • 设置系统变量的语法
SET  [ SESSION | GLOBAL ]   系统变量名 =; SET  @@[SESSION. | GLOBAL.]系统变量名 =; 
  • 设置系统变量例子:

set session autocommit = 1;# 设置指定变量的值
SET @@session.autocommit = 1;set global autocommit  = 0;
  • 如果没有指定SESSION/GLOBAL,默认是SESSION,会话变量。
    • mysql服务重新启动之后,所设置的全局参数会失效,要想不失效,可以在 /etc/my.cnf 中配置
  • 全局变量(GLOBAL): 全局变量针对于所有的会话
  • 会话变量(SESSION): 会话变量针对于单个会话,在另外一个会话窗口就不生效了

用户自定义变量

  1. 用户定义变量 是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用 “@变量名” 使用就可以。其作用域为当前连接。
  • 用户定义变量的赋值语法:
    • 赋值时,可以使用 = ,也可以使用 :=
# 方法一:直接赋值SET   @var_name = expr  [, @var_name = expr] ... ; 
SET   @var_name := expr  [, @var_name := expr] ... ; # 方法二:
SELECT   @var_name := expr  [, @var_name := expr] ... ;# 从表名获取到的字段名的值赋值给 @var_name
SELECT  字段名  INTO @var_name  FROM  表名;
  • 赋值例子:
-- 赋值
set @myname = 'dadao';set @myage := 10;set @mygender := '男',@myhobby := 'java';select @mycolor := 'red';
# 从tb_user查出来的count(*)的值赋值给@mycount这个变量select count(*) into @mycount from tb_user;
  • 用户定义变量的使用(查看变量的值)语法:
 SELECT   @var_name ;
  • 使用的例子:
select @myname,@myage,@mygender,@myhobby;select @mycolor , @mycount;

局部变量

  1. 局部变量 是根据需要定义的在局部生效的变量,访问之前,需要DECLARE声明。可用作存储过程内的局部变量和输入参数。(局部变量的范围是在其内声明的BEGIN … END块)
  • 局部变量的声明语法:
    • 变量类型就是数据库字段类型:INT、BIGINT、CHAR、VARCHAR、DATE、TIME等
 DECLARE 变量名 变量类型 [DEFAULT ... ] ;# default是为变量设定默认值
  • 局部变量的声明的例子:
create procedure p2()begindeclare stu_count int default 0;  # 声明一个变量select count(*) into stu_count from student; # 为变量stu_count赋值select stu_count;end;
  • 局部变量的赋值语法:
 SET  变量名 =;SET  变量名 :=;SELECT  字段名  INTO  变量名  FROM  表名 ... ; 
  • 局部变量的赋值的例子:
create procedure p2()begindeclare stu_count int default 0;  # 声明一个变量select count(*) into stu_count from student; # 为变量stu_count赋值select stu_count;end;

if条件判断

  1. if条件的语法:
IF  条件1  THEN .....ELSEIF  条件2  THEN       -- 可选.....ELSE                     -- 可选.....END  IF;
  1. 使用例子:
# score >= 85分,等级为优秀。
# score >= 60分 且 score < 85分,等级为及格。
# score < 60分,等级为不及格。
create procedure p3()begindeclare score int default 58;declare result varchar(10);if score >= 85 thenset result := '优秀';elseif score >= 60 thenset result := '及格';elseset result := '不及格';end if;select result;end;call p3();

参数

  1. 参数的介绍:参数的类型,主要分为以下三种:IN、OUT、INOUT。
    在这里插入图片描述
  2. 用法:
CREATE  PROCEDURE   存储过程名称 ([ IN/OUT/INOUT  参数名  参数类型 ])BEGIN-- SQL语句
END ;
  1. 使用的例子:
根据传入参数score,判定当前分数对应的分数等级,并返回。 
score >= 85分,等级为优秀。
score >= 60分 且 score < 85分,等级为及格。
score < 60分,等级为不及格。create procedure p(in score int, out result varchar(10))beginif score >= 85 thenset result := '优秀';elseif score >= 60 thenset result := '及格';elseset result := '不及格';end if;
end;-- 定义用户变量 @result来接收返回的数据, 用户变量可以不用声明call p(18, @result);select @result;

case

  1. case的两种语法格式
  • 第一种:
CASE  case_valueWHEN  when_value1  THEN  statement_list1[ WHEN  when_value2  THEN  statement_list2] ...[ ELSE  statement_list ]END  CASE;-- 含义: 当case_value的值为 when_value1时,执行statement_list1,当值为 when_value2时,执行statement_list2, 否则就执行 statement_list
  • 第二种:
CASEWHEN  search_condition1  THEN  statement_list1[WHEN  search_condition2  THEN  statement_list2] ...[ELSE  statement_list]END CASE;
-- 含义: 当条件search_condition1成立时,执行statement_list1,当条件search_condition2成立时,执行statement_list2, 否则就执行 statement_list
  1. 使用案例:
根据传入的月份,判定月份所属的季节(要求采用case结构)。
1-3月份,为第一季度
4-6月份,为第二季度
7-9月份,为第三季度
10-12月份,为第四季度create procedure p(in month int)begindeclare result varchar(10);casewhen month >= 1 and month <= 3 thenset result := '第一季度';when month >= 4 and month <= 6 thenset result := '第二季度';when month >= 7 and month <= 9 thenset result := '第三季度';when month >= 10 and month <= 12 thenset result := '第四季度';elseset result := '非法参数';end case ;select concat('您输入的月份为: ',month, ', 所属的季度为: ',result);end;call  p(16);

如果判定条件有多个,多个条件之间,可以使用 and 或 or 进行连接。

while

  1. while 循环是有条件的循环控制语句。满足条件后,再执行循环体中的SQL语句。具体语法为:
-- 先判定条件,如果条件为true,则执行逻辑,否则,不执行逻辑
WHILE  条件  DOSQL逻辑...    
END WHILE;
  1. 例子:
# 计算从1累加到n的值,n为传入的参数值。
-- A. 定义局部变量, 记录累加之后的值;-- B. 每循环一次, 就会对n进行减1 , 如果n减到0, 则退出循环
create procedure p(in n int)begindeclare total int default 0;while n>0 doset total := total + n;set n := n - 1;end while;select total;end;call p(100);

repeat

  1. repeat是有条件的循环控制语句, 当满足until声明的条件的时候,则退出循环 。具体语法为:
-- 先执行一次逻辑,然后判定UNTIL条件是否满足,如果满足,则退出。如果不满足,则继续下一次循环
REPEATSQL逻辑...  UNTIL  条件
END REPEAT;
  1. 例子:
# 计算从1累加到n的值,n为传入的参数值。(使用repeat实现)
-- A. 定义局部变量, 记录累加之后的值;-- B. 每循环一次, 就会对n进行-1 , 如果n减到0, 则退出循环
create procedure p(in n int)begindeclare total int default 0;repeatset total := total + n;set n := n - 1;until  n <= 0end repeat;select total;
end;call p(10);

loop

  1. LOOP 实现简单的循环,如果不在SQL逻辑中增加退出循环的条件,可以用其来实现简单的死循环。

    • LEAVE :配合循环使用,退出循环。
    • ITERATE:必须用在循环中,作用是跳过当前循环剩下的语句,直接进入下一次循环。
  2. 语法:

 [begin_label:]  LOOPSQL逻辑...  
END  LOOP  [end_label];LEAVE  label;   -- 退出指定标记的循环体
ITERATE  label; -- 直接进入下一次循环
  1. 例子:
# 计算从1累加到n的值,n为传入的参数值。
-- A. 定义局部变量, 记录累加之后的值;
-- B. 每循环一次, 就会对n进行-1 , 如果n减到0, 则退出循环 ----> leave xxcreate procedure p(in n int)begindeclare total int default 0;sum:loopif n<=0 thenleave sum;end if;set total := total + n;set n := n - 1;end loop sum;select total;end;call p(100);

游标

  1. 介绍:游标(CURSOR)是用来存储查询结果集的数据类型 , 在存储过程和函数中可以使用游标对结果集进行循环的处理。游标的使用包括游标的声明、OPEN、FETCH 和 CLOSE,其语法分别如下:
  • 声明游标
 DECLARE   游标名称  CURSOR  FOR  查询语句 ;
  • 打开游标
 OPEN   游标名称 ;
  • 获取游标记录
 FETCH  游标名称  INTO  变量 [, 变量  ] ;
  • 关闭游标
 CLOSE   游标名称 ;
  1. 例子:
# 根据传入的参数uage,来查询用户表tb_user中,所有的用户年龄小于等于uage的用户姓名(name)和专业(profession),并将用户的姓名和专业插入到所创建的一张新表(id,name,profession)中。
-- 逻辑:
-- A. 声明游标, 存储查询结果集
-- B. 准备: 创建表结构
-- C. 开启游标
-- D. 获取游标中的记录
-- E. 插入数据到新表中
-- F. 关闭游标
create procedure p(in uage int)begindeclare uname varchar(100);declare upro varchar(100);declare u_cursor cursor for select name,profession from tb_user where age <= uage;drop table if exists tb_user_pro;create table if not exists tb_user_pro(id int primary key auto_increment,name varchar(100),profession varchar(100));open u_cursor;while true dofetch u_cursor into uname,upro;insert into tb_user_pro values (null, uname, upro);end while;close u_cursor;end;call p(30);
  • 上述的存储过程,最终我们在调用的过程中,会报错,之所以报错是因为上面的while循环中,并没有退出条件。当游标的数据集获取完毕之后,再次获取数据,就会报错,从而终止了程序的执行。
  • 但是此时,tb_user_pro表结构及其数据都已经插入成功了,我们可以直接刷新表结构,检查表结构中的数据
  • 上述的功能,虽然我们实现了,但是逻辑并不完善,而且程序执行完毕,获取不到数据,数据库还报错。 接下来,我们就需要来完成这个存储过程,并且解决这个问题。
    • 要想解决这个问题,就需要通过MySQL中提供的 条件处理程序 Handler 来解决。

条件处理程序

  1. 条件处理程序(Handler)可以用来定义在流程控制结构执行过程中遇到问题时相应的处理步骤。
  2. 语法为:
 DECLARE handler_action  HANDLER FOR condition_value  [, condition_value] ...   statement ;handler_action 的取值: CONTINUE: 继续执行当前程序EXIT: 终止执行当前程序condition_value 的取值: SQLSTATE  sqlstate_value: 状态码,如 02000SQLWARNING: 所有以01开头的SQLSTATE代码的简写NOT FOUND: 所有以02开头的SQLSTATE代码的简写SQLEXCEPTION: 所有没有被SQLWARNING 或 NOT FOUND捕获的SQLSTATE代码的简写
  1. 例子:
# 根据传入的参数uage,来查询用户表tb_user中,所有的用户年龄小于等于uage的用户姓名(name)和专业(profession),并将用户的姓名和专业插入到所创建的一张新表(id,name,profession)中。
  • 第一步:通过SQLSTATE指定具体的状态码
-- 逻辑:
-- A. 声明游标, 存储查询结果集
-- B. 准备: 创建表结构
-- C. 开启游标
-- D. 获取游标中的记录
-- E. 插入数据到新表中
-- F. 关闭游create procedure p(in uage int)begindeclare uname varchar(100);declare upro varchar(100);declare u_cursor cursor for select name,profession from tb_user where age <= uage;
-- 声明条件处理程序 : 当SQL语句执行抛出的状态码为02000时,将关闭游标u_cursor,并退出
declare exit handler for SQLSTATE '02000' close u_cursor;drop table if exists tb_user_pro;create table if not exists tb_user_pro(id int primary key auto_increment,name varchar(100),profession varchar(100));open u_cursor;while true dofetch u_cursor into uname,upro;insert into tb_user_pro values (null, uname, upro);end while;close u_cursor;end;call p(30);
  • 第二步: 通过SQLSTATE的代码简写方式 NOT FOUND
    • 02 开头的状态码,代码简写为 NOT FOUND
 create procedure p(in uage int)begindeclare uname varchar(100);declare upro varchar(100);declare u_cursor cursor for select name,profession from tb_user where age <= uage;-- 声明条件处理程序 : 当SQL语句执行抛出的状态码为02开头时,将关闭游标u_cursor,并退出
declare exit handler for not found close u_cursor;drop table if exists tb_user_pro;create table if not exists tb_user_pro(id int primary key auto_increment,name varchar(100),profession varchar(100));open u_cursor;while true dofetch u_cursor into uname,upro;insert into tb_user_pro values (null, uname, upro);end while;close u_cursor;end;call p(30);

存储函数(很少用,可以使用存储过程代替)

  1. 存储函数的介绍:存储函数是有返回值的存储过程,存储函数的参数只能是IN类型(即参数是输入参数)的。
  2. 语法:
CREATE  FUNCTION   存储函数名称 ([ 参数列表 ])RETURNS  type  [characteristic ...]BEGIN-- SQL语句
RETURN ...;END ;
  • characteristic说明:
    • DETERMINISTIC:相同的输入参数总是产生相同的结果
    • NO SQL :不包含 SQL 语句。
    • READS SQL DATA:包含读取数据的语句,但不包含写入数据的语句。
  • 在mysql8.0版本中binlog默认是开启的,一旦开启了,mysql就要求在定义存储过程时,需要指定characteristic特性,否则就会报错。
  1. 案例:
# 计算从1累加到n的值,n为传入的参数值
create function fun1(n int)returns int deterministicbegindeclare total int default 0;while n>0 doset total := total + n;set n := n - 1;end while;return total;end;
# 调用存储函数select fun1(50);

触发器

  1. 触发器的介绍:触发器是与有关的数据库对象,指在insert/update/delete之前(BEFORE)或之后(AFTER),触发并执行触发器中定义的SQL语句集合。
    • 触发器的这种特性可以协助应用在数据库端确保数据的完整性 , 日志记录 , 数据校验等操作 。
    • 使用别名OLD和NEW来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只支持行级触发支持语句级触发。
      • 行级触发(Row-Level Trigger):行级触发器在每一行数据被插入、更新或删除时都会立即执行。它们提供了一个非常细粒度的控制,允许开发者对单个数据更改做出反应。行级触发器通常用于确保数据的一致性和完整性,例如审计日志、业务规则验证等。当满足特定条件时,触发器会自动激活并执行相应的存储过程或SQL语句。
      • 语句级触发(Statement-Level Trigger):语句级触发器是在整个SQL语句执行完毕后才会执行的。这意味着它们会在一次操作(如一个INSERT、UPDATE或DELETE语句)的所有行都处理完毕后才被触发。这种触发方式更适合于执行一些全局操作,比如记录所有操作的整体效果,或者进行批量处理。语句级触发器通常比行级触发器的性能更好,因为它们减少了事务的开销。
        在这里插入图片描述
  2. 触发器语法:
CREATE  TRIGGER  trigger_name 
BEFORE/AFTER  INSERT/UPDATE/DELETEON tbl_name   FOR EACH ROW  -- 行级触发器
BEGINtrigger_stmt ;
END;
  1. 查看触发器:
show triggers;
  1. 删除触发器:
-- 如果没有指定schema_name,默认为当前数据库
drop trigger [schema_name.]trigger_name; 

触发器案例:

  1. 通过触发器记录 tb_user 表的数据变更日志,将变更日志插入到日志表user_logs中, 包含增加, 修改 , 删除 ;
  2. 日志表的准备:
#  日志表 user_logscreate table user_logs(id int(11) not null auto_increment,operation varchar(20) not null comment '操作类型, insert/update/delete',operate_time datetime not null comment '操作时间',operate_id int(11) not null comment '操作的ID',operate_params varchar(500) comment '操作参数',primary key(`id`))engine=innodb default charset=utf8;
  • 插入(insert)触发器
create trigger tb_user_insert_trigger
after insert on tb_user for each rowbegininsert into user_logs(id, operation, operate_time, operate_id, operate_params) VALUES (null, 'insert', now(), new.id, concat('插入的数据内容为: id=',new.id,',name=',new.name, ', phone=', NEW.phone, ', email=', NEW.email, ', profession=', NEW.profession));end;
-- 查看
show triggers ;-- 插入数据到tb_userinsert into tb_user(id, name, phone, email, profession, age, gender, status, createtime) VALUES (26,'大哥大','18809091212','erhuangzi@163.com','软件工程',23,'1','1',now());
  • 修改(update)触发器
create trigger tb_user_update_trigger
after update on tb_user for each rowbegininsert into user_logs(id, operation, operate_time, operate_id, operate_params) 
VALUES(null, 'update', now(), new.id,concat('更新之前的数据: id=',old.id,',name=',old.name, ', phone=', old.phone, ', email=', old.email, ', profession=', old.profession,' | 更新之后的数据: id=',new.id,',name=',new.name, ', phone=', NEW.phone, ', email=', NEW.email, ', profession=', NEW.profession));end;
-- 查看
show triggers ;-- 更新
update tb_user set profession = '会计' where id = 23;
update tb_user set profession = '会计' where id <= 5;
  • 删除(delete)触发器
 create trigger tb_user_delete_triggerafter delete on tb_user for each rowbegininsert into user_logs(id, operation, operate_time, operate_id, operate_params) VALUES(null, 'delete', now(), old.id,concat('删除之前的数据: id=',old.id,',name=',old.name, ', phone=', old.phone, ', email=', old.email, ', profession=', old.profession));end;
-- 查看
show triggers ;-- 删除数据
delete from tb_user where id = 26;

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

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

相关文章

【学习笔记】数据结构(三)

栈和队列 文章目录 栈和队列3.1 栈 - Stack3.1.1 抽象数据类型栈的定义3.1.2 栈的表示和实现 3.2 栈的应用举例3.2.1 数制转换3.2.2 括号匹配的检验3.2.3 迷宫求解3.2.4 表达式求值 - 波兰、逆波兰3.2.5 反转一个字符串或者反转一个链表 3.3 栈与递归的实现3.4 队列 - Queue3.4…

Cell2Sentence:为LLM传输生物语言

像GPT这样的LLM在自然语言任务上表现出了令人印象深刻的性能。这里介绍一种新的方法&#xff0c;通过将基因表达数据表示为文本&#xff0c;让这些预训练的模型直接适应生物背景&#xff0c;特别是单细胞转录组学。具体来说&#xff0c;Cell2Sentence将每个细胞的基因表达谱转换…

小学数学蝴蝶模型详解

蝴蝶模型 1.蝴蝶模型仅存在于梯形中&#xff0c;是连接梯形两条对角线而形成的&#xff0c;如下图&#xff1a; 2.蝴蝶模型有几条公式 (1) (2) S△AODS△BOC 等等......

多商户零售外卖超市外卖商品系统源码

构建你的数字化零售王国 一、引言&#xff1a;数字化零售的崛起 在数字化浪潮的推动下&#xff0c;零售业务正经历着前所未有的变革。多商户零售外卖超市商品系统源码应运而生&#xff0c;为商户们提供了一个全新的数字化零售解决方案。通过该系统源码&#xff0c;商户们可以…

BFS:解决拓扑排序问题

文章目录 什么是拓扑排序&#xff1f;关于拓扑排序的题1.课程表2.课程表Ⅱ3.火星词典 总结 什么是拓扑排序&#xff1f; 要知道什么拓扑排序我们首先要知道什么是有向无环图&#xff0c;有向无环图我们看名字其实就很容易理解&#xff0c;有向就是有方向&#xff0c;无环就是没…

028基于SSM+Jsp的电影售票系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

梅雨季要祛湿!分不清寒湿和湿热,小心越祛越湿!4个方法,助你温和排湿热与寒湿

梅雨季又又又又到了&#xff0c;苏州的雨已经连下3天了&#xff0c;到处都湿哒哒、黏糊糊&#xff01;胃口不好、身体酸重、心情不好……湿气太重了&#xff01; 中医有一句话说“湿气在&#xff0c;百病害&#xff0c;湿气除&#xff0c;百病无”&#xff0c;意思是“湿”为万…

编写一个可复用且使用方式简单的部署脚本

只需一行命令就可使用应用部署或重新部署 当我们部署Java项目时&#xff0c;一般有两种部署方式&#xff1a; 使用java -jar命令来运行jar包将应用打成jar包以容器的方式进行部署 本篇文章主要讲解第二种方式&#xff0c;以部署xxl-job-admin为例 1.编写restart.sh脚本&…

IDEA启动项目Error:java: JDK isn‘t specified for module ‘test‘

错误原因&#xff1a; idea自带JDK不匹配导致项目启动失败 解决方法&#xff1a; 修改idea自带JDK为自己安装的JDK 调整步骤&#xff1a;

《编译原理》阅读笔记:p18

《编译原理》学习第 3 天&#xff0c;p18总结&#xff0c;总计 14页。 一、技术总结 1.assembler (1)计算机结构 要想学习汇编的时候更好的理解&#xff0c;要先了解计算机的结构&#xff0c;以下是本人学习汇编时总结的一张图&#xff0c;每当学习汇编时&#xff0c;看到“…

线上OOM问题排查总结

自己搭建了一个小博客&#xff0c;该文章与博客文章同步。 一般情况下&#xff0c;出现OOM主要有一下三种原因。 一次性申请对象的太多。更改申请对象数量。内存资源耗尽未释放。找到未释放的对象进行释放。本身资源不够。jmap -heap 查看堆信息。 分几种情况解决&#xff1…

多模态-大模型:MLLM综述(适用初学)

文章目录 前言一、多模态模型基础知识二、多模态指令调优&#xff08;M-IT&#xff09;1.MLLM基础2.模态对齐3.数据获取4.模态桥接 三、多模态上下文学习&#xff08;M-ICL&#xff09;三、多模态思维链 (M-CoT)四、LLM辅助视觉推理1.训练范式2. LLM功能 五、一些思考总结 前言…

OS中断机制-外部中断触发

中断函数都定义在中断向量表中,外部中断通过中断跳转指令触发中断向量表中的中断服务函数,中断指令可以理解为由某个中断寄存器的状态切换触发的汇编指令,这个汇编指令就是中断跳转指令外部中断通过在初始化的时候使能对应的中断服务函数如何判断外部中断被触发的条件根据Da…

关于ONLYOFFICE8.1版本桌面编辑器测评——AI时代的领跑者

关于作者&#xff1a;个人主页 目录 一.产品介绍 1.关于ONLYOFFICE 2.关于产品的多元化功能 二.关于产品体验方式 1.关于套件的使用网页版登录 2.关于ONLYOFFICE本地版 三.关于产品界面设计 四.关于产品文字处理器&#xff08;Document Editor&#xff09; 1.电子表格&a…

昇思25天学习打卡营第6天 | 函数式自动微分

神经网络的训练主要使用反向传播算法&#xff0c; 模型预测值&#xff08;logits&#xff09;与正确标签&#xff08;label&#xff09;送入损失函数&#xff08;loss function&#xff09;获得loss&#xff0c; 然后进行反向传播计算&#xff0c;求得梯度&#xff08;gradie…

数据中心 250KW 水冷负载组概述

该负载专为数据中心冷水机组调试和测试应用而设计, 是一款紧凑的便携式产品&#xff0c;具有无限功率和水流控制功能&#xff0c;可实现精确的温升设置与施加的功率。鹦鹉螺是完全可联网的&#xff0c;可以从远程站控制单个或多个单元。 使用带有触摸屏 HMI 的 PLC&#xff0c;…

Navicat连接Oracle出现Oracle library is not loaded的解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 使用Navicat链接Oracle的时候,出现如下提示:Oracle library is not loaded. 截图如下所示: 2. 原理分析 通常是由于缺少必需的 Oracle 客户端库或环境变量未正确配置所致 还有一种情况是 32位与64位的不匹配:Navica…

基于Langchain-chatchat搭建本地智能知识问答系统

基于Langchain-chatchat搭建本地智能 搭建本地智能知识问答系统&#xff1a;基于Langchain-chatchat的实践指南引言项目概述环境安装Anacondapip 项目安装步骤大语言模型&#xff08;LLM&#xff09;的重要性结语 搭建本地智能知识问答系统&#xff1a;基于Langchain-chatchat的…

记错医院预约的日期,选择加号还是回去?

记错了去医院的日期&#xff0c;起了个大早&#xff0c;用了 90 分钟才到医院&#xff0c;取号时提示没有预约的号&#xff0c;才发现记错时间了。这个时候是选择找医生加号还是直接回去呢&#xff1f;如果是你怎么选择&#xff1f; 如果选择找医生加号&#xff0c;号会排到最后…

STM32 ---- F1系列内核和芯片系统架构 || 存储器映像 || 寄存器映射

一&#xff0c;存储器映像 STM32 寻址范围&#xff1a;2^32 4 * 2^10 *2^10 K 4 * 2^10 M 4G 地址所访问的存储单元是按字节编址的。 0x0000 0000 ~ 0xFFFF FFFF 什么是存储器映射&#xff1f; 存储器本身不具有地址信息&#xff0c;给存储器分配地址的…