MySQL——九、SQL编程

MySQL

  • 一、触发器
    • 1、触发器简介
    • 2、创建触发器
    • 3、一些常见示例
  • 二、存储过程
    • 1、什么是存储过程或者函数
    • 2、优点
    • 3、存储过程创建与调用
  • 三、存储函数
    • 1、存储函数创建和调用
    • 2、修改存储函数
    • 3、删除存储函数
  • 四、游标
    • 1、声明游标
    • 2、打开游标
    • 3、使用游标
    • 4、关闭游标
      • 游标案例

一、触发器

1、触发器简介

触发器(trigger)是一个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。

触发器经常用于加强数据的完整性约束和业务规则等。例如,当学生表中增加了一个学生的信息时,学生的总数就应该同时改变。因此可以针对学生表创建一个触发器,每次增加一个学生记录时,就执行一次学生总数的计算操作,从而保证学生总数与记录数的一致性。

2、创建触发器

语法结构:

CREATE TRIGGER 触发器名称 BEFORE|AFTER 触发事件
ON 表名 FOR EACH ROW
BEGIN触发器程序体;END
 # 说明:<触发器名称> 最多64个字符,它和MySQL中其他对象的命名方式一样{ BEFORE | AFTER }   触发器时机{ INSERT | UPDATE | DELETE } 触发的事件ON <表名称> 标识建立触发器的表名,即在哪张表上建立触发器FOR EACH ROW 触发器的执行间隔:FOR EACH ROW子句通知触发器 每隔一行执行一次动作,而不是对整个表执行一次<触发器程序体> 要触发的SQL语句:可用顺序,判断,循环等语句实现一般程序需要的逻辑功能

3、一些常见示例

1、示例1:

    1. 创建表
mysql>create table student(id int unsigned auto_increment primary key not null,name varchar(50)
);
mysql>insert into student(name) values('jack');create table student_total(total int);insert into student_total values(1);

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

    1. 创建触发器student_insert_trigger
mysql> delimiter $$
mysql> create trigger student_insert_trigger after inserton student for each rowBEGINupdate student_total set total=total+1;# 其他SQLEND$$
mysql> delimiter ;	

在这里插入图片描述
查看触发器

    1. 通过SHOW TRIGGERS语句查看
SHOW TRIGGERS\G

在这里插入图片描述

    1. 通过系统表triggers查看
USE information_schema
SELECT * FROM triggers\G
SELECT * FROM triggers WHERE TRIGGER_NAME='触发器名称'\G

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
删除触发器
通过DROP TRIGGERS语句删除

sql>  DROP TRIGGER 解发器名称

2、示例2

  • 1、创建表tab1
DROP TABLE IF EXISTS tab1;
CREATE TABLE tab1(id int primary key auto_increment,name varchar(50),sex enum('m','f'),age int
);

在这里插入图片描述

  • 2、创建表tab2
DROP TABLE IF EXISTS tab2;
CREATE TABLE tab2(id int primary key auto_increment,name varchar(50),salary double(10,2)
);

在这里插入图片描述

触发器tab1_after_delete_trigger
作用:tab1表删除记录后,自动将tab2表中对应记录删除

mysql> \d /
mysql> create trigger tab1_after_delete_trigger after delete  on  tab1 for each row    begin      delete from tab2 where name=old.name; end/

在这里插入图片描述
在这里插入图片描述

触发器tab1_after_update_trigger
作用:当tab1更新后,自动更新tab2

mysql> \d $$
mysql> create trigger tab1_after_update_trigger after update on tab1 for each row begin  update tab2 set name=new.name where name=old.name; end$$  

在这里插入图片描述
在这里插入图片描述

触发器tab1_after_insert_trigger
作用:当tab1增加记录后,自动增加到tab2

mysql> \d /
mysql> create trigger tab1_after_insert_triggerafter insert on tab1 for each rowbegin insert into tab2 values(null, name, 5000); end/

在这里插入图片描述
在这里插入图片描述

二、存储过程

1、什么是存储过程或者函数

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

  1. 函数必须有返回值,而存储过程没有。
  2. 存储过程的参数可以是IN、OUT、INOUT类型,函数的参数只能是IN

2、优点

  • 存储过程只在创建时进行编译;而SQL语句每执行一次就编译一次,所以使用存储过程可以提高数据库执行速度
  • 简化复杂操作,结合事务一起封装
  • 复用性好
  • 安全性高,可指定存储过程的使用权

