web-dev-qa-db-fra.com

MySQL foreach alternative pour la procédure

Mon problème est assez simple. J'ai une table sets qui stocke les ensembles de produits (plus de produits ressemblant à un à l'extérieur - ordinateur, souris et clavier par exemple) il est connecté M: N en utilisant sets_products table vers products table. Chaque produit peut avoir des paramètres (connecté à nouveau M: N).

J'ai une procédure qui génère tous les paramètres sous forme de chaîne (pour le cache de recherche - comme "hdd: 120GB, LCD: 1440: 900, .."), mais maintenant je dois parcourir les produits de l'ensemble et appeler la procédure pour chacun des leur. JE NE PEUX PAS LE FAIRE EN PHP, car cela est utilisé dans le déclencheur.

Je voudrais utiliser quelque chose comme ça (pseudo SQL)

FOREACH(SELECT products_id FROM sets_products WHERE set_id = 1)
    generate_parameter_list(product_id,@result)
    @param = CONCAT(@param,",",@result);
END FOREACH;

Cela peut-il être fait dans MySQL ou non?

31
Tomáš Fejfar

Voici le référence mysql pour les curseurs . Je suppose donc que c'est quelque chose comme ceci:

  DECLARE done INT DEFAULT 0;
  DECLARE products_id INT;
  DECLARE result varchar(4000);
  DECLARE cur1 CURSOR FOR SELECT products_id FROM sets_products WHERE set_id = 1;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

  OPEN cur1;

  REPEAT
    FETCH cur1 INTO products_id;
    IF NOT done THEN
      CALL generate_parameter_list(@product_id, @result);
      SET param = param + "," + result; -- not sure on this syntax
    END IF;
  UNTIL done END REPEAT;

  CLOSE cur1;

  -- now trim off the trailing , if desired
37
Rory

Cela peut être fait avec MySQL, bien que ce soit très peu intuitif:

CREATE PROCEDURE p25 (OUT return_val INT)
BEGIN
  DECLARE a,b INT;
  DECLARE cur_1 CURSOR FOR SELECT s1 FROM t;
  DECLARE CONTINUE HANDLER FOR NOT FOUND
  SET b = 1;
  OPEN cur_1;
  REPEAT
    FETCH cur_1 INTO a;
    UNTIL b = 1
  END REPEAT;
  CLOSE cur_1;
  SET return_val = a;
END;//

Consultez ce guide: mysql-storedprocedures.pdf

11
Max Toro