JDBC创建mysql树函数

最近在写多维计算的东西,需要支持mysql的数据库,mysql跟oracle和PG不同,简直特立独行,不支持窗口函数,也没有封装好的树函数,没办法只好百度加自己造。总算造出来一个小树,哈哈,然后紧接着碰到了JDBC创建mysql函数问题,试了几回发现是mysql的函数提的问题,我之后拆开运行。以下是代码总结,希望能帮到以下有同样困难的孩子,,不足之处请指出!

首先是根绝子节点进行寻根的树结构,可以在navicat直接运行的(需要的话替换称自己的表信息和字段),, 可以在这个基础上进行改造,具体的我就不讲解了。

 //根据子节点获取根节点
 delimiter /
DROP FUNCTION IF EXISTS `avatar`.`getParentList`/
CREATE FUNCTION `getParentList`(nodeName varchar(1000))
  RETURNS VARCHAR(1000)
  BEGIN
    DECLARE ptemp VARCHAR(1000);
    DECLARE ctemp VARCHAR(1000);
    SET ptemp = '#';
    SET ctemp = (select type_id from MD_TYPE where type_name = nodeName);
    WHILE ctemp IS NOT NULL DO
      SET ptemp = concat(ptemp, ',', ctemp);
      SELECT group_concat(parent_id)
      INTO ctemp
      FROM MD_TYPE
      WHERE FIND_IN_SET(type_id, ctemp) > 0;
    END WHILE;
    RETURN ptemp;
  END;


select type_id,type_name,type_level,parent_id from MD_TYPE where find_in_set(type_id,getParentList('日常检修1'));
这是将上面的函数移植到JDBC进行使用,不要直接嵌套,JAVA会报错的
 String deleteFunctionSql="DROP FUNCTION IF EXISTS `"+resource_attr_map.get(DBNAME)+"`.`getChildList`";
                    stmt_query = resConn.prepareStatement(deleteFunctionSql);
                    stmt_query.executeUpdate();

                    String createFunctionSql="CREATE FUNCTION `getChildList`(nodeName varchar(1000))\n" +
                            "  RETURNS VARCHAR(1000)\n" +
                            "  BEGIN\n" +
                            "    DECLARE ptemp VARCHAR(1000);\n" +
                            "    DECLARE ctemp VARCHAR(1000);\n" +
                            "    SET ptemp = '#';\n" +
                            "    SET ctemp = (select type_id from MD_TYPE where type_name=nodeName);\n" +
                            "    WHILE ctemp IS NOT NULL DO\n" +
                            "      SET ptemp = concat(ptemp, ',', ctemp);\n" +
                            "      SELECT group_concat(type_id)\n" +
                            "      INTO ctemp\n" +
                            "      FROM MD_TYPE\n" +
                            "      WHERE FIND_IN_SET(parent_id, ctemp) > 0;\n" +
                            "    END WHILE;\n" +
                            "    RETURN ptemp;\n" +
                            "  END;";
                    stmt_query = resConn.prepareStatement(createFunctionSql);
                    stmt_query.executeUpdate();

                    sql ="select type_id,type_name,type_level,parent_id from MD_TYPE where find_in_set(type_id,getParentList('日常检修1'));";

                    stmt_query = resConn.prepareStatement(sql);
                    rs=stmt_query.executeQuery();
                    while (rs.next()){
                        leavesList.add(rs.getString(1));
                    }

猜你喜欢

转载自blog.csdn.net/qq_24084925/article/details/80198383