Mungkin posting ini agak terlalu lama tetapi saya telah mencoba kode yang disajikan oleh Devart dan tidak berfungsi untuk saya.
Dengan sedikit modifikasi, versi ini bekerja untuk saya :
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 ;
Penjelasan:
1) Mengapa "+2" DI SET SubStrLen = CHAR_LENGTH(SUBSTRING_INDEX(strIDs, ',', 1)) + 2;
Ketika Anda menjalankan fungsi MID pada baris berikutnya, indeks string dimulai dengan 1. Jika Anda memiliki string berikut '4500,2', dengan versi Devart, MID Tampak seperti MID('4500,2',4,6) yang adalah kembali ',2'.
Jadi jika Anda menambahkan 1 pada panjang substring, Anda berada di pembatas. Itu tidak cukup. Jadi Anda menambahkan panjang pembatas. Sekarang sudah bagus.
2) Mengapa IF strIDs = '' THEN
dalam kondisi loop?
Karena ketika Anda melakukan MID, Anda mengembalikan string meskipun string ini kosong.
Prosedur Devart ditambal! Terima kasih banyak atas jawabannya :)