注意:并发量少的情况下,很少使用存储过程。并发量高的情况下,为了提高效率,用存储过程比较多。

3、存储过程创建与调用

创建存储过程语法 :

create procedure sp_name(参数列表)[特性...]过程体存储过程的参数形式:[IN | OUT | INOUT]参数名 类型IN    输入参数OUT    输出参数INOUT  输入输出参数delimiter $$create procedure 过程名(参数列表)beginSQL语句end $$delimiter ;调用:call 存储过程名(实参列表)

存储过程三种参数类型:IN, OUT, INOUT

===================NONE========================
mysql> \d $
mysql> create procedure p1() 
begin 
select count(*) from mysql.user; 
end$
mysql> \d ;
mysql> call p1();
mysql> create table t1(
id int,
name varchar(50)
);  

在这里插入图片描述

mysql> delimiter $$
mysql> create procedure autoinsert1() 
begin 
declare i int default 1;  # int i = 1;
while(i<20000)do 
insert into t1 values(i, md5(i)); 
set i=i+1; 
end while;
end$$
mysql> delimiter ;

在这里插入图片描述

====================IN==========================
mysql> create procedure autoinsert2(IN a int) 
BEGIN
declare i int default 1;
while(i<=a)do 
insert into t1 values(i,md5(i));
set i=i+1; 
end while; 
END$$

在这里插入图片描述

mysql> call autoinsert2(10);
mysql> set @num=20;
mysql> select @num;
+------+
| @num |
+------+
|  20 |
+------+
mysql> call autoinsert2(@num);

在这里插入图片描述

====================OUT=======================
mysql> delimiter $$
mysql> CREATE PROCEDURE p2 (OUT param1 INT)
BEGIN
SELECT COUNT(*) INTO param1 FROM t1;
END$$
mysql> delimiter ;
mysql> select @a;
+------+
| @a  |
+------+
| NULL |
+------+

在这里插入图片描述

mysql> CALL p2(@a);
mysql> SELECT @a;
+------+
| @a  |
+------+
| 30  |
+------+

在这里插入图片描述

===================INOUT=====================
作用:统计指定部门的员工数
mysql> create procedure count_num(IN p1 varchar(50), OUT p2 int) 
BEGIN 
select count(*) into p2 from employee where post=p1; 
END$$
mysql> \d ;
mysql> call count_num('hr',@a);
mysql>select @a;

在这里插入图片描述
在这里插入图片描述

作用:统计指定部门工资超过例如5000的总人数
mysql> create procedure count_num(IN p1 varchar(50), IN p2 float(10,2), OUT p3 int) 
BEGIN 
select count(*) into p3 from employee where post=p1 and salary>=p2; 
END$$
mysql> \d ;
mysql> call count_num('hr',5000,@a);
====================INOUT======================
mysql> create procedure proce_param_inout(inout p1 int) 
begin 
if (p1 is not null) then 
set p1=p1+1; 
else 
select 100 into p1; 
end if; 
end$$
mysql> \d ;
mysql> select @h;
+------+
| @h  |
+------+
| NULL |
+------+

在这里插入图片描述

mysql> call proce_param_inout(@h);
mysql> select @h;
+------+
| @h  |
+------+
|  100 |
+------+
mysql> call proce_param_inout(@h);
mysql> select @h;
+------+
| @h  |
+------+
|  101 |
+------+

在这里插入图片描述

三、存储函数

MySQL存储函数(自定义函数),函数一般用于计算和返回一个值,可以将经常需要使用的计算或功能写成一个函数。函数和存储过程类似。

存储过程和函数的区别:

  1. 函数必须有返回值,而存储过程可以没有。
  2. 存储过程的参数可以是IN、OUT、INOUT类型,函数的参数只能是IN

1、存储函数创建和调用

创建存储函数
在MySQL中,创建存储函数使用CREATE FUNCTION关键字,其基本形式如下:

CREATE FUNCTION func_name ([param_name type[,...]])
RETURNS type
[characteristic ...]
BEGIN
routine_body
END;

参数说明:

  • (1)func_name :存储函数的名称。
  • (2)param_name type:可选项,指定存储函数的参数。type参数用于指定存储函数的参数类型,该类型可以是MySQL数据库中所有支持的类型。
  • (3)RETURNS type:指定返回值的类型。
  • (4)characteristic:可选项,指定存储函数的特性。
  • (5)routine_body:SQL代码内容。

