MySQL存储过程和函数(超详细)

MySQL存储过程和函数

一、什么是存储过程

存储过程就是一些SQL语句的集合,可以简单理解为类似Java中的一个接口函数,函数里面可以使用查询SQL、流程控制语句、定义参数、条件等,用来实现更复杂逻辑的处理。

二、存储过程的作用(优点)

1.执行速度更快(因为不需要从应用程序调用MySQL服务,减少了获取连接、网络传输的耗时)

2.相比普通SQL实现了复杂的逻辑处理。比如可以应用在测试数据的预置,有时我们在性能测试的时候,需要预置大量的测试数据,利用代码当然能实现预置测试数据,但是一方面测试代码有时候是不能上传到测试环境的,修改发布也不方便。这时候用存储过程就可以轻松修改变量,直接在数据库中执行。

三、存储过程的缺点

  1. 书写复杂的存储过程,会显得晦涩难懂。

  2. 存储过程难以调试,很少工具可以调试存储过程,使得开发和维护都不容易。

  3. 不能移植,存储过程只能在数据中执行。

四、创建存储过程

1.具体语法详解

CREATE PROCEDURE sp_name ([proc_parameter])
[characteristice ...] routine_body
  • CREATE PROCEDURE:创建存储过程的关键字

  • sp_name:存储过程的名称

  • proc_parameter:存储过程的参数列表,列表形式如 [IN | OUT | INOUT] param_name type

    • IN:输入

    • OUT:输出

    • INOUT:输入或输出

    • param_name:参数名

    • type:参数类型,可以是MySQL数据库中的任意类型

  • characteristics:存储过程的特性,有以下取值

    • LANGUAGUE SQL:说明routine_body部分是由SQL语句组成的,当前系统支持的语言为SQL。SQL是LANGUAGE特性的唯一值

    • [NOT]DETERMINISTIC:存储过程执行的结果是否确定。DETERMINISTIC表示是确定的,输入相同的参数,只会得到相同的结果。如果没有指定值,默认为 NOT DETERMINISTIC。

    • { CONTAINTS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }:指明子程序使用SQL语句的限制

      • CONTAINTS SQL:表明子程序包含SQL语句,但不包含读写数据的语句

      • NO SQL:表明子程序不包含SQL语句

      • READS SQL DATA:表明子程序包含读写数据的语句

      • MODIFIES SQL DATA:表明子程序包含读写数据的语句

      • 默认默认为 CONTAINTS SQL

    • SQL SECURITY{ DEFINER | INVOKER }:指明谁有权执行

      • DEFINER:表示只有定义者才能执行

      • INVOKER:表示有权调用者可以执行

      • 系统默认为 DEFINER

    • COMMENT 'string':注释信息

2.例子

创建表

CREATE TABLE fruits(
id bigint primary key auto_increment,
number varchar(255),
name varchar(255),
price double
);

创建存储过程,求平均值

DELIMITER //
CREATE PROCEDURE avgPrice( )
BEGINSELECT AVG(price) AS avgprice FROM fruits;
END;//

DELIMITER // 的意思是将MySQL的结束符改为 //, 输入 ; 就不会被识别为结束符而误执行。后面的例子,我都是将结束符定义为//的前提来举例的。

查看创建的存储过程

mysql> show procedure status like 'a%'\G
​
*************************** 1. row ***************************Db: dh_sysName: avgPriceType: PROCEDURELanguage: SQLDefiner: root@localhostModified: 2024-06-22 16:16:41Created: 2024-06-22 16:16:41Security_type: DEFINERComment: 
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ciDatabase Collation: utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

创建带参数的存储过程

CREATE PROCEDURE CountProc(OUT param1 INT)
​
BEGIN 
​
SELECT COUNT(*) INTO param1 FROM fruits;
​
END; //

五、创建存储函数

1.具体语法详解

CREATE FUNCTION func_name([func_parameter])
​
RETURNS type
​
[characteristic ...] routine_body
  • CREATE FUNCTION:创建存储函数的关键字

  • func_name:存储函数的名称

  • func_parameter:存储函数的参数列表,列表形式如 [IN | OUT | INOUT] param_name type

    • IN:输入

    • OUT:输出

    • INOUT:输入或输出

    • param_name:参数名

    • type:参数类型,可以是MySQL数据库中的任意类型

  • RETURNS type:函数返回结果的类型

  • characteristics:存储过程的特性,和存储函数的一致

