用mysql存储过程代替递归查询

查询此表某个id=4028ab535e370cd7015e37835f52014b(公司1)下的所有数据
正常情况下,我们采用递归算法查询,如下
public void findCorpcompanyListByParentId(List<UapcompanyVo> vos,String parentId){
UapcompanyParam param = new UapcompanyParam();
param.setParentid(parentId);
List<Uapcompany> companyList = uapcompanyDao.finduapcompanyList(param);
UapcompanyVo uapcompanyVo = null;
for(Uapcompany uapcompany : companyList){
uapcompanyVo = new UapcompanyVo();
uapcompanyVo = new UapcompanyVo();
uapcompanyVo.setId(uapcompany.getId());
uapcompanyVo.setName(uapcompany.getName());
uapcompanyVo.setParentid(uapcompany.getParentid());
vos.add(uapcompanyVo);
this.findCorpcompanyListByParentId(vos, uapcompany.getParentid());
}
}
递归查询也能实现该需求,但是这样有两个缺点:一,性能很差 ,因为每递归一次至少调用一次数据链接;二,如果数据量很大的话,可能会导致溢出,当然可以修改虚拟机参数,不过这也是治标不治本的方法
接下来,我们看一下存储过程实现查询:

选择函数-->右键-->选择新建函数

选择过程

添加入参参数,如下图所示

完成,如下图所示

在begin end区域编写存储过程内容
BEGIN
#声明一个flag变量,默认值为-99
DECLARE flag INT DEFAULT -99; #创建companyTempTabl_Qurey临时表
CREATE TEMPORARY TABLE IF NOT EXISTS companyTempTabl_Qurey (
id VARCHAR(32) NOT NULL,
`name` VARCHAR(100),
attr VARCHAR(30),
parentId VARCHAR(32)
);
TRUNCATE TABLE companyTempTabl_Qurey;
#创建companyTempTabl_Result临时表
CREATE TEMPORARY TABLE IF NOT EXISTS companyTempTabl_Result (
id VARCHAR (32) NOT NULL,
`name` VARCHAR (100),
attr VARCHAR (30),
parentId VARCHAR (32)
);
TRUNCATE TABLE companyTempTabl_Result; #根据参数 parentId 查询数据,并插入companyTempTabl_Qurey临时表
INSERT INTO companyTempTabl_Qurey (
id,
`name`,
attr,
parentId
) SELECT
uapcompany.id,
uapcompany.`name`,
uapcompany.attr,
uapcompany.parentId
FROM uapcompany
WHERE uapcompany.parentId = `parentId`; #根据参数 parentId 查询数据,并插入companyTempTabl_Result临时表
INSERT INTO companyTempTabl_Result (
id,
`name`,
attr,
parentId
) SELECT
uapcompany.id,
uapcompany.`name`,
uapcompany.attr,
uapcompany.parentId
FROM uapcompany
WHERE uapcompany.parentId = `parentId`; #根据参数 parentId 统计查询总数,并赋值给变量flag
SELECT count(1) INTO flag
FROM uapcompany
WHERE uapcompany.parentId = `parentId`; #如果flag 大于 0,则进行循环
WHILE flag > 0 DO
#创建companyTempTabl_temp 临时表
CREATE TEMPORARY TABLE IF NOT EXISTS companyTempTabl_temp (
id VARCHAR (32) NOT NULL,
`name` VARCHAR (100),
attr VARCHAR (30),
parentId VARCHAR (32)
);
TRUNCATE TABLE companyTempTabl_temp; #数据库表uapcompany关联临时表companyTempTabl_Qurey查询,并将查询结果插入 临时表companyTempTabl_temp
INSERT INTO companyTempTabl_temp (id, `name`, attr, parentId) SELECT
uapcompany.id,
uapcompany.`name`,
uapcompany.attr,
uapcompany.parentId
FROM
uapcompany,
companyTempTabl_Qurey
WHERE
uapcompany.parentId = companyTempTabl_Qurey.id; #删除临时表companyTempTabl_Qurey数据
DELETE FROM companyTempTabl_Qurey; #将临时表companyTempTabl_temp的数据 插入companyTempTabl_Qurey临时表,用作下一个循环的条件
INSERT INTO companyTempTabl_Qurey (id, `name`, attr, parentId) SELECT
companyTempTabl_temp.id,
companyTempTabl_temp.`name`,
companyTempTabl_temp.attr,
companyTempTabl_temp.parentId
FROM
companyTempTabl_temp; #将临时表companyTempTabl_temp的数据 插入到companyTempTabl_Result临时表(该表的数据也是我们最终要返回的数据)
INSERT INTO companyTempTabl_Result (id, `name`, attr, parentId) SELECT
companyTempTabl_temp.id,
companyTempTabl_temp.`name`,
companyTempTabl_temp.attr,
companyTempTabl_temp.parentId
FROM
companyTempTabl_temp; #删除companyTempTabl_temp数据
DROP TABLE companyTempTabl_temp; #数据库表uapcompany关联 临时表companyTempTabl_Qurey查询统计,并将结果赋值给变量flag
SELECT
count(1) INTO flag
FROM
uapcompany,
companyTempTabl_Qurey
WHERE
uapcompany.parentId = companyTempTabl_Qurey.id;
END WHILE;
SELECT id ,`name`,attr,parentId FROM companyTempTabl_Result; END
然后保存
测试一下,点击运行