调用存储函数
在MySQL中,存储函数的使用方法与MySQL内部函数的使用方法基本相同。用户自定义的存储函数与MySQL内部函数性质相同。区别在于,存储函数是用户自定义的。而内部函数由MySQL自带。其语法结构如下:

SELECT func_name([parameter[,]]);

常见示例
MySQL开启bin-log后,调用存储过程或者函数以及触发器时,会出现错误号为1418的错误:
在MySQL中创建函数时出现这种错误的解决方法:

  • 方法1:第一种是在创建子程序(存储过程、函数、触发器)时,声明为DETERMINISTIC或NO SQL与READS SQL DATA中的一个, 例如:
CREATE DEFINER = CURRENT_USER PROCEDURE `NewProc`()  DETERMINISTIC 
BEGIN #Routine body goes here... 
END;
  • 方法2:第二种是信任子程序的创建者,禁止创建、修改子程序时对SUPER权限的要求,设置log_bin_trust_routine_creators全局系统变量为1。
    • (1)在客户端上执行 SET GLOBAL log_bin_trust_function_creators = 1。
    • (2)MySQL启动时,加上–log-bin-trust-function-creators选项,参数设置为1。
    • (3)在MySQL配置文件my.ini或my.cnf中的[mysqld]段上加log-bin-trust-function-creators=1。
################1、无参有返回值#########################
# 统计emp表中员工个数
mysql> \d $
mysql> CREATE FUNCTION myf1() 
RETURNS int 
BEGIN 
DECLARE c INT DEFAULT 0; 
SELECT COUNT(1) INTO c FROM emp; 
RETURN c; 
END$
mysql> \d;
mysql> select myf1();
+--------+
| myf1() |
+--------+
|   15 |
+--------+
#################2、有参有返回值#####################
示例1:根据员工名返回工资
mysql> \d $
mysql> CREATE FUNCTION myf2(empName varchar(20)) 
RETURNS INT 
BEGIN 
DECLARE sal INT;
SELECT sai INTO sal FROM emp WHERE ename=empName; 
RETURN sal; 
END $
mysql> \d;
mysql> select myf2('刘备');
+----------------+
| myf2('刘备')  |
+----------------+
|      29750 |
+----------------+
示例2:根据部门编号,返回平均工资
mysql> \d $
mysql> CREATE FUNCTION myf3(d_No int) 
RETURNS DOUBLE 
BEGIN 
DECLARE avg_sal DOUBLE; 
SELECT AVG(sai) INTO avg_sal FROM emp WHERE deptno=d_No; 
RETURN avg_sal;
END $
mysql> \d ;
mysql> select myf3(20);
+----------+
| myf3(20) |
+----------+
|   21750 |
+----------+

2、修改存储函数

MySQL中,通过ALTER FUNCTION 语句来修改存储函数,其语法格式如下:

ALTER FUNCTION func_name [characteristic ...]
characteristic:COMMENT 'string'| LANGUAGE SQL| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }| SQL SECURITY { DEFINER | INVOKER }

上面这个语法结构是MySQL官方给出的,修改的内容可以包SQL语句也可以不包含。

3、删除存储函数

MySQL中使用DROP FUNCTION语句来删除存储函数。
示例:删除存储函数。

DROP FUNCTION IF EXISTS func_user;

四、游标

游标(Cursor)是处理多行数据的,游标需要开启,抓取,关闭的。
在 MySQL 中,存储过程或函数中的查询有时会返回多条记录,而使用简单的 SELECT 语句,没有办法得到第一行、下一行或前十行的数据,这时可以使用游标来逐条读取查询结果集中的记录。游标在部分资料中也被称为光标。
关系数据库管理系统实质是面向集合的,在 MySQL 中并没有一种描述表中单一记录的表达形式,除非使用 WHERE 子句来限制只有一条记录被选中。所以有时我们必须借助于游标来进行单条记录的数据处理。
一般通过游标定位到结果集的某一行进行数据修改。
结果集是符合 SQL 语句的所有记录的集合。
个人理解游标就是一个标识,用来标识数据取到了什么地方,如果你了解编程语言,可以把他理解成数组中的下标。
不像多数 DBMS,MySQL 游标只能用于存储过程和函数。
下面介绍游标的使用,主要包括游标的声明、打开、使用和关闭。

1、声明游标

MySQL 中使用 DECLARE 关键字来声明游标,并定义相应的 SELECT 语句,根据需要添加 WHERE 和其它子句。其语法的基本形式如下:

DECLARE cursor_name CURSOR FOR select_statement;

