sql >> データベース >  >> RDS >> Mysql

カンマ区切りの文字列をループする手順が機能しない

    この投稿は少し古すぎるかもしれませんが、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プロシージャにパッチが適用されます!あなたが答えてくれてありがとう:)



    1. Glassfish JDBC 接続プールでの V$SESSION.program プロパティの設定

    2. MySQL:ゼロフィルを使用せずに表示幅を指定する理由

    3. 複数のテーブルを持つ複数のトランザクションが関係するギャップレス シーケンス

    4. ルートモデルバインディングが機能しない