4

mysqlのストアド関数またはストアドプロシージャで、後で実行できる文字列変数としてmysqlクエリを作成できるかどうか疑問に思いました。get_district_part ((district_id INT,county_id INT,city_id INT,zip_id INT)) RETURNS INTテーブルを参照するストアド関数があります。

CREATE TABLE IF NOT EXISTS `modx`.covereage_district_part(
    id      INT     NOT NULL    AUTO_INCREMENT  PRIMARY KEY,
    districtID  INT     NOT NULL,
    countyID    INT,
    cityID      INT,
    zipID       INT,
    FOREIGN KEY (districtID) REFERENCES `modx`.coverage_district (id),
    FOREIGN KEY (countyID) REFERENCES `modx`.coverage_county (id),
    FOREIGN KEY (cityID) REFERENCES `modx`.coverage_city (id),
    FOREIGN KEY (zipID) REFERENCES `modx`.coverage_zip (id)
);

get_distrct_part行のIDと、、、、district_idおよびの組み合わせcounty_idを返すことを目的city_idとしていzip_idます。問題は、これらのアイデアのいずれかを含む行のIDではなく、IDの正確な組み合わせに一致する行のIDを返したいということです。そのために、クエリステートメントをセグメント化して、提供されたIDに固有に構築されるようにします。可能であれば、nullを一致させる必要がないようにしています。

これはPHPで簡単に実行できることを理解していますが、他の理由がない場合はmysqlストアドプロセスとしてこれを実行し、他のすべての関数はストアドプロセスになります。

4

1 に答える 1

7

はい、ストアドプロシージャで動的SQLとして文字列を使用PREPAREできます。EXECUTE

delimiter //
CREATE PROCEDURE get_district_part (district_id INT, county_id INT, city_id INT, zip_id INT)
BEGIN
  SET @query = 'SELECT id FROM covereage_district_part WHERE 1=1';

  IF (district_id IS NOT NULL) THEN
    SET @query = CONCAT(@query, ' AND districtID=', district_id);
  END IF;

  IF (county_id IS NOT NULL) THEN
    SET @query = CONCAT(@query, ' AND countyID=', county_id);
  END IF;

  IF (city_id IS NOT NULL) THEN
    SET @query = CONCAT(@query, ' AND cityID=', city_id);
  END IF;

  IF (zip_id IS NOT NULL) THEN
    SET @query = CONCAT(@query, ' AND zipID=', zip_id);
  END IF;

  PREPARE stmt1 FROM @query;

  EXECUTE stmt1;
END //
delimiter ;

call get_district_part(1,1,1,1);
call get_district_part(1,1,null,null);

注:ただし、ストアド関数で動的SQLを実行することはできません。あなたの質問はRETURNS、ストアド関数となる句を使用してルーチンを宣言することに言及しています。

于 2010-08-18T21:27:15.613 に答える