其中,cursor_name 表示游标的名称;select_statement 表示 SELECT 语句,可以返回一行或多行数据。
下面声明一个名为 nameCursor 的游标,代码如下:

mysql> DELIMITER //
mysql> CREATE PROCEDURE processnames()
BEGIN
DECLARE nameCursor CURSOR
FOR
SELECT name FROM tb_student;
END//

在这里插入图片描述
以上语句定义了 nameCursor 游标,游标只局限于存储过程中,存储过程处理完成后,游标就消失了。

2、打开游标

声明游标之后,要想从游标中提取数据,必须首先打开游标。在 MySQL 中,打开游标通过 OPEN 关键字来实现,其语法格式如下:

OPEN cursor_name;

其中,cursor_name 表示所要打开游标的名称。需要注意的是,打开一个游标时,游标并不指向第一条记录,而是指向第一条记录的前边。

在程序中,一个游标可以打开多次。用户打开游标后,其他用户或程序可能正在更新数据表,所以有时会导致用户每次打开游标后,显示的结果都不同。

3、使用游标

游标顺利打开后,可以使用 FETCH…INTO 语句来读取数据,其语法形式如下:

FETCH cursor_name INTO var_name [,var_name]...

上述语句中,将游标 cursor_name 中 SELECT 语句的执行结果保存到变量参数 var_name 中。变量参数 var_name 必须在游标使用之前定义。使用游标类似高级语言中的数组遍历,当第一次使用游标时,此时游标指向结果集的第一条记录。

MySQL 的游标是只读的,也就是说,你只能顺序地从开始往后读取结果集,不能从后往前,也不能直接跳到中间的记录。

4、关闭游标

游标使用完毕后,要及时关闭,在 MySQL 中,使用 CLOSE 关键字关闭游标,其语法格式如下:

CLOSE cursor_name;

CLOSE 释放游标使用的所有内部内存和资源,因此每个游标不再需要时都应该关闭。

在一个游标关闭后,如果没有重新打开,则不能使用它。但是,使用声明过的游标不需要再次声明,用 OPEN 语句打开它就可以了。

如果你不明确关闭游标,MySQL 将会在到达 END 语句时自动关闭它。游标关闭之后,不能使用 FETCH 来使用该游标。

游标案例

创建 users 数据表,并插入数据,SQL 语句和运行结果如下:

mysql> CREATE TABLE `users`(
`ID` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`user_name` VARCHAR(60),
`user_pass` VARCHAR(64),
PRIMARY KEY (`ID`)
);
mysql> INSERT INTO users VALUES(null,'liujianhong','liujianhong'),
(null,'liu','liu123'),
(null,'ling','ling123');

在这里插入图片描述
创建存储过程 test_cursor,并创建游标 cur_test,查询 users 数据表中的第 3 条记录,SQL 语句和执行过程如下:

mysql> DELIMITER //
mysql> CREATE PROCEDURE test_cursor (in param INT(10),out result VARCHAR(90))
BEGIN
DECLARE name VARCHAR(20);
DECLARE pass VARCHAR(20);
DECLARE done INT;
DECLARE cur_test CURSOR FOR SELECT user_name,user_pass FROM users;
DECLARE continue handler FOR SQLSTATE '02000' SET done = 1;
IF param THEN INTO result FROM users WHERE id = param;
ELSE
OPEN cur_test;
repeat
FETCH cur_test into name,pass;
SELECT concat_ws(',',result,name,pass) INTO result;
until done
END repeat;
CLOSE cur_test;
END IF;
END //
mysql> call test_cursor(3,@test)//
mysql> select @test//
+-----------+
| @test     |
+-----------+
| ling,ling123 |
+-----------+

创建 pro_users() 存储过程,定义 cur_1 游标,将表 users 中的 user_name 字段全部修改为 MySQL,SQL 语句和执行过程如下。

mysql> CREATE PROCEDURE pro_users()
BEGIN
DECLARE result VARCHAR(100);
DECLARE no INT;
DECLARE cur_1 CURSOR FOR SELECT user_name FROM users;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no=1;
SET no=0;
OPEN cur_1;
WHILE no=0 do
FETCH cur_1 into result;
UPDATE users SET user_name='MySQL'
WHERE user_name=result;
END WHILE;
CLOSE cur_1;
END //
mysql> call pro_users() //
mysql> SELECT * FROM users //
+----+-----------+-----------+
| ID | user_name | user_pass |
+----+-----------+-----------+
|  1 | MySQL     | liujianhon|
|  2 | MySQL     | liu123    |
|  3 | MySQL     | ying      |
+----+-----------+-----------+
3 rows in set (0.00 sec)