2.例子

set global log_bin_trust_function_creators=TRUE;
​
CREATE FUNCTION getName()
​
RETURNS varchar(255)
​
RETURN (select name from fruits where id = 1);//

如果不设置log_bin_trust_function_creators,调用会报错

六、调用存储过程和函数

1.具体语言详解

调用存储函数

CALL sp_name([parameter[,..]])
  • CALL:调用存储过程关键字

  • sp_name:存储过程名称

  • parameter:参数列表

调用函数

SELECT function_name([parameter[,..]])

2.例子

创建一个加法存储过程并调用

CREATE PROCEDURE myProcedure(IN num1 INT, IN num2 INT, OUT num3 INT)
BEGINset num3 = num1 + num2;
END;
mysql> call myProcedure(100,20,@num);-> //
Query OK, 0 rows affected (0.00 sec)
mysql> select @num;//
+------+
| @num |
+------+
| 120 |
+------+
1 row in set (0.00 sec)

创建加法函数并调用

CREATE FUNCTION myFunction(num1 INT, num2 INT)
RETURNS INT
BEGINDECLARE num3 INT DEFAULT 0;set num3 = num1 + num2;RETURN num3;
END;
mysql> select myFunction(100, 30);//
+---------------------+
| myFunction(100, 30) |
+---------------------+
|         130 |
+---------------------+
1 row in set (0.01 sec)

可以看出存储过程和函数的调用区别

  • 存储过程可以直接调用,不依赖select语句,函数则必须使用在语句中

  • 存储过程的参数需要标记IN OUT,函数的参数中不带IN OUT

  • 存储过程没有返回参数,函数需要定义返回参数RETURNS type,并使用RETRUN返回

七、变量的使用

声明变量,在存储过程或函数中使用

1.具体语法详解

1.1定义变量
DECLARE var_name[,var_name]... data_type [DEFAULT value];

  • DECLARE:定义变量的关键字

  • var_name:变量名

  • data_type:变量类型

  • DEFAULT:默认值,如果没有设置默认是NULL

1.2为变量赋值
SET var_name = expr [,var_name = expr]...;

expr 可以是常量、另一个变量、表达式

2.例子

DECLARE a_param INT DEFAULT 10; //
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE a_param INT DEFAULT 10' at line 1

这样直接在MySQL执行会报错,为什么?变量仅在存储过程或者函数中使用,不能单独定义。

正确的用法是放到存储过程中去

CREATE PROCEDURE procHasDefineParam()
BEGIN
DECLARE a_param INT; 
set a_param =  100;
END;//

八、定义条件和处理程序

在执行的存储过程或函数的过程中,在遇到错误时,通过定义的错误类型的处理程序,执行自定义的逻辑。

1.具体语法详解

1.1定义条件
DECLARE condition_name CONDITION FOR [condition_type]
[condition_type]:
SQLSTATE [VALUE] sqlstate_value | mysql_error_code
  • DECLARE:定义条件关键字

  • condition_name:条件名

  • CONDITION FOR:条件为...类型的关键字

  • condition_type:条件类型

  • sqlstate_value:长度为5的字符串类型错误码

  • mysql_error_code:数值类型错误码

  • sqlstate_value和mysql_error_code都可以表示MySQL的错误。

    例如,ERROR 1142(42000)中,sqlstate_value的值是42000,mysql_error_code的值是1142

1.2定义处理程序
DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement
handler_type:CONTINUE | EXIT | UNDO
condition_value:SQLSTATE [VALUE] sqlstate_value
| condition_name
| SQLWARNING
| NOT FOUND
| SQLEXCEPTION
| mysql_error_code
  • DECLARE:定义处理程序关键字

  • handler_type:错误处理方式,有三个值

    • CONTINUE:遇到错误不处理,继续执行

    • EXIT:遇到错误马上退出

    • UNDO:遇到错误撤回之前的操作,MySQL中暂时不支持这样的操作

  • condition_value:表示错误类型,可以有以下取值

    • SQLSTATE [VALUE] sqlstate_value:包含5个字符的字符串错误值

    • condition_name:表示DECLARE CONDITION定义的错误条件名称

    • SQLWARNING:匹配所有以01开头的SQLSTATE错误代码

    • NOT FOUND:匹配所有以02开头的SQLSTATE错误代码

    • SQLEXCEPTION :匹配所有没有被SQLWARNING或NOT FOUND捕获的SQLSTATE错误码

    • MySQL_error_code:匹配数值类型错误码

    • sp_statement:程序语句段,表示在遇到定义的错误时,需要执行的存储过程或函数

