Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Procedura pętli przez ciąg znaków oddzielonych przecinkami nie działa

Może ten post jest trochę za stary, ale wypróbowałem kod przedstawiony przez Devart i nie działa dla mnie.

Z kilkoma modyfikacjami ta wersja działa dla mnie :

DELIMITER $$

CREATE PROCEDURE procedure1(IN strIDs VARCHAR(255))
BEGIN
  DECLARE strLen    INT DEFAULT 0;
  DECLARE SubStrLen INT DEFAULT 0;

  IF strIDs IS NULL THEN
    SET strIDs = '';
  END IF;

do_this:
  LOOP
    SET strLen = CHAR_LENGTH(strIDs);

    UPDATE TestTable SET status = 'C' WHERE Id = SUBSTRING_INDEX(strIDs, ',', 1);

    SET SubStrLen = CHAR_LENGTH(SUBSTRING_INDEX(strIDs, ',', 1)) + 2;
    SET strIDs = MID(strIDs, SubStrLen, strLen);

    IF strIDs = '' THEN
      LEAVE do_this;
    END IF;
  END LOOP do_this;

END
$$

DELIMITER ;

Wyjaśnienia:

1) Dlaczego "+2" IN SET SubStrLen = CHAR_LENGTH(SUBSTRING_INDEX(strIDs, ',', 1)) + 2;

Kiedy wykonujesz funkcję MID w następnym wierszu, indeks ciągu zaczyna się od 1. Jeśli masz następujący ciąg „4500,2”, w wersji Devart, MID Wygląda jak MID('4500,2',4,6), który zwraca ',2'.

Więc jeśli dodasz 1 do długości podciągu, jesteś na ograniczniku. To nie wystarczy. Więc dodajesz długość ogranicznika. Teraz jest dobrze.

2) Dlaczego IF strIDs = '' THEN w stanie pętli?

Ponieważ kiedy robisz MID, zwracasz ciąg, nawet jeśli ten ciąg jest pusty.

Procedura Devart jest załatana ! Bardzo dziękuję za odpowiedź :)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Losowo wybierz wiersze przez JPA

  2. Mysql High UPDATE SELECT powoduje lagi

  3. Warunek SQL WHERE nie jest równy?

  4. Pobierz przedostatni rekord dla każdego użytkownika z bazy danych

  5. Utwórz wyzwalacz wstawiania, aby automatycznie zwiększać pole int złożonego PK (String, int), ponownie rozpocząć numerowanie od 1 dla nowych ciągów