结果显示,users 表中的 user_name 字段已经全部修改为 MySQL。

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

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

相关文章

CoDeSys系列-3、Windows运行时软PLC主站和p-net从站IO设备组网测试

CoDeSys系列-3、Windows运行时软PLC主站和p-net从站IO设备组网测试 文章目录 CoDeSys系列-3、Windows运行时软PLC主站和p-net从站IO设备组网测试一、前言二、Windows运行时软plc配置编程1、安装Windows下的运行时扩展包&#xff08;非必要&#xff09;2、创建项目2.1、创建标准…

SHCTF 山河CTF Reverse方向[Week1]全WP 详解

文章目录 [WEEK1]ez_asm[WEEK1]easy_re[WEEK1]seed[WEEK1]signin[WEEK1]easy_math[WEEK1]ez_apk [WEEK1]ez_asm 从上往下读&#xff0c;第一处是xor 1Eh&#xff0c;第二处是sub 0Ah&#xff1b;逆向一下先加0A后异或1E 写个EXP data "nhuo[M7mc7uhc$7midgbTf7$7%#ubf7 …

不做学习的奴隶,更要注重生活

下面是国外社交软件 i n s ins ins上近 40 40 40万点赞的帖子。 “睡8小时&#xff0c;而不是6小时。 锻炼1小时&#xff0c;而不是4小时。 学习3小时&#xff0c;而不是10小时。 读书2小时&#xff0c;而不是5小时。 深度工作3小时&#xff0c;而不是12小时。 你是人&#xff…

ZYNQ连载03-Vivado创建工程

ZYNQ连载03-Vivado创建工程 1. 硬件参数 名称参数主控xc7z020clg400-2DDRMT41J256M16RE-125 2. 创建工程 3. 串口配置 4. DDR配置 5. SD配置 6. ETH配置 7. USB配置 8. 导出硬件 Generate Output ProductsCreate HDL WrapperExport Hardware Platform 执行以上步骤后&#…

【工具】FreePic2PDF+PdgCntEditor|PDF批量添加书签(Windows)

这俩软件都不大&#xff0c;比较便携。 FreePic2PDF&#xff1a; 我下载的来源&#xff1a;https://www.52pojie.cn/thread-1317140-1-1.html&#xff08;包含下载链接https://www.lanzoui.com/it4x6j4hbvc&#xff09;下载的结果&#xff1a;https://pan.baidu.com/s/1r8n5G42…

数据结构和算法(15):排序

快速排序 分治 快速排序与归并排序的分治之间的不同&#xff1a; 归并排序的计算量主要消耗于有序子向量的归并操作&#xff0c;而子向量的划分却几乎不费时间&#xff1b; 快速排序恰好相反&#xff0c;它可以在O(1)时间内&#xff0c;由子问题的解直接得到原问题的解&#…

如何分离一个要素的shp矢量文件:利用ArcGIS分割工具

下面介绍如何用ArcGIS对含有多个分离区域的一整个面要素进行分割 如下图&#xff0c;现在想要将下方的长形shp提取出来&#xff0c;首先打开shp文件&#xff1a; 右击空白处查看该矢量文件的投影信息&#xff1a; 在文件夹中新建shp文件&#xff0c;设置一样的投影&#xff1a…

回归预测 | MATLAB实现BO-BiLSTM贝叶斯优化双向长短期神经网络多输入单输出回归预测

回归预测 | MATLAB实现BO-BiLSTM贝叶斯优化双向长短期神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现BO-BiLSTM贝叶斯优化双向长短期神经网络多输入单输出回归预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 MATLAB实现BO-BiLSTM贝叶斯优化双向长…

Android OpenGL ES 2.0入门实践

本文既然是入门实践&#xff0c;就先从简单的2D图形开始&#xff0c;首先&#xff0c;参考两篇官方文档搭建个框架&#xff0c;便于写OpenGL ES相关的代码&#xff1a;构建 OpenGL ES 环境、OpenGL ES 2.0 及更高版本中的投影和相机视图。 先上代码&#xff0c;代码效果如下图…

SSH安全登录远程主机