2.例子

思路:创建一张fruits表,定义一个主键id,利用插入相同ID的数据,模拟出错误码’23000‘主键冲突的场景。测试handler处理程序跳过错误,继续执行存储过程。

CREATE TABLE fruits(
id bigint primary key auto_increment,
number varchar(255),
name varchar(255),
price double
);
mysql> CREATE PROCEDURE handlertest()-> BEGIN-> DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 100; -> SET @x1 = 1;-> INSERT INTO fruits(id,number,name,price) VALUES (10, 'banana' ,'香蕉' , 20);-> SET @x1 = 2;-> INSERT INTO fruits(id,number,name,price) VALUES (10, 'banana' ,'香蕉' , 20);-> SET @x1 = 3;-> END;-> //
Query OK, 0 rows affected (0.00 sec)mysql> call handlertest();//
Query OK, 0 rows affected (0.00 sec)mysql> select @x1;//
+------+
| @x1  |
+------+
|    3 |
+------+
1 row in set (0.00 sec)mysql> select @x2;//
+------+
| @x2  |
+------+
|  100 |
+------+
1 row in set (0.00 sec)

从结果可以看出,在插入第二条SQL后,应该会报错的,由于handler的作用,@x1还是执行了,修改了参数值为3。错误发生时的sp_statement也执行了,将@x2参数值修改为100。

九、光标

查询语句可能返回多条记录,如果数据量非常大,需要在存储过程和函数中使用光标来逐条读取查询结果集中的记录。

1.具体语法解析

1.1创建光标
DECLARE cursor_name CURSOR FOR select_statement
1.2打开光标
OPEN cursor_name
1.3使用光标
FETCH cursor_name INTO var_name [, var_name]... [参数名]
1.4关闭光标
CLOSE cursor_name
  • DECLARE:声明光标的关键字

  • cursor_name:光标的名称

  • CURSOR FOR:光标作用在...地方的关键字

  • select_statement:具体执行的语句

  • OPEN:打开光标的关键字

  • FETCH:使用光标的关键字

  • CLOSE:关闭光标关键字

2.例子

创建一个存储过程cursorDemo,定义好参数,找不到数据的处理程序,开启光标,循环执行光标取数,将光标读取的数据打印,退出条件为HANDLER NOT FOUND将is_exit修改为1(跳出循环的条件)。实现将fruits表的每一行打印输出

CREATE PROCEDURE cursorDemo()
BEGINDECLARE is_exit INT DEFAULT 0;DECLARE row_id INT;DECLARE row_cur_number VARCHAR(255);DECLARE row_cur_name VARCHAR(255);DECLARE cur CURSOR FOR SELECT id, number, name FROM fruits;DECLARE CONTINUE HANDLER FOR NOT FOUND SET is_exit = 1;OPEN cur;read_loop: LOOPFETCH cur INTO row_id, row_cur_number, row_cur_name;IF is_exit THENLEAVE read_loop;END IF;-- 这里可以进行你需要的操作-- 比如打印或者插入到其他表SELECT row_id, row_cur_number, row_cur_name;END LOOP; CLOSE cur;
END; //

十、流程控制的使用

流程控制语句用来根据条件控制语句的执行。MySQL的流程控制语句有IF、CASE、LOOP、LEAVE、ITERATE、REPEAT、WHILE。

1.IF语句

条件判断语句,值只能是true,false

IF expr_condition THEN statement_list[ELSEIF expr_condition THEN statement_list] ...[ELSE statement_list]
END IF

2.CASE语句

条件判断语句,值可以是true,false,或者其他

CASE case_exprWHEN when_value THEN statement_list[WHEN when_value THEN statement_list]...[ELSE statement_list]
END CASE

3.LOOP语句

用来循环重复执行某些语句

[loop_label:] LOOPstatement_list
END LOOP [loop_label]

4.LEAVE语句

用来退出任何被标注的流程控制构造

LEAVE label

5.ITERATE语句

将执行顺序转到语句开头处。

ITERATE只可以出现在LOOP、REPEAT和WHILE语句内。ITERATE的意思为再次循环某个标签的语句

ITERATE label

6.REAPEAT语句

