【问题标题】:MySQL, stored-function, using STRING variable as QUERYMySQL,存储函数,使用 STRING 变量作为查询
【发布时间】:2011-03-31 19:34:22
【问题描述】:

我想知道是否可以在 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_idcity_idzip_id 的某种组合的行的 id。问题是我想返回与 id 的确切组合匹配的行的 id,而不是包含任何这些想法的行的 id。为此,我想对我的查询语句进行分段,以便它特定于提供的 id 构建。如果可以的话,我试图不必匹配空值。

我意识到这可以用 PHP 轻松完成,但如果我不能出于其他原因,我希望将其作为 mysql 存储过程执行,那么所有其他函数都是存储过程。

【问题讨论】:

    标签: stored-procedures mysql stored-functions


    【解决方案1】:

    是的,您可以将PREPAREEXECUTE 字符串作为存储过程中的动态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 子句声明您的例程,这将是一个存储函数。

    【讨论】:

    • 我已经查看了PREPARE 声明,我将不得不花更多时间在上面。
    • 谢谢,这非常有帮助。
    • 您能否引用@query 查询中的参数?我尝试了一个未知的列错误。
    • 没关系。我只是想我可以像你上面那样附加实际值。
    猜你喜欢
    • 1970-01-01
    • 2011-07-24
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多