从存储过程返回一个结果集

时间:2011-09-20 15:38:57

标签: mysql stored-procedures

我开始尝试熟悉MySQL中的存储过程。

我想知道是否可以逐步构建结果集 - 或者我是否需要使用临时表?

我的第一枪是

CREATE TEMPORARY TABLE t1 (id int);

INSERT INTO t1 VALUES (1), (2), (3), (4);

CREATE TEMPORARY TABLE t2 (id1 int, id2 int);

INSERT INTO t2 VALUES (5,4),(3,2),(1,0),(12,34);

DROP PROCEDURE IF EXISTS curdemo;

delimiter //

CREATE PROCEDURE curdemo()
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE a INT;
  DECLARE b,c INT;
  DECLARE cur1 CURSOR FOR SELECT id FROM t1 LIMIT 1000;
  DECLARE cur2 CURSOR FOR SELECT id1, id2 FROM t2 LIMIT 1000;
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

  OPEN cur1;
  OPEN cur2;
  -- 1
  REPEAT
    FETCH cur1 INTO a;
    FETCH cur2 INTO b, c;
    IF NOT done THEN
       SELECT a, b, c;
       -- 2
    END IF;
  UNTIL done END REPEAT;

  CLOSE cur1;
  CLOSE cur2;
  -- 3
END

//

DELIMITER ;

这导致4个结果集,每个结果集包含一行。我想要的是一个包含4行的结果集。

所以我添加了

DROP TEMPORARY TABLE IF EXISTS tt;
CREATE TEMPORARY TABLE tt (id1 int, id2 int, id3 int);

INSERT INTO tt VALUES (a, b, c);

SELECT * FROM tt;
DROP TEMPORARY TABLE tt;

在适当的地方( - 1, - 2 - 替换SELECT和--3),它​​起作用了。

我现在的问题:还有其他办法吗?也许只声明我的结果集的形式然后逐行“生成”,而不需要临时表(及其临时存储分配)?

1 个答案:

答案 0 :(得分:1)

您可以使用类似的连接组合两个选择:

SELECT id, id1, id2 FROM (
  SELECT @rank:= @rank+1 as rank1, t1.id, t2.id1, t2.id2 FROM t1 
  STRAIGHT JOIN (SELECT @rank:= 1) r
  LEFT JOIN (SELECT @rank as rank2, id1, id2 FROM t2 LIMIT 1000) s
    ON (rank1 = rank2)
  ) s1