创建一个带条件判断的循环过程,每次语句执行完毕后,会对条件表达式进行判断,如果为真则循环结束,否则执行循环中的语句。

[repeat_label:] REPEATstatement_list
UNTIL expr_condition
END REPEAT [repeat_label]

7.WHILE语句

创建一个带条件判断的循环过程,与REPEAT相反,WHILE对条件表达式进行判断,如果为真则执行,否则退出循环。

[while_label:] WHILE expr_condition DO statement_list
END WHILE [while_label]

7.例子

通过while加条件判断退出循环

定义参数param_a值为0,一直自增直到值大于5退出

CREATE PROCEDURE ifdemo()
BEGINDECLARE param_a INT;SET param_a = 0;
add_loop: while param_a <> -1 DOIF param_a > 5 THEN SET param_a = -1;ELSE SET param_a = param_a + 1;END IF;select param_a;
END WHILE;
END;//

通过条件判断,LEAVE的方式退出循环

CREATE PROCEDURE leavedemo()
BEGINDECLARE id INT DEFAULT 0;add_num: LOOP SET id = id + 1;select id;IF id = 10 THEN LEAVE add_num;END IF;END LOOP add_num;
END;

CASE根据值执行不同的语句

CREATE PROCEDURE casedemo()
BEGINDECLARE id INT DEFAULT 0;SET id = 10;CASE idWHEN 10 THEN select 'id 等于10';WHEN 20 THEN select 'id 等于20';ELSE select 'id 等于' + id;END CASE;
END;

REPEATE循环重复执行,直到id>=10结束

CREATE PROCEDURE repeatedemo()
BEGINDECLARE id INT DEFAULT 0;REPEAT SET id = id + 1;UNTIL id >= 10END REPEAT;select id;
END;

ITERATE循环重复执行,直到id>=10结束

CREATE PROCEDURE iteratedemo()
BEGINDECLARE id INT DEFAULT 0;add_loop: LOOPSET id = id + 1;select id;IF id < 10 THEN ITERATE add_loop;ELSEIF id >=10 THEN LEAVE add_loop;END IF;END LOOP add_loop;
END;

十一、查看存储过程和函数

MySQL存储了存储过程和函数的状态信息,可以使用SHOW STATUS语句或SHOW CREATE语句来查看,也可以直接从系统的information_schema数据库中查询。

1.具体语法解析

1.1使用SHOW STATUS查看状态信息
SHOW [PROCEDURE|FUNCTION] STATUS LIKE 'pattern'

例如,查看以“i”开头的存储过程

mysql> SHOW PROCEDURE STATUS LIKE 'i%'\G
​
*************************** 1. row ***************************Db: dh_sysName: ifdemoType: PROCEDURELanguage: SQLDefiner: root@localhostModified: 2024-06-23 15:54:07Created: 2024-06-23 15:54:07Security_type: DEFINERComment: 
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ciDatabase Collation: utf8mb4_0900_ai_ci
*************************** 2. row ***************************Db: dh_sysName: iteratedemoType: PROCEDURELanguage: SQLDefiner: root@localhostModified: 2024-06-23 17:13:49Created: 2024-06-23 17:13:49Security_type: DEFINERComment: 
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ciDatabase Collation: utf8mb4_0900_ai_ci
2 rows in set (0.00 sec)

备注:

  • “\G”、“\g”、“;” 都是用来作为SQL语句的结束符

  • “\g”、“;”作用完全等价

  • “\G”是将字段横排显示转换成纵列显示。

1.2使用SHOW CREATE查看创建语句
SHOW CREATE [ PROCEDURE | FUNCTION ] sp_name

例如,查看iteratedemo的存储过程

mysql> SHOW CREATE PROCEDURE dh_sys.iteratedemo \G
​
*************************** 1. row ***************************Procedure: iteratedemosql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTIONCreate Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `iteratedemo`()
BEGIN
DECLARE id INT DEFAULT 0;
add_loop: LOOP
SET id = id + 1;
select id;
IF id < 10 THEN ITERATE add_loop;
ELSEIF id >=10 THEN LEAVE add_loop;
END IF;
END LOOP add_loop;
END
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ciDatabase Collation: utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

1.3从information_schema.Routines查看存储过程和存储函数
SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME = 'sp_name';
  • information_schema.Routines:MySQL中存储过程和函数信息存储在这张表

  • ROUTINE_NAME:存储过程和函数名称关键字

  • sp_name:存储过程/函数名

