MySQL学习(二):在储存过程中使用预处理将查询出的变量赋值为字段,完成MySQL循环中赋值

可算整完了,萌新从头认真看;大佬根本不用看;和我一样依噶半拉的找找想看啥看啥吧

0准备工作

0.0我使用的工具及环境等信息

我使用的是小绿叶Navicat for MySQL,就是直接在这里面写的,
在这里插入图片描述
在这里插入图片描述
MySQL的版本是5.7
在这里插入图片描述

0.1我想实现的最终目的

0.1.0这个其实是一家公司面试题,刚看的时候就难着我了,不过程序猿是轻易放弃的吗!

这是题目的拍照
好模糊啊,反正我之后会有结果出来,这里不看也没啥问题
在这里插入图片描述

0.1.1我有一张工资统计表

格式是某人发了某种钱多少多少,
列入:Tom – 月工资 – 10000;
Tom – 年奖金 – 50000;等
在这里插入图片描述

0.1.2我想要查询出个人工资条的形式

在这里插入图片描述
为避免数据库压力,减少后台与数据库交互,所以我使用了储存过程

0.2我最终的代码

之后用到时会详细解释
这个函数的名字是 test2gc
参数:IN–nae–varchar(20)
重要的话说三遍:
这个之后所有的代码都是代码全览的一部分!
这个之后所有的代码都是代码全览的一部分!
这个之后所有的代码都是代码全览的一部分!

代码全览

BEGIN
/*
	函数:查询某人工资条
	完成时间:2019.08.22
*/
	#Routine body goes here...

	-- 如果存在中间表,则删除
	DROP TABLE IF EXISTS middle_test;
	
	-- 创建中间表
	CREATE TABLE middle_test(
		 name VARCHAR(100),
		 PRIMARY KEY (name)
	)ENGINE=InnoDB DEFAULT CHARSET=utf8;

	-- 将姓名当做主键添加至中间表
	#ALTER TABLE middle_test add 收入类型 VARCHAR(20);
	INSERT INTO middle_test(name) VALUES (nae);

	-- 按照传入参数查询原表中数据,获取循环需要次数
	#SELECT * FROM test2 t2 WHERE t2.name = name;
	SELECT COUNT(*) INTO @i FROM test2 t2 WHERE t2.name = nae;
	#SELECT @i '总数';

	-- 开始while循环
	#declare var1 int default 0; -- 不能用,我也不知到为啥
	SET @j = 0;
	SET @na = nae;
	WHILE @j < @i do
		-- 获取字段名及字段值
		PREPARE d1 FROM 'SELECT @lx:=收入类型,@mn:=收入金额 FROM test2 t2 WHERE t2.name = ? LIMIT ?,1';
		EXECUTE d1 USING @na,@j;
		#DEALLOCATE PREPARE d1;
		
		-- 将字段名存入中间表
		#ALTER TABLE middle_test ADD @lx VARCHAR(10) DEFAULT @mn;
		SET @strsqla = CONCAT('ALTER TABLE middle_test ADD ',@lx,' VARCHAR(10)');
		PREPARE d2 FROM @strsqla;
		EXECUTE d2;

		-- 给中间表赋值
		#UPDATE middle_test SET @lx = @mn;
		SET @strsqlb = CONCAT('UPDATE middle_test mt SET ',@lx,' = "',@mn,'" WHERE mt.name = "',@na,'"');
		PREPARE d3 FROM @strsqlb;
		EXECUTE d3;

		-- 循环条件
		SET @j := @j +1;
	END WHILE;

	-- 可算整完了,打印中间表
	SELECT * FROM middle_test;
	#SELECT 收入类型 AS nn FROM test2 t2 WHERE t2.name = name;

	-- 创建视图
	#drop view if exists view_test2;	-- 如果视图存在,删除视图
	#create view view_test2 
	#AS
	#	SELECT * FROM test2;
	-- 查询视图内容
	#select *from test2;
END

部分代码截图
在这里插入图片描述
调用该过程

CALL test2gc('Tom');

1正式开始

我是按照步骤一步步写的博客,知识点我会在引用的步骤解释,
以下的目录是按照易错点和知识点区分

1.0创建储存过程无法保存,报错1064

坑点1:假如创建函数的时候,选择了参数varchar,创建完成后Ctrl+S想保存,结果报错了
在这里插入图片描述
如果参数选择int或者不选,是可以正常保存的,但是为什么用了varchar就不可以了呢,报错红框
在这里插入图片描述
这是因为varchar没有填写长度(当初这个问题困扰我好一阵子)
加上长度就可以正常保存了,看黄框,已经是保存后了
在这里插入图片描述

1.1创建中间表,如果中间表存在,则删除中间表后创建

