用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 ...
随机推荐
- 关于 Oracle DB CONSTRAINT约束的一些SQL ORA-02292: integrity constraint violated
ALTER TABLE table_name DISABLE CONSTRAINT constraint_name; select * from all_constraints where owner ...
- 如何有效地使用t-SNE | How to Use t-SNE Effectively
熟练使用PCA和tSNE,彻底理解底层的原理是非常有必要的. 参考:How to Use t-SNE Effectively Real-time tSNE Visualizations with Te ...
- 单分子荧光原位杂交(smFISH)
single-molecule RNA fluorescence in situ hybridization (RNA smFISH) 单分子荧光原位杂交(smFISH)是一种新的基因表达分析方法,能 ...
- linux权限管理之基本权限
基本权限 UGO ======================================================== 文件权限设置: 可以赋于某个用户或组 能够以何种方式 访问某个文件 ...
- (GoRails)在导航栏增加自动的搜索功能(jquery插件:easyautocomplete)(gem 'ransack' 搜索对象4000✨)
Global Autocomplete Search 需要用到一个JQuery插件和一个搜索对象的gem EasyAutocomplete jQuery插件: https://github.com/p ...
- 动态加载DataGrid表头及数据
初始化表头 js生成前端 /*初始化表头*/ function initDataGridTitle(id) { $.ajax({ url: '/${appName}/report/***/***', ...
- Mysql更改表名大小写不敏感
编辑配置文件 vi /etc/my.cnf 在[mysqld]后添加添加 lower_case_table_names=1 重启服务 service mysqld stop service mysql ...
- 【IDEA】【8】上传已有项目到Git
问题:开发初期没有建立GIT仓库,开发一段时间后,需要将已有代码上传到Git 解决方案: 1,首先使用Git命令行 git clone XXXXX.git 将项目下载 2,拷贝下载下来的项目根目录下的 ...
- js的正则表达式的替换
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Inse ...
- jquery解决file上传图片+图片预览
js解决file上传图片+图片预览 demo案例中代码为js原生控制,可以根据项目的需求修改为jquery操作 <!DOCTYPE html><html lang="en& ...