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

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

查询此表某个id=4028ab535e370cd7015e37835f52014b(公司1)下的所有数据

正常情况下,我们采用递归算法查询,如下


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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区域编写存储过程内容


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

BEGIN

    #声明一个flag变量,默认值为-99

    DECLARE flag INT DEFAULT -99;

    

    #创建companyTempTabl_Qurey临时表

    CREATE TEMPORARY TABLE IF NOT EXISTS companyTempTabl_Qurey (

        id VARCHAR(32) NOT NULL,

        `nameVARCHAR(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,

        `nameVARCHAR (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,

            `nameVARCHAR (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层只需要调用一次该 存储过程,就可以返回自己想要的数据,存储过程中创建的临时表随着链接的释放自动删除

原文地址:https://www.cnblogs.com/wangjintao-0623/p/10086893.html

时间: 2024-10-12 03:02:23

用mysql存储过程代替递归查询的相关文章

mysql存储过程之递归查询

对一颗树型结构存储的表进行递归查询,使用navicat for mysql 创建存储过程 pro_show_knowledge, 参数 --  IN `rootId` int   ,通过知识点查询所有子节点数据并插入到临时表 tmp_knowledge_data中. 注意深度的设置 , set max_sp_recursion_depth = 100 ; 这句话必须加上. BEGIN #设置递归查询的层深上限  set max_sp_recursion_depth = 100; #创建临时表tm

MySQL存储过程定义及调用

#MySQL存储过程 ##最简单的存储过程 DROP PROCEDURE IF EXISTS sp1; CREATE PROCEDURE sp1() COMMENT '最简单的存储过程' SELECT 1; ##调用 CALL sp1 (); ##带输入参数的存储过程 DROP PROCEDURE IF EXISTS sp2; CREATE PROCEDURE sp2(IN p INT) COMMENT '带输入参数的存储过程' SELECT p; ##调用 CALL sp2(1); #带输出参

MySQL存储过程详解 mysql 存储过程

MySQL存储过程详解  mysql 存储过程 (2010-12-13 10:59:38) 转载▼ 标签: it 分类: mysql mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保

MySQL 存储过程检测表是否存在

SQL语句实现: SELECT COUNT(*) FROM information_schema.`TABLES` WHERE TABLE_NAME='youTableName'; where子句中,表名是字符串类型,要加单引号. MySQL存储过程中 函数实现: CREATE DEFINER = `root`@`localhost` FUNCTION `tableExists`(`tName` varchar(30))  RETURNS tinyint(4) BEGIN DECLARE tab

mysql存储过程入门与提高(第三篇)

由于一些不好说的原因,以后博客内容大多只会发笔记的截图.此博客只发在my.oschina.net上,请勿作任何商业用途!! mysql存储过程:是指在数据库中定义一组sql语句组合在一起,并当作一个整体存储在mysql服务器中. 和存储函数的最主要的区别是对于存储过程来说可以返回参数,如记录集,而函数只能返回值或者表对象.函数只能返回一个变量:而存储过程可以返回多个.my.oschina.net讲存储函数的时候会把储存过程和存储函数的区别列出来.my.oschina.net 基本形式: CREA

MYSQL存储过程和函数学习笔记

学至Tarena金牌讲师何山,金色晨曦科技公司技术总监沙利穆课程笔记的综合. 1. 什么是存储过程和函数 将SQL语句放入一个集合里,然后直接调用存储过程和函数来执行已经定义好的SQL语句,通过存储过程和函数,可以避免开发人员重复编写相同的SQL语句. MYSQL存储过程和函数是保存在服务器中,在服务器中存储和执行,可以减少客户端和服务器端之间数据传输的消耗. 存储过程就是一组已经保存在数据库中的语句,并且可以随时地调用. 存储过程允许标准组件式编程,存储过程在被创建以后可以在程序中被多次调用而

MySQL存储过程详解 mysql 存储过程(转:http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html)

转:http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和

当PHP遇到MySQL存储过程

1.MySQL存储过程 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和一些特殊的控制结构组成.当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的.数据库中的存储过程可以看做是对编

【瞎折腾系列】mysql存储过程初接触

开始[瞎折腾系列],这个系列纯属瞎折腾,可能没有什么实际意义. mysql存储过程生成表: 新建一张user表,包含id, username , password , usertable字段. 然后创建存储过程: create PROCEDURE create_table() BEGIN DECLARE n int DEFAULT 0; DECLARE t_error INTEGER DEFAULT 0; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET