2011-09-20 6 views
1

Je commence à essayer de me familiariser avec les procédures stockées dans MySQL.Retour d'un jeu de résultats à partir d'une procédure stockée

Je me demande s'il est possible de construire un jeu de résultats étape par étape - ou suis-je obligé d'utiliser une table temporaire?

Mon premier coup

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 ; 

Cela conduit à 4 ensembles de résultats contenant chacun une ligne. Ce que je veux, c'est un ensemble de résultats contenant 4 lignes.

J'ajouté

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; 

aux endroits appropriés (--1, --2 - avec le remplacement de la commande SELECT et --3), et cela a fonctionné.

Ma question maintenant: Y a-t-il un autre moyen de le faire? Peut-être déclarer la forme de mon ensemble de résultats une fois, puis "céder" ligne par ligne, sans avoir besoin de la table temporaire (et son allocation de stockage temporaire)?

Répondre

1

Vous pouvez simplement combiner les deux en utilisant une jointure choisit comme ceci:

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 
+0

Thx 4 ya réponse. Ce serait faisable dans cet exemple, mais pas dans le cas général. (dans lequel on pourrait, cependant, penser à d'autres possibilités). Mais il semble vraiment pas d'autre moyen de le faire ... – glglgl

Questions connexes