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
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
Mal vom DECLARE und SET der sendungsnummer abgesehen, das Leerzeichen vor ID bei COUNT(` ID `).
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)?