【问题标题】:Mysql stored procedure multiple selectsMysql存储过程多选
【发布时间】:2012-01-27 19:19:31
【问题描述】:

我正在运行一个存储过程。问题似乎是它将进入 if 语句。同样出于某种原因,无论我使用多少选择,它只会返回第一个。我已经从另一个像魅力一样工作的存储过程中复制了这个,但是这个不会去。有什么想法吗?

DROP PROCEDURE IF EXISTS genSelPriceTier;
DELIMITER $$
CREATE PROCEDURE genSelPriceTier(tier_id INT, default_id INT)
    BEGIN
       DECLARE rowCount INT DEFAULT 0;  
          SELECT * FROM price_tier WHERE price_tier_id = tier_id;
          SET rowCount = FOUND_ROWS();
        IF rowCount < 1 THEN
            SELECT * FROM price_tier WHERE price_tier_id = default_id;
            END IF;
    END$$
DELIMITER ;

【问题讨论】:

    标签: mysql stored-procedures select


    【解决方案1】:

    有一个bug 报告与 FOUND_ROWS() 的使用有关。因此,我建议使用 Count(*) 作为返回的行数。像下面这样的东西应该可以工作。

    DROP PROCEDURE IF EXISTS genSelPriceTier;
    DELIMITER $$
    CREATE PROCEDURE genSelPriceTier(tier_id INT, default_id INT)
        BEGIN
           DECLARE rowCount INT DEFAULT 0;  
              SELECT COUNT(*) INTO rowCount FROM price_tier WHERE price_tier_id = tier_id 
            IF rowCount < 1 THEN
                SELECT * FROM price_tier WHERE price_tier_id = default_id;
                END IF;
        END$$
    DELIMITER ;
    

    【讨论】:

    • 是的,当然小于 1 或 rowCount = 0 会起作用,但很抱歉,这个答案也不起作用。很困惑
    • 没有错误,它只是不进入 If 语句并返回第二个选择,如果在第一个选择中没有找到,例如如果 rowCount 返回的值小于 1
    • 再看它一定是在找到的行中返回一个大于 1 的值。我在 DB id 1 和 2 中分别记录了 2 个。所以如果我通过 (0,2) 我应该返回记录 2 作为默认值,但它没有
    • 我已经编辑了我的答案 - 添加了不返回行的限制,这可能是 FOUND_ROWS() 正常工作所必需的。你可以试试这个吗?
    • 我有但仍然没有骰子。奇怪的是我在另一个存储过程中运行以下内容,它可以工作 SELECT hit_date FROM hit_counter WHERE page = this_page AND site = this_site AND hit_date = CURDATE(); SET rowCount = FOUND_ROWS(); IF rowCount
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 2019-10-28
    相关资源
    最近更新 更多