MySQL, хранимая функция, использующая переменную STRING в качестве QUERY

Мне было интересно, возможно ли в хранимой функции или хранимой процедуре 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 предназначен для возврата идентификатора строк, вычисляющих district_id и некоторую комбинацию county_id, city_id и zip_id. Дело в том, что я хочу вернуть идентификатор строки, соответствующей точной комбинации идентификаторов, а не идентификаторов строк, содержащих какие-либо из этих идей. Для этого я хочу сегментировать оператор запроса, чтобы он был построен с учетом предоставленных идентификаторов. Я пытаюсь не сопоставлять нули, если могу.

Я понимаю, что это можно легко сделать с помощью PHP, но я хотел бы сделать это как хранимый процесс mysql, если я могу по какой-либо другой причине, тогда все другие функции для этого являются хранимыми процессами.


person Brook Julias    schedule 18.08.2010    source источник


Ответы (1)


Да, вы можете PREPARE и EXECUTE строка как динамический SQL в хранимой процедуре.

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, которое будет хранимой функцией.

person Bill Karwin    schedule 18.08.2010
comment
Я просмотрел заявление PREPARE, мне придется потратить на него больше времени. - person Brook Julias; 19.08.2010
comment
Спасибо, это очень полезно. - person Brook Julias; 19.08.2010
comment
Можете ли вы сослаться на параметры из запроса @query? Я попытался и получил неизвестную ошибку столбца. - person TheRealChx101; 15.05.2015
comment
Неважно. Я только что понял, что могу просто добавить к нему фактическое значение, как вы сделали выше. - person TheRealChx101; 15.05.2015