この投稿は少し古すぎるかもしれませんが、Devartによって提示されたコードを試しましたが、機能していません。
少し変更を加えるだけで、このバージョンは私のために機能します:
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 ;
説明:
1)なぜ "+2" IN SET SubStrLen = CHAR_LENGTH(SUBSTRING_INDEX(strIDs, ',', 1)) + 2;
次の行でMID関数を実行すると、文字列インデックスは1で始まります。次の文字列 '4500,2'があり、Devartバージョンの場合、MIDはMID( '4500,2'、4,6)のようになります。は戻り値'、2'です。
したがって、部分文字列の長さに1を追加すると、区切り文字になります。十分ではないので、区切り文字の長さを追加します。今は良いです。
2)なぜIF strIDs = '' THEN
ループ状態ですか?
MIDを実行すると、この文字列が空であっても文字列が返されるためです。
Devartプロシージャにパッチが適用されます!あなたが答えてくれてありがとう:)