tp5调用游标存储过程返回连接爆量错误,求解!

浏览:3336 发布日期:2016/08/09 分类:ThinkPHP5专区 关键字: tp5 存储过程 mysql
由于tp5支持存储过程,因此在新项目中将一些复杂的查询写到了存储过程,其中一段是获取树结构的递归查询,我在这里用了mysql的游标查询,代码如下:CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_get_tree`(parentInt int)
BEGIN

DECLARE _cid INT;
DECLARE _sort INT;
DECLARE _title VARCHAR(100) CHARACTER SET UTF8;
DECLARE _pcid INT;
DECLARE _lvl INT;

DECLARE _con INT DEFAULT 0;

DECLARE _done INT DEFAULT 0;
DECLARE _rs CURSOR FOR SELECT cid,sort,title,pcid,lvl FROM dp_category WHERE pcid = parentInt;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = 1;

DROP TABLE IF EXISTS temp_table;
CREATE TEMPORARY TABLE temp_table
(
    cid INT,
    sort INT,
    title VARCHAR(100),
    pcid INT,
    lvl INT
)
CHARSET = UTF8;
TRUNCATE TABLE temp_table;

OPEN _rs;

REPEAT

    FETCH NEXT FROM _rs INTO _cid,_sort,_title,_pcid,_lvl;
    IF NOT _done THEN
        INSERT INTO temp_table(cid,sort,title,pcid,lvl) VALUES(_cid,_sort,_title,_pcid, _lvl);
    
        SELECT COUNT(*) INTO _con FROM dp_category WHERE pcid = _cid;
        IF _con > 0 THEN
            INSERT INTO temp_table(cid,sort,title,pcid,lvl) SELECT cid,sort,title,pcid,lvl FROM dp_category WHERE pcid = _cid;
        END IF;
    END IF;
    
UNTIL _done
END REPEAT;

CLOSE _rs;

SELECT * FROM temp_table;

DROP TABLE temp_table;

END
表结构是:

这个在mysql正常跑通没问题返回想要的结果

但是用tp5调用的时候返回的错误如下:

这个查了一下是连接量暴增,连接堆栈不够用,基本不太常见

排查了一下如果使用游标就不能最后再用SELECT,如果用SELECT不能用游标
考虑是否和tp5没有关系特别用php原生调用了试了一下<?php
$conn = new mysqli('localhost', 'root', '', 'dsp');
$result = $conn->query("call test()");
print_r($result);
返回的结果是正确的,说明不是php或是mysql存储过程的问题,应该还是出在tp5框架上,看看哪位有兴趣一起研究一下这个问题。
最佳答案
评论( 相关
后面还有条评论,点击查看>>