Laden...

Stored Procedure gibt Fehler "Ergebnis besteht aus mehr als einer Zeile" aus oder aktualisiert alles statt 2

Erstellt von echdeneth vor einem Jahr Letzter Beitrag vor einem Jahr 641 Views
echdeneth Themenstarter:in
161 Beiträge seit 2019
vor einem Jahr
Stored Procedure gibt Fehler "Ergebnis besteht aus mehr als einer Zeile" aus oder aktualisiert alles statt 2

Verwendetes Datenbanksystem: MySQL

Ich kann den Fehler einfach nicht finden.
Obwohl alle Einzel-Tests mit UPDATE Auftragsliste ... immer nur einen Eintrag ändern wenn ich die Sendungsnummer direkt angebe.

JSON ist "{"Spedition": 1,"Sendungsnummern":["010400030000123", "010400030000456"]}";

BEGIN
    DECLARE spedition INT;
    DECLARE sendungsnummern_json JSON;
    DECLARE sendungsnummern_count INT;
    DECLARE sendungsnummer VARCHAR(60);
    DECLARE i INT DEFAULT 0;
    DECLARE id INT;
    DECLARE new_id INT;
    DECLARE num INT;
    DECLARE bn VARCHAR(10);    
    DECLARE mydate DATE;
    DECLARE bord TEXT;
   
    DECLARE v_bord_content TEXT;
    DECLARE v_first_line_end INT;
    DECLARE v_second_line_start INT;
    DECLARE v_position_to_replace1 INT;
    DECLARE v_position_to_replace2 INT;
 
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        SHOW ERRORS;
        SELECT sendungsnummer AS Sendungsnummer;
        SELECT spedition AS Spedition;
        SELECT new_id AS LastInsertID;
        SELECT sendungsnummern_count;
        SELECT sendungsnummern_json;
        ROLLBACK;
    END;
   
    SET mydate = DATE(NOW());
   
    SET spedition = json_extract(json_param, '$.Spedition');
    SET sendungsnummern_json = json_extract(json_param, '$.Sendungsnummern');
    SET sendungsnummern_count = json_length(sendungsnummern_json);

        SELECT sendungsnummern_count;
        SELECT sendungsnummern_json;

    SELECT MAX(Borderonummer) INTO bn FROM Ladeliste;
    SET num = CAST(SUBSTRING(bn, 7) AS INT) + 1;
    SET bn = CONCAT('MEGA23', LPAD(num, 4, '0'));


    START TRANSACTION;


    INSERT INTO Ladeliste (`Borderonummer`, `Ladedatum`, `Sped`) VALUES (bn, mydate, spedition);
    SELECT LAST_INSERT_ID() INTO new_id;


    WHILE i < sendungsnummern_count DO
        SET sendungsnummer = json_extract(sendungsnummern_json, CONCAT('$[', i, ']'));
       
        SELECT sendungsnummer;

        UPDATE Auftragsliste 
        SET LadelisteID = new_id 
        WHERE Sendungsnummer = sendungsnummer;

        SET i = i + 1;
    END WHILE;
    COMMIT;
END

"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein

echdeneth Themenstarter:in
161 Beiträge seit 2019
vor einem Jahr

Ich konnte den Fehler denke ich reduzieren.

Frage: Was ist der Unterschied zwischen den beiden Codes?

BEGIN
    DECLARE i INT DEFAULT 0;
    WHILE i < 2 DO
        SELECT COUNT(`ID `) FROM `Auftragsliste` WHERE `Sendungsnummer` = "0104000300001009";
        SET i = i + 1;
    END WHILE;
END

Ergebnis: 1

BEGIN
    DECLARE i INT DEFAULT 0;
    DECLARE sendungsnummer VARCHAR(60);
    WHILE i < 2 DO
        SET sendungsnummer = "0104000300001009";
        SELECT COUNT(` ID `) FROM `Auftragsliste` WHERE `Sendungsnummer` = "0104000300001009";
        SET i = i + 1;
    END WHILE;
END

Ergebnis: 17

"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein

D
152 Beiträge seit 2013
vor einem Jahr

Mal vom DECLARE  und SET  der sendungsnummer abgesehen, das Leerzeichen vor ID bei COUNT(` ID `).

4.939 Beiträge seit 2008
vor einem Jahr
UPDATE Auftragsliste
SET LadelisteID = new_id
WHERE Sendungsnummer = sendungsnummer;

MySQL unterscheidet nicht zwischen Groß-/Kleinschreibung, d.h. beide S-/sendungsnummer beziehen sich auf die Tabellenspalte, d.h. dies entspricht where true, so daß alle Datensätze aktualisiert werden.

Bei MSSQL (T-SQL) würde man den Klammeraffen @ zur Unterscheidung benutzen, aber bei MySQL gibt es den so wohl nicht - benutze einfach einen anderen Namen.

PS: Meintest du in deinem letzten Code

SELECT COUNT(` ID `) FROM `Auftragsliste` WHERE `Sendungsnummer` = sendungsnummer;

(ansonsten gäbe es ja keine Unterschied zum Code davor)?