查询此表某个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存储过程代替递归查询的更多相关文章

  1. MySQL存储过程(转)

    一.MySQL 创建存储过程 "pr_add" 是个简单的 MySQL 存储过程,这个存储过程有两个 int 类型的输入参数 "a"."b" ...

  2. MySql存储过程

    MySQL 存储过程 ```sql CREATE PROCEDURE myprocedure (IN para01 INTEGER) BEGIN DECLARE var01 CHAR(10); IF ...

  3. mysql存储过程和存储函数

    mysql存储过程和存储函数 存数函数代码示例: DROP PROCEDURE IF EXISTS calc_ci_day_suc_rate; delimiter // CREATE FUNCTION ...

  4. mysql存储过程编写-入门案例-遁地龙卷风

    (-1)写在前面 这篇文章只是简要的叙述了mysql存储过程编写的基本概念. 我使用的mysql版本是5.7.9-log. 参照<<深入浅出MySQL>>. (0) delim ...

  5. MySQL存储过程动态SQL语句的生成

    用Mysql存储过程来完成动态SQL语句,使用存储过程有很好的执行效率: 现在有要求如下:根据输入的年份.国家.节假日类型查询一个节假日,我们可以使用一般的SQL语句嵌入到Java代码中,但是执行效率 ...

  6. MySQL 存储过程

    MySQL 存储过程 存储过程是通过给定的语法格式编写自定义的数据库API,类似于给数据库编写可执行函数. 简介 存储过程是一组为了完成特定功能的SQL语句集合,是经过编译后存储在数据库中. 存储过程 ...

  7. mysql存储过程详解

    mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的S ...

  8. PHP调用MYSQL存储过程实例

    PHP调用MYSQL存储过程实例 标签: mysql存储phpsqlquerycmd 2010-09-26 11:10 11552人阅读 评论(3) 收藏 举报 实例一:无参的存储过程$conn = ...

  9. mysql存储过程语法及实例

    存储过程如同一门程序设计语言,同样包含了数据类型.流程控制.输入和输出和它自己的函数库. --------------------基本语法-------------------- 一.创建存储过程cr ...

随机推荐

  1. SQL中的where条件,在数据库中提取与应用浅析

    1. 问题描述 一条SQL,在数据库中是如何执行的呢?相信很多人都会对这个问题比较感兴趣.当然,要完整描述一条SQL在数据库中的生命周期,这是一个非常巨大的问题,涵盖了SQL的词法解析.语法解析.权限 ...

  2. php递归方法

    <?phpheader("Content-type:text/html;charset=utf-8");$city=array( array('id'=>1,'name ...

  3. PCM数据格式

    PCM数据格式          1. 音频简介 经常见到这样的描述: 44100HZ 16bit stereo 或者 22050HZ 8bit mono 等等. 44100HZ 16bit ster ...

  4. int __get_order(unsigned long size)

    2017-12-6 10:26:504.9.51int __get_order(unsigned long size){    int order; size--;    size >>= ...

  5. php匹配页面中的所有路径

    方法一 $url='http://www.google.cn/search?q=php'; $html=file_get_contents($url); $dom = new DOMDocument( ...

  6. ubuntu下常用命令

    目录 一.查找命令 二.打开相应文件 三.查看系统资源占用 四.Ubantu解压文件 五.虚拟机ubuntu server 14.0 根目录扩容 七.ubuntu 关机,重启,注销命令 1 关机命令 ...

  7. LVS-概念

    一.负载均衡LVS基本介绍 LB集群的架构和原理很简单,就是当用户的请求过来时,会直接分发到Director Server上,然后它把用户的请求根据设置好的调度算法,智能均衡地分发到后端真正服务器(r ...

  8. 把url链接转换成二维码的工具类

    import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.io ...

  9. PAT 1023 Have Fun with Numbers

    1023 Have Fun with Numbers (20 分)   Notice that the number 123456789 is a 9-digit number consisting ...

  10. Visual studio 利用Nuget 控制台安装已经下载好的插件

    利用Nuget 控制台安装已经下载好的插件 1 打开控制台 Tools > Library Package Manager > Package Manager Console 2 设置pa ...