SSH服务器简介 SSH即Security SHell的意思&#xff0c;它可以将连线的封包进行加密技术&#xff0c;之后进行传输&#xff0c;因此相当的安全。 SSH是一种协议标准&#xff0c;其目的是实现安全远程登录以及其它安全网络服务。 SSH协定&#xff0c;在预设的状态下&#xff0c;…

Android问题笔记四十一:JNI NewStringUTF错误的几种解决方案

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…

ITSource 分享 第5期【校园信息墙系统】

项目介绍 本期给大家介绍一个 校园信息墙 系统&#xff0c;可以发布信息&#xff0c;表白墙&#xff0c;分享墙&#xff0c;校园二手买卖&#xff0c;咨询分享等墙信息。整个项目还是比较系统的&#xff0c;分为服务端&#xff0c;管理后台&#xff0c;用户Web端&#xff0c;小…

刀具磨损状态识别(Python代码,MSCNN_LSTM_Attention模型,初期磨损、正常磨损和急剧磨损分类,解压缩直接运行)

1.运行效果&#xff1a;刀具磨损状态识别&#xff08;Python代码&#xff0c;MSCNN_LSTM_Attention模型&#xff0c;初期磨损、正常磨损和急剧磨损&#xff09;_哔哩哔哩_bilibili 环境库&#xff1a; NumPy 版本: 1.19.4 Pandas 版本: 0.23.4 Matplotlib 版本: 2.2.3 Keras …

SpringBoot小项目——简单的小区物业后台管理系统 认证鉴权 用户-角色模型 AOP切面日志 全局异常【源码】

目录 引出一、应用到的技术栈Spring、Spring MVC、Spring Boot基础SpringBoot进阶、SpringMVC原理、AOP切面MyBatis 数据库相关JavaWeb基础&#xff1a;Session等前端Vue、JavaScript、Bootstrap 二、后台管理系统的功能登录功能1.用户名密码登录2.验证码的登录 报修业务的处理…

电路器件认识与KV STUDIO的实践(二)

当当当当&#xff0c;下班了&#xff0c;下面来记录一下小编学习到的电气知识与plc的应用吧&#xff01;&#xff01;&#xff01; 目录 电路元器件的认识 断路器&#xff08;作用是过载保护、短路保护、地线故障保护和手动控制&#xff09; 漏电断路器&#xff08;当漏电电…

AC修炼计划(AtCoder Regular Contest 164)

传送门&#xff1a;AtCoder Regular Contest 164 - AtCoder A.签到题&#xff0c;在此不做赘述 B - Switching Travel 这题本来该是秒的&#xff0c;但是因为没有考虑清楚环的问题而被卡半天&#xff0c;其实我们不难发现&#xff0c;要想使题目存在节点&#xff0c;就得让该节…

【数据结构练习题】删除有序数组中的重复项

✨博客主页&#xff1a;小钱编程成长记 &#x1f388;博客专栏&#xff1a;数据结构练习题 &#x1f388;相关博文&#xff1a;消失的数字 — 三种解法超详解 删除有序数组中的重复项 1.&#x1f388;题目2. &#x1f388;解题思路3. &#x1f388;具体代码&#x1f387;总结 1…

【鸿蒙软件开发】ArkTS基础组件之TextClock(时间显示文本)、TextPicker(滑动选择文本)

文章目录 前言一、TextClock1.1 子组件1.2 接口参数TextClockController 1.3 属性1.4 事件1.5 示例代码 二、TextPicker2.1 子组件2.2 接口参数 2.3 属性2.4 事件2.5 示例代码 总结 前言 TextClock组件:通过文本将当前系统时间显示在设备上。支持不同时区的时间显示&#xff0…

ELASTICO-A Secure Sharding Protocol For Open Blockchains

INTRO 在中本聪共识中&#xff0c;通过POW机制来公平的选举leader&#xff0c;不仅非常消耗power&#xff0c;并且拓展性也不好。现在比特币中是7 TPS&#xff0c;和其他的支付系统相比效率相差甚远。 当前的许多拜占庭共识协议&#xff0c;并不支持在一个开放的环境中使用&a…

论文速递 TMC 2023 | RoSeFi: 一种利用商用WiFi设备进行稳健的久坐行为监测系统

注1:本文系“最新论文速览”系列之一,致力于简洁清晰地介绍、解读最新的顶会/顶刊论文 TMC 2023 | RoSeFi: 一种利用商用WiFi设备进行稳健的久坐行为监测系统 原文链接:https://ieeexplore.ieee.org/abstract/document/10269067 本文提出了一种稳健的久坐行为监测系统RoSeFi。…