输入参数,点击确定,结果如下图所示

我们在dao层只需要调用一次该 存储过程,就可以返回自己想要的数据,存储过程中创建的临时表随着链接的释放自动删除
用mysql存储过程代替递归查询的更多相关文章
- MySQL存储过程(转)
一.MySQL 创建存储过程 "pr_add" 是个简单的 MySQL 存储过程,这个存储过程有两个 int 类型的输入参数 "a"."b" ...
- MySql存储过程
MySQL 存储过程 ```sql CREATE PROCEDURE myprocedure (IN para01 INTEGER) BEGIN DECLARE var01 CHAR(10); IF ...
- mysql存储过程和存储函数
mysql存储过程和存储函数 存数函数代码示例: DROP PROCEDURE IF EXISTS calc_ci_day_suc_rate; delimiter // CREATE FUNCTION ...
- mysql存储过程编写-入门案例-遁地龙卷风
(-1)写在前面 这篇文章只是简要的叙述了mysql存储过程编写的基本概念. 我使用的mysql版本是5.7.9-log. 参照<<深入浅出MySQL>>. (0) delim ...
- MySQL存储过程动态SQL语句的生成
用Mysql存储过程来完成动态SQL语句,使用存储过程有很好的执行效率: 现在有要求如下:根据输入的年份.国家.节假日类型查询一个节假日,我们可以使用一般的SQL语句嵌入到Java代码中,但是执行效率 ...
- MySQL 存储过程
MySQL 存储过程 存储过程是通过给定的语法格式编写自定义的数据库API,类似于给数据库编写可执行函数. 简介 存储过程是一组为了完成特定功能的SQL语句集合,是经过编译后存储在数据库中. 存储过程 ...
- mysql存储过程详解
mysql存储过程详解 1. 存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的S ...
- PHP调用MYSQL存储过程实例
PHP调用MYSQL存储过程实例 标签: mysql存储phpsqlquerycmd 2010-09-26 11:10 11552人阅读 评论(3) 收藏 举报 实例一:无参的存储过程$conn = ...
- mysql存储过程语法及实例
存储过程如同一门程序设计语言,同样包含了数据类型.流程控制.输入和输出和它自己的函数库. --------------------基本语法-------------------- 一.创建存储过程cr ...
随机推荐
- English Voice of <<All Of Me>>
"All Of Me"我的一切 [Verse 1:]What would I do without your smart mouth没有你的蜜语甜言,我该怎办Drawing me ...
- Java泛型简单理解
优点1: 没有使用泛型,向list集合中添加非字符串,运行时会报错:类型不匹配 ObjectList.java: package cn.nxl2018; import java.util.ArrayL ...
- linux文件管理之bash shell
BASH Shell 对文件进行管理 ========================================================创建.复制.删除.移动.查看.编辑.压缩.查找 内 ...
- django权限管理(一)
权限:权限就是一个包含正则的url. Rbac 权限管理: Role-Based Access Control,基于角色的访问控制.用户通过角色与权限进行关联,一个用户可以有多个角色,一个角色可以有多 ...
- thinkphp5.0写的项目放到服务器上 lnmp 404
tp5在Nginx上不适用pathinfo格式的url,在项目的Nginx配置文件里找到include enable-php.conf 改为 include enable-php-pathinfo.c ...
- sqlserver给指定用户授权访问指定表
一. 背景 外部公司的人授权访问我们公司的数据库,数据接口调用,要给他们建立查看指定的视图和授权的账号,因此要在数据库中,给指定用户授权访问指定表 二.sqlserver 脚本 ---创建视图CR ...
- spring boot(十八)集成FastDFS文件上传下载
上篇文章介绍了如何使用Spring Boot上传文件,这篇文章我们介绍如何使用Spring Boot将文件上传到分布式文件系统FastDFS中. 这个项目会在上一个项目的基础上进行构建. 1.pom包 ...
- hashCode会出现负数吗,答案是肯定的
先来普及一下基本数据类型的长度: unsigned int 0-4294967295 int -2147483648-2147483647 unsigned long 0-429496 ...
- Oracle PL/SQL游标
游标的提出: SQL是面向集合的,其结果一般是集合量(多条记录),而PL/SQL的变量一本是标量,其一组变量异常一直只能存放一条记录.所以仅仅使用变量并不能完全满足SQL语句向应用程序输出数据的要求. ...
- PAT 1015 Reversible Primes
1015 Reversible Primes (20 分) A reversible prime in any number system is a prime whose "rever ...