代码

	-- 如果存在中间表,则删除
	DROP TABLE IF EXISTS middle_test;
	
	-- 创建中间表
	CREATE TABLE middle_test(
		 name VARCHAR(100),
		 PRIMARY KEY (name)
	)ENGINE=InnoDB DEFAULT CHARSET=utf8;
  1. DROP TABLE IF EXISTS middle_test; 是判断middle_test表是否存在,如果存在,则删除
  2. 第二部分是创建新表,因为新表中的工资条种类是后台添加,所以这里就只是按照name创建了主键

1.2将想要查询的人的姓名填写如该中间表中

之后会查询中间表,所以这里就创建数据

	-- 将姓名当做主键添加至中间表
	INSERT INTO middle_test(name) VALUES (nae);

1.3获取该员工一共发了多少种工资,用于之后的循环条件

	-- 按照传入参数查询原表中数据,获取循环需要次数
	SELECT COUNT(*) INTO @i FROM test2 t2 WHERE t2.name = nae;

注: 这里我没有创建变量,是直接可以用的,
在mysql中一般是SET和SELECT给变量赋值,我之后会用到,之后会讲

1.4创建一个循环,循环的长度是获取的种类,

这里就有点坑了,

	-- 开始while循环
	#declare var1 int default 0; -- 不能用,我也不知到为啥
	SET @j = 0;
	SET @na = nae;
	WHILE @j < @i do	-- 这里的@i就是上面获取的种类长度
		-- 这里写循环的内容
		-- 循环条件
		SET @j := @j +1;	-- 这里不要用“=”号,因为一个等于是比较,不是赋值
	END WHILE;

注: 1.首先就是我注释代码的第一行,这个也是创建一个变量,我使用后就直接报错了,无法保存,是编译时异常,我该了好几种,什么去默认值啊、加长度啊、加减@符号啊,都不管用,就放弃了。最后用的SET;
2.SET和SELECT赋值的区别网上太好搜了,我这里就不写了;

这里是循环的所有内容,之后的预处理语句是循环内拆分讲解

	-- 开始while循环
	SET @j = 0;
	SET @na = nae;
	WHILE @j < @i do
		-- 获取字段名及字段值
		PREPARE d1 FROM 'SELECT @lx:=收入类型,@mn:=收入金额 FROM test2 t2 WHERE t2.name = ? LIMIT ?,1';
		EXECUTE d1 USING @na,@j;
		
		-- 将字段名存入中间表
		SET @strsqla = CONCAT('ALTER TABLE middle_test ADD ',@lx,' VARCHAR(10)');
		PREPARE d2 FROM @strsqla;
		EXECUTE d2;

		-- 给中间表赋值
		SET @strsqlb = CONCAT('UPDATE middle_test mt SET ',@lx,' = "',@mn,'" WHERE mt.name = "',@na,'"');
		PREPARE d3 FROM @strsqlb;
		EXECUTE d3;

		-- 循环条件
		SET @j := @j +1;
	END WHILE;

1.5循环内容1——使用预处理语句获取变量

使用预处理语句将收入类型收入金额取出

	-- 获取字段名及字段值
	PREPARE d1 FROM 'SELECT @lx:=收入类型,@mn:=收入金额 FROM test2 t2 WHERE t2.name = ? LIMIT ?,1';
	EXECUTE d1 USING @na,@j;

这是预处理语句的一种形式,因为我是第一次做,所以见着什么用什么,没有习惯喜欢只说
因为在循环中我使用nae(我传入的参数) 报错了,所以我就在循环之前将参数放到了@na 这个变量中
赋值:所以第二句的USING传入的变量,第一个是查询的名字,第二个是循环的次数,正好用LIMIT查询是第几个
取值:其中@lx是收入类型,@mn是收入金额,我的数据表就是中文名字,失误了,英文写起来容易些,少想一些用不用引号,
但是我这个也证明了用汉字是可以的

1.6循环内容2——使用预处理语句完成,使用将变量做字段名创建字段

这里我尝试过将第一行和第二行合并成一行(代码越多越难受0),但是失败了,不管怎么弄,就是报错,所以没法只能就这样了

	-- 将字段名存入中间表
	SET @strsqla = CONCAT('ALTER TABLE middle_test ADD ',@lx,' VARCHAR(10)');
	PREPARE d2 FROM @strsqla;
	EXECUTE d2;

这个就是预处理语句的第二种,(我不知道一共几种,但是现在我就会两种了),

  1. 创建一个变量语句;
  2. 将这个语句放入预处理的东东里面;
  3. 执行预处理语句;
    这里要注意,这里是有空格的,因为CONCAT是合并语句,但是合并后也要有空格啊,这里没空格不会报错,但是会运行失败,这个有没有debug,找错可难受了,我之后会在最后写我是怎么找错的,希望可以对你有帮助
    在这里插入图片描述

1.7循环内容3——将获取的收入金额变量赋值给新建的字段

这里有个重要的问题,就是赋值的时候放进去的东西外面应该有层双引号的啊,这里如果双引号没用对,也是不报错,但是运行不成功的

	-- 给中间表赋值
	SET @strsqlb = CONCAT('UPDATE middle_test mt SET ',@lx,' = "',@mn,'" WHERE mt.name = "',@na,'"');
	PREPARE d3 FROM @strsqlb;
	EXECUTE d3;