例如,查看casedemo存储过程

mysql> SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME = 'casedemo';\G
​
*************************** 1. row ***************************SPECIFIC_NAME: casedemoROUTINE_CATALOG: defROUTINE_SCHEMA: dh_sysROUTINE_NAME: casedemoROUTINE_TYPE: PROCEDUREDATA_TYPE: 
CHARACTER_MAXIMUM_LENGTH: NULLCHARACTER_OCTET_LENGTH: NULLNUMERIC_PRECISION: NULLNUMERIC_SCALE: NULLDATETIME_PRECISION: NULLCHARACTER_SET_NAME: NULLCOLLATION_NAME: NULLDTD_IDENTIFIER: NULLROUTINE_BODY: SQLROUTINE_DEFINITION: BEGIN
DECLARE id INT DEFAULT 0;
SET id = 10;
CASE id
WHEN 10 THEN select 'id 等于10';
WHEN 20 THEN select 'id 等于20';
ELSE select 'id 等于' + id;
END CASE;
ENDEXTERNAL_NAME: NULLEXTERNAL_LANGUAGE: SQLPARAMETER_STYLE: SQLIS_DETERMINISTIC: NOSQL_DATA_ACCESS: CONTAINS SQLSQL_PATH: NULLSECURITY_TYPE: DEFINERCREATED: 2024-06-23 16:54:06LAST_ALTERED: 2024-06-23 16:54:06SQL_MODE: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTIONROUTINE_COMMENT: DEFINER: root@localhostCHARACTER_SET_CLIENT: utf8mb4COLLATION_CONNECTION: utf8mb4_0900_ai_ciDATABASE_COLLATION: utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
​

十二、修改存储过程和函数

1.具体语法解析

ALTER [PROCEDURE|FUNCTION] sp_name [characteristic...]
  • ALTER PROCEDURE:选择创建存储过程的关键字

  • sp_name:存储过程的名称

  • proc_parameter:存储过程的参数列表,列表形式如 [IN | OUT | INOUT] param_name type

    • IN:输入

    • OUT:输出

    • INOUT:输入或输出

    • param_name:参数名

    • type:参数类型,可以是MySQL数据库中的任意类型

  • characteristics:存储过程的特性,有以下取值

    • LANGUAGUE SQL:说明routine_body部分是由SQL语句组成的,当前系统支持的语言为SQL。SQL是LANGUAGE特性的唯一值

    • [NOT]DETERMINISTIC:存储过程执行的结果是否确定。DETERMINISTIC表示是确定的,输入相同的参数,只会得到相同的结果。如果没有指定值,默认为 NOT DETERMINISTIC。

    • { CONTAINTS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }:指明子程序使用SQL语句的限制

      • CONTAINTS SQL:表明子程序包含SQL语句,但不包含读写数据的语句

      • NO SQL:表明子程序不包含SQL语句

      • READS SQL DATA:表明子程序包含读写数据的语句

      • MODIFIES SQL DATA:表明子程序包含读写数据的语句

      • 默认默认为 CONTAINTS SQL

    • SQL SECURITY{ DEFINER | INVOKER }:指明谁有权执行

      • DEFINER:表示只有定义者才能执行

      • INVOKER:表示有权调用者可以执行

      • 系统默认为 DEFINER

    • COMMENT 'string':注释信息

例如,将casedemo的 SECURITY_TYPE,由“DEFINER”改为“INVOKER”,定义者才能执行->调用者可以执行

mysql> ALTER PROCEDURE casedemo MODIFIES SQL DATA SQL SECURITY INVOKER;//
Query OK, 0 rows affected (0.00 sec)
​
mysql> SELECT SPECIFIC_NAME,SQL_DATA_ACCESS,SECURITY_TYPE FROM information_schema.Routines WHERE ROUTINE_NAME = 'casedemo';//
+---------------+-------------------+---------------+
| SPECIFIC_NAME | SQL_DATA_ACCESS   | SECURITY_TYPE |
+---------------+-------------------+---------------+
| casedemo      | MODIFIES SQL DATA | INVOKER       |
+---------------+-------------------+---------------+
1 row in set (0.00 sec)

十三、删除存储过程和函数

1.具体语法解析

DROP [PROCEDURE|FUNCTION] [IF EXISTS] sp_name
  • DROP:删除关键字

  • PROCEDURE|FUNCTION:表示删除存储过程或者函数

  • IF EXISTS:判断存储过程/函数是否存在,防止删除报错

  • sp_name:存储过程/函数名

