《SQL基础》14. 存储过程 · 存储函数
存储过程 · 存储函数
- 存储过程
- 基本语法
- 变量
- 系统变量
- 用户定义变量
- 局部变量
- if判断
- 参数
- case判断
- while循环
- repeat循环
- loop循环
- 游标
- 条件处理程序
- 存储函数
存储过程
存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合。调用存储过程可以简化应用开发人员的工作,减少数据在数据库和应用服务器之间的传输,能够提高数据处理的效率。存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
特点:
- 封装,复用
- 可以接收参数,也可以返回数据
- 减少网络交互,提升效率
基本语法
创建存储过程:
CREATE PROCEDURE 存储过程名称([参数列表])
BEGINsql语句1;...sql语句n;
END;
在命令行中,执行创建存储过程的SQL时,需要通过关键字 delimiter 指定SQL语句的结束符。
调用存储过程:
CALL 存储过程名([参数]);
查询指定数据库的存储过程及状态信息:
SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = '数据库名';
查询某个存储过程的定义:
SHOW CREATE PROCEDURE 存储过程名;
删除数据库名:
DROP PROCEDURE [IF EXISTS] 存储过程名称;
示例,设 student表 在 test1库 中:
CREATE TABLE student(id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',name VARCHAR(10) COMMENT '姓名',stuno VARCHAR(10) COMMENT '学号'
) COMMENT '学生表';INSERT INTO student VALUES(null, '黛绮丝', '2000100101'), (null, '谢逊', '2000100102'), (null, '殷天正', '2000100103'), (null, '韦一笑', '2000100104');# 创建存储过程
CREATE PROCEDURE p1()
BEGINSELECT COUNT(*) FROM student;
END;# 调用存储过程
CALL p1();# 查询test1数据库的存储过程及状态信息
SELECT * FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA = 'test1';# 查询p1存储过程的定义
SHOW CREATE PROCEDURE p1;# 删除存储过程
DROP PROCEDURE IF EXISTS p1;
如果是在命令行中创建存储过程:
# 先通过关键字 delimiter 指定SQL语句的结束符为 “$$”(可随意指定)
DELIMITER $$# 然后可进行存储过程创建
CREATE PROCEDURE p1()
BEGINSELECT COUNT(*) FROM student;
END$$# 最后将结束符再修改为“;”
DELIMITER ;
变量
在MySQL中变量分为三种类型:系统变量、用户定义变量、局部变量。
系统变量
系统变量是MySQL服务器提供,不是用户定义的,属于服务器层面。分为全局变量(GLOBAL)、会话变量(SESSION)。
查看全局所有系统变量:
SHOW GLOBAL VARIABLES;
查看当前会话所有系统变量:
SHOW [SESSION] VARIABLES;
通过模糊匹配方式查找变量:
SHOW [SESSION或GLOBAL] VARIABLES LIKE '变量';
查看指定变量的值(全局):
SELECT @@GLOBAL.系统变量名;
查看指定变量的值(当前会话):
SELECT @@[SESSION.]系统变量名;
设置全局系统变量:
方式一:SET @@GLOBAL.系统变量名 = 值;
方式二:SET GLOBAL 系统变量名 = 值;
设置当前会话系统变量:
方式一:SET @@[SESSION.]系统变量名 = 值;
方式二:SET [SESSION] 系统变量名 = 值;
mysql服务重新启动之后,所设置的全局参数会失效,要想不失效,可以在 /etc/my.cnf 中配置。
用户定义变量
用户定义变量是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用“@变量名”使用就可以。其作用域为当前连接。
赋值:
方式一:SET @变量1 = 值, @变量2 = 值, ..., @变量n = 值;
方式二:SET @变量1 := 值, @变量2 := 值, ..., @变量n := 值;
方式三:SELECT @变量1 := 值, @变量2 := 值, ..., @变量n := 值;
方式四:SELECT 查询结果 INTO @变量 FROM 表名;
使用或查询:
SELECT @变量名;
注:用户定义的变量无需对其进行声明或初始化,只不过获取到的值为NULL。
示例:
# 赋值示例
SET @myname = 'itcast';
SET @myage := 10;
SET @mygender := '男', @myhobby := 'java';
SELECT @mycolor := 'red';
SELECT COUNT(*) INTO @mycount FROM tb_user;# 使用或查询
SELECT @myname, @myage, @mygender, @myhobby;
SELECT @mycolor, @mycount;
局部变量
局部变量是根据需要定义的在局部生效的变量,访问之前,需要DECLARE声明。可用作存储过程内的局部变量和输入参数,局部变量的范围是在其内声明的BEGIN … END块。
声明:
DECLARE 变量名 变量类型 [DEFAULT 初始值];
赋值:
方式一:SET 变量1 = 值, 变量2 = 值, ..., 变量n = 值;
方式二:SET 变量 := 值;
方式三:SELECT 查询结果 INTO 变量 FROM 表名;
以基本语法里的student表为例:
# 局部变量声明与赋值
CREATE PROCEDURE p2()
BEGINDECLARE stu_count INT DEFAULT 0;SELECT COUNT(*) INTO stu_count FROM student;SELECT stu_count;
END;CALL p2();
if判断
if 用于做条件判断。
语法:
IF 条件1 THENsql语句1;...sql语句n;
ELSEIF 条件2 THENsql语句1;...sql语句n;
ELSEsql语句1;...sql语句n;
END IF;
在if条件判断的结构中,ELSEIF 结构可以有多个,也可以没有。ELSE结构可以有,也可以没有。
示例:
/*
根据定义的分数score变量,判定当前分数对应的分数等级。
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();
上述的需求已经实现了,但是存在一些问题,比如:score 分数是在存储过程中定义死的,而且最终计算出来的分数等级也仅仅是最终查询展示出来而已。
怎样把score分数动态的传递进来,计算出来的分数等级作为返回值返回?
可以通过参数来解决上述问题。
参数
参数的类型,主要分为三种:IN、OUT、INOUT。
类型 | 含义 | 备注 |
---|---|---|
IN | 该类参数作为输入,也就是调用时需要传入值 | 默认 |
OUT | 该类参数作为输出,也就是该参数可以作为返回值 | |
INOUT | 既可以作为输入参数,也可以作为输出参数 |
语法:
CREATE PROCEDURE 存储过程名称([参数类型 参数名 属性类型])
BEGINsql语句;...
END;
示例一:
/*
根据传入参数score,判定当前分数对应的分数等级,并返回。
score >= 85分,等级为优秀。
score >= 60分 且 score < 85分,等级为及格。
score < 60分,等级为不及格。
*/
CREATE PROCEDURE p4(IN score INT, OUT result VARCHAR(10))
BEGINIF score >= 85 THENSET result := '优秀';ELSEIF score >= 60 THENSET result := '及格';ELSESET result := '不及格';END IF;
END;# 定义用户变量 @result 来接收返回的数据,用户变量可以不用声明
CALL p4(98, @result);SELECT @result;
示例二:
# 将传入的200分制的分数换算成百分制,然后返回。
CREATE PROCEDURE p5(INOUT score DOUBLE)
BEGINSET score := score * 0.5;
END;SET @score = 198;CALL p5(@score);SELECT @score;
case判断
case结构及作用,和流程控制函数类似。有两种语法格式。
语法一:
CASE case_valueWHEN 值1 THEN sql语句;...WHEN 值n THEN sql语句;[ELSE sql语句;]
END CASE;
含义:当case_value的值为 值n 时,执行对应后面的sql语句,否则就执行else后面的SQL语句。
语法二:
CASEWHEN 条件1 THEN sql语句;...WHEN 条件n THEN sql语句;[ELSE sql语句;]
END CASE;
示例:
/*
根据传入的月份,判定月份所属的季节(要求采用case结构)。
1-3月份,为第一季度
4-6月份,为第二季度
7-9月份,为第三季度
10-12月份,为第四季度
*/
CREATE PROCEDURE p6(IN my_month INT)
BEGINDECLARE result VARCHAR(10);CASEWHEN my_month >= 1 AND my_month <= 3 THENSET result := '第一季度';WHEN my_month >= 4 AND my_month <= 6 THENSET result := '第二季度';WHEN my_month >= 7 AND my_month <= 9 THENSET result := '第三季度';WHEN my_month >= 10 AND my_month <= 12 THENSET result := '第四季度';ELSESET result := '非法参数';END CASE;SELECT CONCAT('您输入的月份为: ', my_month, ', 所属的季度为: ',result);END;CALL p6(16);
如果判定条件有多个,多个条件之间,可以使用 and 或 or 进行连接。
while循环
while循环是有条件的循环控制语句。满足条件后,再执行循环体中的SQL语句。
WHILE 条件 DOsql逻辑;
END WHILE;
含义:先判定条件,如果条件为true,则执行逻辑,否则,不执行逻辑。
示例:
# 计算从1累加到n的值,n为传入的参数值。
CREATE PROCEDURE p7(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 p7(100);
repeat循环
repeat是有条件的循环控制语句,当满足until声明的条件的时候,退出循环。
语法:
REPEATSQL逻辑;
UNTIL 条件
END REPEAT;
先执行一次逻辑,然后判定UNTIL条件是否满足,如果满足,则退出。如果不满足,则继续下一次循环。
示例:
# 计算从1累加到n的值,n为传入的参数值。
CREATE PROCEDURE p8(IN n INT)
BEGINDECLARE total INT DEFAULT 0;REPEATSET total := total + n;SET n := n - 1;UNTIL n <= 0END REPEAT;SELECT total;
END;CALL p8(10);CALL p8(100);
loop循环
LOOP 实现简单的循环,如果不在SQL逻辑中增加退出循环的条件,可以用其来实现简单的死循环。
LOOP可以配合以下两个语句使用:
- LEAVE:配合循环使用,退出循环。
- ITERATE:只能在循环中使用,作用是跳过当前循环剩下的语句,直接进入下一次循环。
基础语法:
[标记:] LOOPSQL逻辑;
END LOOP [标记];
退出指定标记的循环体:
LEAVE 标记;
直接进入下一次循环:
ITERATE 标记;
示例一:
# 计算从1累加到n的值,n为传入的参数值。
CREATE PROCEDURE p9(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 p9(100);
示例二:
# 计算从1到n之间的偶数累加的值,n为传入的参数值。
CREATE PROCEDURE p10(IN n INT)
BEGINDECLARE total INT DEFAULT 0;sum:LOOPIF n <= 0 THENLEAVE sum;END IF;IF n % 2 = 1 THENSET n := n - 1;ITERATE sum;END IF;SET total := total + n;SET n := n - 1;END LOOP sum;SELECT total;
END;CALL p10(100);
游标
游标(CURSOR)是用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理。游标的使用包括游标的声明、OPEN、FETCH 和 CLOSE。
声明游标:
DECLARE 游标名称 CURSOR FOR 查询语句;
要先声明普通变量,再声明游标
打开游标:
OPEN 游标名称;
获取游标记录:
FETCH 游标名称 INTO 变量1, ..., 变量n;
关闭游标:
CLOSE 游标名称;
如果只使用游标,实现的程序逻辑并不完善,而且程序执行完毕后,很可能获取不到数据,数据库还会报错。
要解决这个问题,需要通过MySQL中提供的条件处理程序(Handler)来解决。
条件处理程序
条件处理程序(Handler)可以用来定义在流程控制结构执行过程中遇到问题时相应的处理步骤。
声明条件处理程序:
DECLARE 条件处理程序类型 HANDLER FOR 条件处理程序条件1, ..., 条件处理程序条件n sql逻辑;
条件处理程序类型 | 含义 |
---|---|
CONTINUE | 继续执行当前程序 |
EXIT | 终止执行当前程序 |
条件处理程序条件 | 解释 |
---|---|
SQLSTATE ‘状态码’ | 根据执行sql语句时抛出的状态码(错误码)来决定如何执行程序 |
SQLWARNING | 所有以01开头的SQLSTATE代码的简写 |
NOT FOUND | 所有以02开头的SQLSTATE代码的简写 |
SQLEXCEPTION | 所有没有被 SQLWARNING 或 NOT FOUND 捕获的SQLSTATE代码的简写 |
示例:
CREATE TABLE tb_user(id INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',name VARCHAR(50) NOT NULL COMMENT '用户名',phone VARCHAR(11) NOT NULL COMMENT '手机号',email VARCHAR(100) COMMENT '邮箱',profession VARCHAR(11) COMMENT '专业',age TINYINT UNSIGNED COMMENT '年龄',gender CHAR(1) COMMENT '性别, 1: 男, 2: 女',user_status CHAR(1) COMMENT '状态',createtime DATETIME COMMENT '创建时间'
) COMMENT '系统用户表';INSERT INTO tb_user (name, phone, email, profession, age, gender, user_status, createtime)
VALUES ('吕布', '17799990000', 'lvbu666@163.com', '软件工程', 23, '1', '6', '2001-02-02 00:00:00'), ('曹操', '17799990001', 'caocao666@qq.com', '通讯工程', 33, '1', '0', '2001-03-05 00:00:00'), ('赵云', '17799990002', '17799990@139.com', '英语', 34, '1', '2', '2002-03-02 00:00:00'), ('孙悟空', '17799990003', '17799990@sina.com', '工程造价', 54, '1', '0', '2001-07-02 00:00:00'), ('花木兰', '17799990004', '19980729@sina.com', '软件工程', 23, '2', '1', '2001-04-22 00:00:00'), ('大乔', '17799990005', 'daqiao666@sina.com', '舞蹈', 22, '2', '0', '2001-02-07 00:00:00'), ('露娜', '17799990006', 'luna_love@sina.com', '应用数学', 24, '2', '0', '2001-02-08 00:00:00'), ('程咬金', '17799990007', 'chengyaojin@163.com', '化工', 38, '1', '5', '2001-05-23 00:00:00'), ('项羽', '17799990008', 'xiaoyu666@qq.com', '金属材料', 43, '1', '0', '2001-09-18 00:00:00'), ('白起', '17799990009', 'baiqi666@sina.com', '机械工程及其自动化', 27, '1', '2', '2001-08-16 00:00:00'), ('韩信', '17799990010', 'hanxin520@163.com', '无机非金属材料工程', 27, '1', '0', '2001-06-12 00:00:00'), ('荆轲', '17799990011', 'jingke123@163.com', '会计', 29, '1', '0', '2001-05-11 00:00:00'), ('兰陵王', '17799990012', 'lanlinwang666@126.com', '工程造价', 44, '1', '1', '2001-04-09 00:00:00'), ('狂铁', '17799990013', 'kuangtie@sina.com', '应用数学', 43, '1', '2', '2001-04-10 00:00:00'), ('貂蝉', '17799990014', '84958948374@qq.com', '软件工程', 40, '2', '3', '2001-02-12 00:00:00'), ('妲己', '17799990015', '2783238293@qq.com', '软件工程', 31, '2', '0', '2001-01-30 00:00:00'), ('芈月', '17799990016', 'xiaomin2001@sina.com', '工业经济', 35, '2', '0', '2000-05-03 00:00:00'), ('嬴政', '17799990017', '8839434342@qq.com', '化工', 38, '1', '1', '2001-08-08 00:00:00'), ('狄仁杰', '17799990018', 'jujiamlm8166@163.com', '国际贸易', 30, '1', '0', '2007-03-12 00:00:00'), ('安琪拉', '17799990019', 'jdodm1h@126.com', '城市规划', 51, '2', '0', '2001-08-15 00:00:00'), ('典韦', '17799990020', 'ycaunanjian@163.com', '城市规划', 52, '1', '2', '2000-04-12 00:00:00'), ('廉颇', '17799990021', 'lianpo321@126.com', '土木工程', 19, '1', '3', '2002-07-18 00:00:00'), ('后羿', '17799990022', 'altycj2000@139.com', '城市园林', 20, '1', '0', '2002-03-10 00:00:00'), ('姜子牙', '17799990023', '37483844@qq.com', '工程造价', 29, '1', '4', '2003-05-26 00:00:00');/*
根据传入的参数uage,来查询用户表tb_user中年龄小于等于uage的用户姓名(name)和专业(profession),
并将用户的姓名和专业插入到所创建的一张新表(id,name,profession)中。
*/
CREATE PROCEDURE p11(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;# 上面一句也可替换为:# 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 DO# 获取游标中的记录FETCH u_cursor INTO uname, upro;# 插入数据到新表中INSERT INTO tb_user_pro VALUES (NULL, uname, upro);END WHILE;CLOSE u_cursor;
END;CALL p11(30);
具体的错误状态码,可以参考官方文档:
https://dev.mysql.com/doc/refman/8.0/en/declare-handler.html
https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html
存储函数
存储函数是有返回值的存储过程,存储函数的参数只能是IN类型的。
语法:
CREATE FUNCTION 存储函数名称([参数列表])
RETURNS 返回值类型 [characteristic列表]
BEGINsql逻辑;RETURN 返回值列表;
END ;
characteristic类型 | 说明 |
---|---|
DETERMINISTIC | 相同的输入参数总是产生相同的结果 |
NO SQL | 不包含 SQL 语句 |
READS SQL DATA | 包含读取数据的语句,但不包含写入数据的语句 |
示例:
# 计算从1累加到n的值,n为传入的参数值。
CREATE FUNCTION fun1(n INT)
RETURNS INT DETERMINISTIC
BEGINDECLARE total INT DEFAULT 0;WHILE n > 0 DOSET total := total + n;SET n := n - 1;END WHILE;RETURN total;
END;SELECT fun1(50);
在mysql8.0版本中binlog默认是开启的。一旦开启了,mysql就要求在定义存储函数时,需要指定characteristic特性,否则就会报错。
存储函数用的相对较少,存储函数能做的,存储过程也能做。
相关文章:
《SQL基础》14. 存储过程 · 存储函数
存储过程 存储函数存储过程基本语法变量系统变量用户定义变量局部变量if判断参数case判断while循环repeat循环loop循环游标条件处理程序存储函数存储过程 存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合。调用存储过程可以简化应用开发人员的工作,减…...
NFT Insider #87:The Sandbox 收购游戏开发工作室 Sviper,GHST 大迁徙即将拉开帷幕
引言:NFT Insider由NFT收藏组织WHALE Members(https://twitter.com/WHALEMembers)、BeepCrypto(https://twitter.com/beep_crypto)联合出品,浓缩每周NFT新闻,为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周…...
html部分codewhy网课学习笔记
day1 网页显示的过程和服务器 浏览器内核,也称为渲染引擎 head标签描述网页的原数据,如title shifttab是向前缩进 div>ul>li可以快速生成 <div> <ul> <li></li> </ul> </div> 在早期,单标签如<input>也可写为&l…...
电脑出问题了怎么重装系统修好
电脑在使用过程中经常会出现各种各样的问题,如系统崩溃、蓝屏、病毒感染等。这些问题如果不能及时得到解决,将会给用户带来很多麻烦和损失。小白一键重装系统是一个功能强大的工具,可以帮助用户快速解决电脑常见问题。下面我们就来详细介绍如…...
Nginx国密支持问题记录
文章目录添加国密支持可能出现的问题国密不生效,查看 Nginx 可执行文件路径是否正确证书无法解析Nginx无法启动添加国密支持 NGINX添加国密支持 添加国密支持可以直接按照官网的操作顺序操作即可 参考网址:https://www.gmssl.cn/gmssl/index.jsp 可能出…...
基于ensp的小型局域网网络搭建及需求分析
一 需求分析本实验的目的在于建立小型局域网。由于公司由财政部、人事部、科技部三个部门组成,分布在同一个交换机下。设计以下网络:三个个部门使用两台交换机连接,然后连接到汇聚交换机,再通过路由器与外网以及其他部门网络相连。…...
Kubernetes学习(二)Pod
创建Pod kubectl创建nginx pod 编写 nginx pod的yaml文件 apiVersion: v1 kind: Pod metadata:name: my-nginxlabels:name: my-nginx spec:containers:- image: nginxname: my-nginxresources:limits:memory: "128Mi"cpu: "500m"ports:- name: nginx-po…...
【Docker】docker | 迁移docker目录
一、场景说明1、物理机磁盘空间不够用了2、docker的镜像、容器、卷等资料的默认路径为: /var/lib/docker3、增加了数据盘挂在,需要将docker的全部资料更换个目录二、操作确认是否满足切换条件1)服务是否能够暂停,如果可以就OK2&am…...
day24_多线程进阶
今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、线程安全的集合 三、死锁 四、线程通信 五、生产者消费者 六、线程池 零、 复习昨日 创建线程的几种方式 1) 继承 2) 实现Runnable 3) calla…...
Qt实现系统桌面目录下文件搜索的GUI:功能一:文件查找与现实
⭐️我叫恒心,一名喜欢书写博客的研究生在读生。 原创不易~转载麻烦注明出处,并告知作者,谢谢!!! 这是一篇近期会不断更新的博客欧~~~ 有什么问题的小伙伴 欢迎留言提问欧。 功能点一:文件查找与…...
有关数据库的一级、二级、三级封锁协议
一级封锁协议 一级封锁协议是指,事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK).一级封锁协议可防止丢失修改,并保证事务T是可恢复的。在…...
【Android Studio】【学习笔记】【2023春】
文章目录零、常用一、界面布局疑问&报错零、常用 一、界面布局 Android——六大基本布局总结/CSDN小马 同学 【Android】线性布局(LinearLayout)最全解析/CSDNTeacher.Hu 一个不错的计算器界面👇 Android Studio App LinearLayout多层…...
window.open()下载文件重命名/js下载文件重命名/js跨域下载文件重命名
普通文件下载 // 1 var fileUrl https://xxxx.docx; window.open(fileUrl"?attname文档.docx");// 2 var a document.createElement(a); a.href https://xxxx.docx; a.download 文档.docx; a.target "_blank"; a.click();以上方式 attname 和 a.down…...
zookeeper:简介及常用命令
目录 一、Zookeeper简介 二、Zookeeper服务端常用命令 1、启动ZooKeeper服务 2、查看ZooKeeper服务状态 3、停止ZooKeeper服务 4、重启ZooKeeper服务 三、Zookeeper客户端常用命令 1、连接ZooKeeper服务端 2、断开连接:quit 3、查看命令帮助:help…...
与流程挖掘布道者熵评科技孙一鸣博士共话流程挖掘市场的起源与前景 | 爱分析访谈
调研:李进宝 陈元新 撰写:李进宝 陈元新 随着数字化转型持续深入,国内企业流程挖掘需求初露端倪。流程挖掘是指通过采集和分析企业数据,以可视化流程图还原企业实际发生的业务流程,进而评估流程运行状况、诊断流程运…...
第十一届蓝桥杯省赛——2解密
题目:【问题描述】小明设计了一种文章加密的方法:对于每个字母 c,将它变成某个另外的字符 Tc。下表给出了字符变换的规则:字母cTc字母cTc字母cTc字母cTcaynlAYNLbxogBXOGcmpoCMPOddquDDQUearfEARFfcssFCSSgitzGITZhkupHKUPinvwINV…...
ChatGPT解答:PYQT5 美化各种控件的方案和实例
ChatGPT解答:PYQT5 美化各种控件的方案和实例 修改按钮样式 button QPushButton(按钮, self) button.setStyleSheet(QPushButton{background-color: red; border-radius: 5px;})修改标签样式 label QLabel(标签, self) label.setStyleSheet(QLabel{color: blue; …...
js实现翻盘抽奖
<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>礼物编辑</title><style>* {margin: 0;padding: 0;box-sizing: border-box;list-style-type: none;text-decoration: none;}.container {d…...
Qt QtCreator 安卓开发环境搭建
踩坑 我的qt是使用在线安装工具安装的,Qt版本使用的是5.15.2,QtCreator版本9.0.2 在网上很多教程都是如下步骤 1.安装qt 2.安装jdk 3.安装android-sdk 4.安装android-ndk 5.配置android设置 例如: https://blog.csdn.net/weixin_51363326/…...
Flutter知识点(二)处理Json
flutter不支持反射,所以本来很简单的事情,一下子变复杂了。当然官方也提供了一些工具来方便开发者。 由于Dart的map和array的数据结构和json一样,所以在flutter中,变成了json string与Map,array之间的砖换。 &#x…...
基本概念简介(码率,FPS(帧数),分辨率,RTMP协议)等的介绍
基本概念 为了了解视频的码率、帧率、分辨率。我们先来看看视频编码的基本原理:视频图像数据有极强的相关性,也就是说有大量的冗余信息。压缩技术就是将数据中的冗余信息去掉(去除数据之间的相关性),压缩技术包含帧内图像数据压缩技术、帧间图像数据压缩技术和熵编码压缩技…...
黑盒测试重点复习内容
黑盒测试一、等价类划分边界值分析法二、判定表法一、等价类划分边界值分析法 对于各种输入或者输出,必须考虑等价类和边界值,并补充一些特殊值,如空值、空格、0、异常格式等特殊值。 基本概念: 有效等价类:满足需求…...
Python每日一练(20230303)
1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺…...
基于Cortex-M7内核STM32F767NIH6,STM32F767VGT6,STM32F767VIT6嵌入式技术资料
STM32F7 32 位 MCUFPU 基于高性能的 ARMCortex-M7 32 位 RISC 内核,工作频率高达 216MHz。Cortex-M7 内核具有单浮点单元(SFPU)精度,支持所有 ARM 单精度数据处理指令与数据类型。同时执行全套 DSP 指令和存储保护单元(MPU)&#…...
Nginx SSL证书A+之路
问题 myssl是常见的SSL/TLS在线免费检测网站。期望能够达到A级别。 步骤 nignx worker_processes auto;http {ssl_session_cache shared:SSL:10m;ssl_session_timeout 10m;server {listen 443 ssl;server_name xxxx.xxxx.com;keepalive_timeout 70;ssl_certific…...
周期性温度和压力波的PID自动控制解决方法
摘要:目前各种PID控制器仪表常用于简单的设定点(Set Point)和斜坡(Ramp)程序控制,但对于复杂的正弦波等周期性变量的控制则无能为力。为了采用标准PID控制器便捷和低成本的实现对正弦波等周期性变量的自动控…...
从头开始搭建一个SpringBoot项目--SpringBoot文件的上传与下载
从头开始搭建一个SpringBoot项目--SpringBoot文件的上传前言流程分析代码结构代码详情UploadFileInfo.classUploadController.classUploadDao.classUploadDao.xmlUploadServices.classUploadServicesImpl.class测试下载示例前言 文件的上传和下载是很多系统必备的功能…...
It做形式主语和宾语
主谓宾,主宾能被名词性的sth,替换,如动名词,不定式,从句等等 而且,不能出现前面或者中间,很长,一大推的在开头或者中间,就产生了it做形式主宾。 一、It用作形式主语当不…...
做测试一定要知道的——软件测试流程和测试规范标准文档
目录 1、目的 2、工作范围 3、工作职责 4、测试的流程 5、测试准备阶段 6、测试方法制定阶段 7、测试执行阶段 8、bug管理 9、标准文档 总结感谢每一个认真阅读我文章的人!!! 重点:配套学习资料和视频教学 1、目的 通…...
Linux下将一个文件压缩分包成多个小文件
压缩分包 将文件test分包压缩成1G 的文件: tar czf - 文件名字 | split -b 10 - 文件名.tar.gz解压 将第一步分拆的多个包解压: cat 文件名.tar.gz* | tar -xzv...
做网站除甲醛需不需要营业执照/官网站内推广内容
今天分享一个可视化小技巧,如何在PowerBI的表格中动态显示需要的列?就是这样的效果,也就是根据切片器的筛选,来显示需要的列,做起来很简单,步骤如下:01 逆透视表进入Powerquery编辑其中…...
做商品条形码的网站/网络推广是诈骗吗
为什么80%的码农都做不了架构师?>>> http://www.expressjs.com.cn/starter/hello-world.html expressjs入门教程 http://bubkoo.com/2014/12/02/use-nodemon-with-node-applications/ nodemon监视代码变动,及自动重启服务 转载于:https:…...
免费开发网站大全/it培训机构有哪些
一、新建项目 二、运行 npm install npm run start 三、多环境切换 踩坑后总结的方法。。 首先看到package.json 前面的参数都是命令。比如“start”的意思就是npm run start,“build”的意思就是npm run build 往里面传的参数中,--config是必须的&…...
校园网站cms/网络营销推广方案范文
先看效果图 首先安装一下插件 yarn add react-transition-group把你需要有动画效果的页面用CSSTransition包裹起来 import { CSSTransition } from react-transition-group; import { RouteComponentProps } from react-router-dom;const Album: FC<RouteComponentProps&…...
市住房和城乡建设委员会官方网站/优化的意思
离散数学集合运算C或C语言实验报告离散数学实验报告1.【实验2.【实验目的3.【实验内容实验1)用数组A,B,C,E表示集合。假定A{1,3,4,5,6,7,9&#x…...
推广英文/对网站提出的优化建议
# begin build properties # autogenerated by buildinfo.sh #由buildinfo.sh自动生成此文件ro.build.idA4-3G #手机ID号ro.build.display.idQUALCOMM 高通3G-Android2.2.3-IOSUI#显示型号 eng.autobuild.20110624.181135#显示创建时间ro.build.version.incrementaleng.autobui…...