web-dev-qa-db-ja.com

プロシージャのMySQL foreachの代替

私の問題はかなり単純です。製品セットを格納するテーブルsetsがあります(外部の製品のように見える製品-コンピュータ、マウス、キーボードなど)。それは、productsテーブルに_sets_products_テーブルを使用してM:Nに接続されています。各製品にはパラメーターを設定できます(M:Nに再度接続されます)。

すべてのパラメーターを文字列として生成するプロシージャがあります(検索キャッシュ用-'hdd:120GB、LCD:1440:900、..'など)が、セットの製品をループして、それぞれのプロシージャを呼び出す必要がありますそれら。これはトリガーで使用されるため、PHPではできません。

このようなものを使用したい(疑似SQL)

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

これはMySQLで実行できますか?

31
Tomáš Fejfar

カーソルに関するmysqlリファレンス です。だから私はそれがこのようなものだと推測しています:

  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

これはMySQLで実行できますが、非常に直感的ではありません。

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;//

このガイドをご覧ください: mysql-storedprocedures.pdf

11
Max Toro