例如,删除testProcedureDrop

mysql> CREATE PROCEDURE testProcedureDrop() BEGIN END;//
Query OK, 0 rows affected (0.00 sec)
​
mysql> DROP PROCEDURE testProcedureDrop;//
Query OK, 0 rows affected (0.00 sec)

十四、全局变量的持久化

MySQL数据库中,全局变量可以通过SET GLOBAL语句来设置。

例如,设置服务器语句超时的限制

SET GLOBAL MAX_EXECUTION_TIME = 2000;

MySQL 8.0版本新增了SET PERSIST命令。

例如,设置服务器的最大连接数为1000

mysql> SHOW VARIABLES LIKE '%max_connection%';//
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| max_connections        | 151   |
| mysqlx_max_connections | 100   |
+------------------------+-------+
2 rows in set (0.01 sec)
​
mysql> SET PERSIST max_connections = 1000;//
Query OK, 0 rows affected (0.00 sec)
​
mysql> SHOW VARIABLES LIKE '%max_connection%';//
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| max_connections        | 1000  |
| mysqlx_max_connections | 100   |
+------------------------+-------+
2 rows in set (0.00 sec)

=========================================================================
创作不易,请勿直接盗用,使用请标明转载出处。

喜欢的话,一键三连,您的支持是我一直坚持高质量创作的原动力。

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

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

相关文章

【期末速成】计算机操作系统 EP04 | 学习笔记

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、正文&#xff1a;☀️☀️☀️2.1 考点七&#xff1a;进程通信2.2 考点八&#xff1a;线程的概念2.3 考点九&#xff1a;处理机调度的概念及原则2.4 考点十&#xff1a;调度方式与调度算法 一、前言&#x1f680;…

常见的行为型设计模式

设计模式(三) 常见的行为型模式 1.模板方法模式: 模版模式定义了一个操作的整体流程, 子类可以在不改变算法结构的情况下&#xff0c;重新定义算法中的某些步骤. 假设我们有一个制作饮料的算法框架&#xff0c;这个算法包括以下步骤&#xff1a; 烧水泡制饮料&#xff08;如…

react+customize-cra使用less+less-loader时,可能遇到的问题及解决办法

目录 1、先附上各依赖版本和config-overrides.js配置代码&#xff0c;按这个版本和配置就没问题 2、问题&#xff08;注意&#xff1a;问题顺序没有先后之分哦&#xff09; 2.1、TypeError: Cannot read property tap of undefined 2.2、No module factory available for d…

资金常见业务

资金业务在银行运营中扮演着举足轻重的角色&#xff0c;不仅是重要的资金运用渠道&#xff0c;也是银行资金来源的重要一环。除了通过贷款获取收益外&#xff0c;银行还通过多元化的资金业务实现资金的增值。 资金业务按其性质可以分为多个类别&#xff0c;包括长短期资金业务、…

阐述Python:except的用法和作用?

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

网络配置(IP、NETMASK、GATEWAY、DNS、DHCP) <持续更新中>

参考&#xff1a; 初学Linux之网络配置(IP、NETMASK、GATEWAY、DNS、DHCP)-CSDN博客【学习笔记】网关 & 路由_网关和路由-CSDN博客【学习笔记】计算机网络 IP地址与MAC地址_根据mac分配ip-CSDN博客【学习笔记】TCP 和 UDP 协议_tcp 发送 syn 应答没有syn ack-CSDN博客 一…

一次进程虚拟内存占用超过200G问题分析

在对智驾软件系统资源进行分析时&#xff0c;发现一个进程虚存占用过高&#xff0c;超过200G top查看内存占用 有一个node应用占用了200G的虚拟内存 pmap查看该进程内存情况 pmap -x -p 8496结果显示有两个异常点&#xff0c;刚好和虚存使用总量吻合 一个50G和一个170G的堆…

Linux: network: 丢包分析的另一个途径 tracing

丢包的另一个思路&#xff0c;内核里有些counter的计数&#xff0c;记录的不准确。这个时候怎么办&#xff1f;就需要使用另外一个方式&#xff1a;/sys/kernel/debug/tracing/event/skb/kfree_skb 的跟踪功能。这个算是对counter的一个补充&#xff0c;可以拿来做统计分析使用…

udp Socket组播 服务器