我在这里将合并后的语句再写一遍,(这个直接放肯定是报错的,所以才用预处理语句嘛)

UPDATE middle_test mt SET @lx = "@mn" WHERE mt.name = "@na"

这里的两对双引号缺一不可,这是合并后应该执行的语句
后面的where就是条件啦,要是一开始不赋值(代码在1.2),这里的修改就没条件,就修改不了

1.8循环内容4——循环条件

我是没有忘记循环条件过,但是我感觉如果忘打了,保存时可能不报错,但是运行起来我就不敢说了,所以这才是重点啊

	-- 循环条件
	SET @j := @j +1;

1.9打印中间表

这是最后打印工资条,也可以单独写SELECT,也可以打开中间表直接看

	-- 可算整完了,打印中间表
	SELECT * FROM middle_test;

这就是最后了,我没有用到视图,我本来是想用视图做的,在一开始的代码全览中最后也有视图,但是做着做着就感觉中间表简单,所以就用中间表做了,我是做Java的,这个SQL语句本来就不精,就会个增删改查,

这个储存过程自己想的思路逻辑,然后每一个小地方都是从网上一点点学的,真的累死了,随便一个赋值取值就能难为我半天

2我写这个东西的时候的小心得

以下是我写的时候感觉可能出问题的点,或者感觉比较好用的方法,(不是函数什么的,就是我自己做的步骤)

2.1假如报错1064,

这个错我修改后保存,十次有三十次都报这个错,为什么比修改的次数还多?

因为修改后点保存后报错,我看着这个基础-------找找拼写错误,再保存,又报错,------再修改,再保存,又报错,所以改十个地方报错三十次都算少的,

我感觉这个错一般是找么找个方法就是没法用,要么就是分号错位置了,我一开始的时候总是分号错位置,所以最后写的时候一报错就找是不是分号错位置了

如果你是你一次写的话,包1064就找找是不是分号错位置了,确定不是,再找别的错

2.2假如Ctrl+S不报错,但是就是运行不出来怎么办(上)

首先,想办法定位到是大概那里报错了,我给截一下我这个问题的时候第一步怎么做的

我一步步打印,这样就可找到大致是哪里卡住了,这样就可以定位到大概哪里错了
在这里插入图片描述

2.3假如Ctrl+S不报错,但是就是运行不出来怎么办(下)

如果定位到大致是哪里错了,之后就可以把这段单独摘出来找错误,就像这样
把他放到查询中运行
在这里插入图片描述
如果错了也容易找,我随便改一下,给截一下错了什么样
在这里插入图片描述

展开阅读全文

Git 实用技巧

11-24
这几年越来越多的开发团队使用了Git,掌握Git的使用已经越来越重要,已经是一个开发者必备的一项技能;但很多人在刚开始学习Git的时候会遇到很多疑问,比如之前使用过SVN的开发者想不通Git提交代码为什么需要先commit然后再去push,而不是一条命令一次性搞定; 更多的开发者对Git已经入门,不过在遇到一些代码冲突、需要恢复Git代码时候就不知所措,这个时候哪些对 Git掌握得比较好的少数人,就像团队的神一样,在队友遇到 Git 相关的问题的时候用各种流利的操作来帮助队友于水火。 我去年刚加入新团队,发现一些同事对Git的常规操作没太大问题,但对Git的理解还是比较生疏,比如说分支和分支之间的关联关系、合并代码时候的冲突解决、提交代码前未拉取新代码导致冲突问题的处理等,我在协助处理这些问题的时候也记录各种问题的解决办法,希望整理后通过教程帮助到更多对Git操作进阶的开发者。 本期教程学习方法分为“掌握基础——稳步进阶——熟悉协作”三个层次。从掌握基础的 Git的推送和拉取开始,以案例进行演示,分析每一个步骤的操作方式和原理,从理解Git 工具的操作到学会代码存储结构、演示不同场景下Git遇到问题的不同处理方案。循序渐进让同学们掌握Git工具在团队协作的整体协作流程。 在教程会通过大量案例进行分析,案例会模拟在工作遇到的问题,从最基础的代码提交和拉取、代码冲突解决、代码仓库的数据维护、Git服务端搭建等。为了让同学们容易理解,对Git简单易懂,文章详细记录了详细的操作步骤,提供大量演示截图和解析。在教程的最后部分,会从提升团队整体效率的角度对Git工具进行讲解,包括规范操作、Gitlab的搭建、钩子事件的应用等。 为了让同学们可以利用碎片化时间来灵活学习,在教程文章大程度降低了上下文的依赖,让大家可以在工作之余进行学习与实战,并同时掌握里面涉及的Git不常见操作的相关知识,理解Git工具在工作遇到的问题解决思路和方法,相信一定会对大家的前端技能进阶大有帮助。
©️2020 CSDN 皮肤主题: 黑客帝国 设计师: 上身试试 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值