Mysql存储过程递归插入临时表的问题

MARKtft 2010-06-08 12:48:43
大家好!存储过程中递归调用,将中间结果插入到临时表中。


树形结构的表如下:

DROP TABLE IF EXISTS `survey`.`tree_test`;
CREATE TABLE `survey`.`tree_test` (
`form_id` varchar(32) CHARACTER SET utf8 NOT NULL,
`parent_form_id` varchar(32) CHARACTER SET utf8 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO tree_test(form_id,parent_form_id) VALUES('001','000');
INSERT INTO tree_test(form_id,parent_form_id) VALUES('002','001');
INSERT INTO tree_test(form_id,parent_form_id) VALUES('003','001');
INSERT INTO tree_test(form_id,parent_form_id) VALUES('004','003');
INSERT INTO tree_test(form_id,parent_form_id) VALUES('005','002');
INSERT INTO tree_test(form_id,parent_form_id) VALUES('006','002');

保存中间结果的临时表如下:
CREATE TEMPORARY TABLE IF NOT EXISTS treeRecurisiveTest_tmp(
form_id VARCHAR(32),
parent_form_id VARCHAR(32)
) ENGINE=INNODB DEFAULT CHARSET=utf8;


存储过程如下:
DELIMITER $$

USE `survey`$$

DROP PROCEDURE IF EXISTS `treeRecurisiveTest`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `treeRecurisiveTest`(IN pid VARCHAR(32))
BEGIN
DECLARE v_done1 INT DEFAULT 0;
DECLARE v_form_id VARCHAR(32);
DECLARE v_parent_form_id VARCHAR(32);
DECLARE cur1 CURSOR FOR
SELECT t.form_id,t.parent_form_id
FROM tree_test AS t WHERE t.parent_form_id = pid;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET v_done1 = 1;
SET max_sp_recursion_depth = 12;

OPEN cur1;
FETCH cur1 INTO v_form_id,v_parent_form_id;
WHILE v_done1 <> 1 DO
INSERT INTO treeRecurisiveTest_tmp(form_id,parent_form_id) VALUES(v_form_id,v_parent_form_id);
CALL `survey`.`treeRecurisiveTest`(v_form_id);
FETCH cur1 INTO v_form_id,v_parent_form_id;
END WHILE;
CLOSE cur1;

SELECT * FROM treeRecurisiveTest_tmp;
END$$

DELIMITER ;



1、调用存储过程,传入顶级节点的FORM_ID

TRUNCATE TABLE treeRecurisiveTest_tmp;
CALL treeRecurisiveTest('001');

2、查看存储过程的返回结果
form_id form_name
002 001
005 002

3、存储过程调用后,直接用SELECT * FROM treeRecurisiveTest_tmp; 返回的结果。
form_id form_name
002 001
005 002
006 002
003 001
004 003

请教大家:为什么第2步中,存储过程直接返回的结果只有2条记录呢?
谢谢帮忙!

...全文
405 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
MARKtft 2010-06-09
  • 打赏
  • 举报
回复
问题解决了。原来是 因为存储过程最后select出了结果,自身又递归调用。
导致最后显示时,select出了多个结果。

谢谢
ACMAIN_CHM的帮忙!
ACMAIN_CHM 2010-06-09
  • 打赏
  • 举报
回复
每个SELECT都会产生一个recordset
MARKtft 2010-06-09
  • 打赏
  • 举报
回复
请问:
是否因为在存储过程的最后select出了结果集。
然后过程又自身递归调用,导致最后显示时,select出了多个结果。
ACMAIN_CHM 2010-06-09
  • 打赏
  • 举报
回复
你的存储过程返回的可不是一个结果集,是多个结果集。你需要在你的程序中进行处理。有些程序比如C是有nextrecord()方法的。
不过建议你还是把结果放到临时表中去比较方便。
MARKtft 2010-06-09
  • 打赏
  • 举报
回复
初用MYSQL,还请多指教。
我用SQLyog客户端工具,运行存储过程,返回结果是分页显示出来的。

1 结果 2 结果 ........ 7结果
form_id form_name form_id form_name form_id form_name
001 000 001 000
002 001 002 001
005 002 005 002
006 002

7结果是正常的。

但是,我用JAVA JPA 连接MYSQL,调用该存储过程{call treeRecurisiveTest(?)}.
返回的结果集,却是 1结果。没有取到最终正确的结果。
请问:是否可以可以一次性返回最终结果呢?谢谢!

ACMAIN_CHM 2010-06-09
  • 打赏
  • 举报
回复
存储过程返回的是。你认为哪儿不对?

mysql> TRUNCATE TABLE treeRecurisiveTest_tmp;
Query OK, 0 rows affected (0.01 sec)

mysql> CALL treeRecurisiveTest('001');
+---------+----------------+
| form_id | parent_form_id |
+---------+----------------+
| 002 | 001 |
| 005 | 002 |
+---------+----------------+
2 rows in set (0.08 sec)

+---------+----------------+
| form_id | parent_form_id |
+---------+----------------+
| 002 | 001 |
| 005 | 002 |
| 006 | 002 |
+---------+----------------+
3 rows in set (0.09 sec)

+---------+----------------+
| form_id | parent_form_id |
+---------+----------------+
| 002 | 001 |
| 005 | 002 |
| 006 | 002 |
+---------+----------------+
3 rows in set (0.09 sec)

+---------+----------------+
| form_id | parent_form_id |
+---------+----------------+
| 002 | 001 |
| 005 | 002 |
| 006 | 002 |
| 003 | 001 |
| 004 | 003 |
+---------+----------------+
5 rows in set (0.11 sec)

+---------+----------------+
| form_id | parent_form_id |
+---------+----------------+
| 002 | 001 |
| 005 | 002 |
| 006 | 002 |
| 003 | 001 |
| 004 | 003 |
+---------+----------------+
5 rows in set (0.11 sec)

+---------+----------------+
| form_id | parent_form_id |
+---------+----------------+
| 002 | 001 |
| 005 | 002 |
| 006 | 002 |
| 003 | 001 |
| 004 | 003 |
+---------+----------------+
5 rows in set (0.13 sec)

Query OK, 0 rows affected (0.13 sec)

mysql>
MARKtft 2010-06-08
  • 打赏
  • 举报
回复

感觉在MYSQL 存储过程中,
begin
..........
insert into tab(...) values(...);
(进行INSERT操作)
end ;

begin
...........
select * from tab;
(返回前面insert进的记录)
end;

1、存储过程直接返回的结果集记录 少了
2、存储过程调用后,写SQL语句 select * from tab 查出的结果集 又是正常的。




MARKtft 2010-06-08
  • 打赏
  • 举报
回复
怎么没人回复啊!
大家帮忙看看啊!谢谢!

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