什么是组播 组播也可以称之为多播这也是 UDP 的特性之一。组播是主机间一对多的通讯模式&#xff0c;是一种允许一个或多个组播源发送同一报文到多个接收者的技术。组播源将一份报文发送到特定的组播地址&#xff0c;组播地址不同于单播地址&#xff0c;它并不属于特定某个主机…

【云原生】最新版Kubernetes集群基于Containerd部署

Kubernetes集群基于Containerd部署 文章目录 Kubernetes集群基于Containerd部署资源列表基础环境一、基础环境准备1.1、关闭Swap分区1.2、添加hosts解析1.3、桥接的IPv4流量传递给iptables的链 二、准备Containerd容器运行时2.1、安装Containerd2.2、配置Containerd2.3、启动Co…

智慧校园-医务管理系统总体概述

智慧校园医务管理系统&#xff0c;作为校园健康管理体系的智能化升级&#xff0c;深度融合信息技术与医疗服务&#xff0c;为师生构筑起一道全方位的健康守护网。医务管理系统以提升校园医疗服务水平、优化健康管理流程为核心目标&#xff0c;通过一系列创新功能&#xff0c;确…

MYSQL函数进阶详解:案例解析(第19天)

系列文章目录 一、MySQL的函数&#xff08;重点&#xff09; 二、MySQL的窗口函数&#xff08;重点&#xff09; 三、MySQL的视图&#xff08;熟悉&#xff09; 四、MySQL的事务&#xff08;熟悉&#xff09; 文章目录 系列文章目录前言一、MySQL的函数1. 聚合函数2. group_c…

从入口文件搭建php项目

入口文件index.php <?phprequire CallBack.php; // 处理回调请求逻辑 $bot new CallBack();// 请求方式 if (isset($_GET[method])) {$method $_GET[method];if (method_exists($bot, $method)) {return $bot->$method();} else {echo "没有该功能";die();…

Deep Learning复习笔记0

Key Concept: Embedding: learned dense, continuous, low-dimensional representations of object 【将难以表示的对象(如图片&#xff0c;文本等)用连续的低维度的方式表示】 RNN: Recurrent Neural Network -> for processing sequential data (time series data, natur…

【单片机毕业设计选题24035】-基于STM8的便携式智能药盒控制系统

系统功能: 基于STM8的便携式智能药盒控制系统设计的总体方案设计&#xff0c;目前确定的模块主要有&#xff1a; STM8、蓝牙模块、时钟芯片、时钟和复位电路、压力传感器、声光报警电路、按键模块、系统电源模块构成。 STM8&#xff1a;核心控制器&#xff0c;完成各模块的控…

“中国象棋第一人”王天一被查:到底是因作弊还是受贿?

“中国象棋第一人”王天一被查&#xff1a;到底是因作弊还是受贿&#xff1f; 近日&#xff0c;中国象棋界掀起了一场巨大的风波&#xff0c;被誉为“中国象棋第一人”的王天一被查的消息引起了广泛的关注与热议。据悉&#xff0c;王天一因涉嫌非国家工作人员受贿被有关部门依…

npm常用命令详解与实践

npm&#xff08;Node Package Manager&#xff09;是一个JavaScript编程语言的包管理器&#xff0c;它是Node.js的默认包管理工具。npm用于管理项目中的依赖关系&#xff0c;安装、更新和发布包。 以下是一些常用的npm命令及其详解和实践示例&#xff1a; 1. npm init 初始化…

分数限制下,选好专业还是选好学校?过来人跟你说

声明&#xff1a;本文都是实在话&#xff0c;面向普通人&#xff0c;不喜勿喷。 首先呢&#xff0c;尊重你的特长和兴趣&#xff0c;有特别想去的专业或者特别想去的学校当然别犹豫。 不过呢&#xff0c;大部分人没什么特长也没什么特别喜好&#xff0c;咋选呢&#xff1f; 对大…

pc端制作一个顶部固定的菜单栏

效果 hsl颜色 hsl颜色在css中比较方便 https://www.w3school.com.cn/css/css_colors_hsl.asp 色相&#xff08;hue&#xff09;是色轮上从 0 到 360 的度数。0 是红色&#xff0c;120 是绿色&#xff0c;240 是蓝色。饱和度&#xff08;saturation&#xff09;是一个百分比值…

i-Health

技术栈&#xff1a;HTMLCSSJavascriptPHP