Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Prosedur untuk mengulang string yang dipisahkan koma tidak berfungsi

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 :)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pernyataan tunggal MySQL untuk menggabungkan dua tabel

  2. SQL Query berdasarkan tabel lain

  3. COALESCE semua bidang di tabel yang berbeda GABUNG

  4. Bagaimana cara mencetak kueri sql yang tepat dalam kerangka kerja zend?

  5. KESALAHAN! Server berhenti tanpa memperbarui file PID (/usr/local/mysql/data/Mac.local.pid)