【问题标题】:MySQL Stored Procedure, error: Result consisted of more than one rowMySQL存储过程,错误:结果包含多于一行
【发布时间】:2015-04-10 08:16:01
【问题描述】:

我正在尝试编写 MySQL 存储过程,但遇到了一些问题。 当我尝试执行它时,我收到错误 1172:结果包含多于一行。 我不知道我做错了什么。

这是我的代码:

CREATE PROCEDURE bepaal_lijst_van_bij_te_bestellen_artikelen()
BEGIN
DECLARE varArtikel, varBesteld, varVoorraad, cnt, varVerschil, resultaten INT DEFAULT 0;

DROP TABLE IF EXISTS __besteld_voorraad;
CREATE TEMPORARY TABLE __besteld_voorraad
    (artikelid INT, besteld INT, voorraad INT, controle INT) ENGINE = HEAP;

main: BEGIN
    -- test if table is empty
    SELECT COUNT(*) FROM items INTO cnt;
    IF cnt=0 THEN LEAVE main; END IF;

    SELECT items.artikel_id AS artikelid, items.aantal AS besteld, artikelen.voorraad AS voorraad
    FROM items 
    INNER JOIN artikelen 
    ON items.artikel_id=artikelen.artikel_id
    INTO varArtikel, varBesteld, varVoorraad;

    INSERT INTO __besteld_voorraad (artikelid,besteld,voorraad,controle)
    VALUES (varArtikel,varBesteld,varVoorraad,varVerschil);

    SELECT COUNT(*) FROM __besteld_voorraad INTO resultaten;
    SET cnt=1;

    -- loop
    lus: WHILE cnt<resultaten DO
        SELECT artikelid,besteld,voorraad FROM __besteld_voorraad 
        LIMIT cnt,resultaten
        INTO varArtikel, varBesteld, varVoorraad;

        IF (varVoorraad - varBesteld <= 0) THEN
            SET varVerschil = -1;
        ELSE
            SET varVerschil = 1;
        END IF;

        UPDATE __besteld_voorraad
        SET controle = varVerschil
        WHERE artikelid = varArtikel AND besteld = varBesteld AND voorraad = varVoorraad;

        SET cnt = cnt + 1;
    END WHILE lus;
END main;

SELECT artikelid, controle FROM __besteld_voorraad ORDER BY artikel_id ASC;
DROP TABLE __besteld_voorraad;
END

【问题讨论】:

    标签: mysql stored-procedures procedure


    【解决方案1】:

    因为您的 select into 命令返回不止一行。我不明白完整的概念,但我猜你是想在售出后减少数量?

    更改这部分

    SELECT items.artikel_id AS artikelid, items.aantal AS besteld, artikelen.voorraad AS voorraad
        FROM items 
        INNER JOIN artikelen 
        ON items.artikel_id=artikelen.artikel_id
        INTO varArtikel, varBesteld, varVoorraad;
    
        INSERT INTO __besteld_voorraad (artikelid,besteld,voorraad,controle)
        VALUES (varArtikel,varBesteld,varVoorraad,varVerschil);
    

    收件人:

    INSERT INTO __besteld_voorraad (artikelid,besteld,voorraad,controle)
        (SELECT
            items.artikel_id AS artikelid,
            items.aantal AS besteld,
            artikelen.voorraad AS voorraad
        FROM items INNER JOIN artikelen ON items.artikel_id=artikelen.artikel_id);
    

    这部分:

    SELECT artikelid,besteld,voorraad FROM __besteld_voorraad 
            LIMIT cnt,resultaten
    

    收件人:

    SELECT artikelid,besteld,voorraad FROM __besteld_voorraad 
            LIMIT cnt,1
    

    我确信可能有更优雅的解决方案,但正如我所说,我无法理解您的概念。以上更正只是为了摆脱“结果包含多于一行”错误。试试看!

    【讨论】:

    • 谢谢,但现在我收到“列与第 1 行的值计数不匹配”错误。我要查看的是库存减去订单是否小于或等于零。 (voorraad - besteld
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 2014-11-30
    • 2011-01-15
    • 1970-01-01
    相关资源
    最近更新 更多