zoukankan      html  css  js  c++  java
  • QA: mysql group_concat长度限制

     SQL查询修改

    -- 查找当前数据库长度
    show variables like 'group_concat_max_len' 
    -- 设置当前session的group_concat长度,其他session连接不受影响
    SET SESSION group_concat_max_len = 10240;
    -- 设置全局group_concat长度
    SET GLOBAL group_concat_max_len = 10240
    [Err] 1227 - Access denied; you need (at least one of) the SUPER privilege(s) for this operation
    当前mysql用户不允许,请联系DBA。DBA可能告诉你,长度太长了,性能差,还可能挂。
    

    Java执行修改

    stmt = conn.createStatement(); // 当前的JDBC连接
    
    stmt.execute("set session group_concat_max_len = 150000");

     注意:group_concat长度不够会导致结果丢弃。

    比如下面的存储过程:

    CREATE DEFINER=`jlslyt`@`%` PROCEDURE `batchGetNsjgTreeList`(
        dwCode VARCHAR (20),
        rootId VARCHAR (1000),
        isParent INT,
        haveSelf INT
    )
    BEGIN
        # isParent    0:查询子节点 1:查询父节点 2:返回经过节点的父节点以及子节点。
        #    haveSelf    0: 不包含自身 1:包含自身a
    DECLARE nsjgIds_all TEXT ;
    DECLARE tableName VARCHAR (100) ;
    DECLARE fieldName VARCHAR (100) ;
    DECLARE whereFieldName VARCHAR (100) ; # 记录所有的ID。
    SET nsjgIds_all =
    IF (
        haveSelf = 1,
        CAST(rootId AS CHAR),
        ""
    ) ; loop_start :
    LOOP
    
    SET fieldName =
    IF (
        isParent = 0,
        'NSJGID',
        'PARID'
    ) ;
    SET tableName = CONCAT(
        "XH_NSJG_TB",
    
    IF (LENGTH(dwCode) > 0, "_", ""),
     dwCode
    ) ;
    SET whereFieldName =
    IF (
        isParent > 0,
        'NSJGID',
        'PARID'
    ) ;
    SET @nsjgIds = CAST(rootId AS CHAR) ;
    SET @curSql = CONCAT(
        "SELECT GROUP_CONCAT(",
        fieldName,
        ") INTO @nsjgIds FROM ",
        tableName,
        " WHERE FIND_IN_SET (",
        whereFieldName,
        ",?)"
    ) ; # 循环查询所有节点
    WHILE LENGTH(@nsjgIds) > 0 DO
        PREPARE stmt
    FROM
        @curSql ; EXECUTE stmt USING @nsjgIds ; DEALLOCATE PREPARE stmt ;
    IF @nsjgIds IS NOT NULL THEN
    
    SET nsjgIds_all = CONCAT(
        nsjgIds_all,
    
    IF (LENGTH(nsjgIds_all), ",", "") ,@nsjgIds
    ) ;
    END
    IF ;
    END
    WHILE ;
    SET isParent = isParent - 2 ;
    IF isParent < 0 THEN
        LEAVE loop_start ;
    END
    IF ;
    END
    LOOP
        ;
    SET @curSql = CONCAT(
        "SELECT * FROM ",
        tableName,
        " WHERE NSJGID IN (",
        nsjgIds_all,
        ")"
    ) ; PREPARE stmt
    FROM
        @curSql ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
    END
    
    
    -----------------------------------------------------------------------------------------------------------
    
    
    DELIMITER $$
    
    USE `xht_ywp`$$
    
    DROP PROCEDURE IF EXISTS `batchGetNsjgTreeList`$$
    
    CREATE DEFINER=`dlwy`@`%` PROCEDURE `batchGetNsjgTreeList`(dwCode VARCHAR(20),rootId VARCHAR(1000),isParent INT, haveSelf INT)
    BEGIN 
    
        # isParent    0:查询子节点 1:查询父节点 2:返回经过节点的父节点以及子节点。
    
        #    haveSelf    0: 不包含自身 1:包含自身a
    
        DECLARE nsjgIds_all TEXT;
    
        DECLARE    tableName VARCHAR(100);
    
        DECLARE    fieldName VARCHAR(100);
    
        DECLARE    whereFieldName VARCHAR(100);
    
        # 记录所有的ID。
    
        SET nsjgIds_all = IF(haveSelf=1,CAST(rootId AS CHAR),"");
    
        loop_start : LOOP
    
            SET fieldName = IF(isParent=0,'NSJGID','PARID');
    
            SET tableName = CONCAT("XH_NSJG_TB",IF(LENGTH(dwCode)>0,"_",""),dwCode);
    
            SET whereFieldName = IF(isParent>0,'NSJGID','PARID');
    
            SET @nsjgIds = CAST(rootId AS CHAR);
    
            SET @curSql = CONCAT("SELECT GROUP_CONCAT(",fieldName,") INTO @nsjgIds FROM ",tableName," WHERE FIND_IN_SET (",whereFieldName,",?)");
    
            # 循环查询所有节点
    
            WHILE LENGTH(@nsjgIds) > 0 DO 
    
                PREPARE stmt FROM @curSql;
    
                EXECUTE stmt USING @nsjgIds;
    
                DEALLOCATE PREPARE stmt; 
    
                IF @nsjgIds IS NOT NULL THEN
    
                    SET nsjgIds_all = CONCAT(nsjgIds_all,IF(LENGTH(nsjgIds_all),",",""),@nsjgIds);
                    
    
                END IF;
    
            END WHILE;  
    
            SET isParent = isParent - 2;
    
            IF isParent < 0 THEN  
    
                LEAVE loop_start;
    
            END IF;  
    
        END LOOP;  
    
        SET @curSql = CONCAT("SELECT * FROM ",tableName," WHERE NSJGID IN (",nsjgIds_all,")");
    
        PREPARE stmt FROM @curSql;
    
        EXECUTE stmt ;
    
        DEALLOCATE PREPARE stmt;
    
    END$$
    
    DELIMITER ;
  • 相关阅读:
    不敢想,做个博客竟如此简单!
    我有一台服务器,能干啥?
    精品 IDEA 插件大汇总!值得收藏
    怒肝半月!Python 学习路线+资源大汇总
    怒肝 Linux 学习路线,这回不难
    多环境
    分享 10 个高星的创意项目!
    js的attribute
    选择大厂该做哪些准备?|小白进入大厂现状
    小白程序猿了解大厂的开发模式
  • 原文地址:https://www.cnblogs.com/boonya/p/14115315.html
Copyright © 2011-2022 走看看