Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Quy trình lặp qua chuỗi được phân tách bằng dấu phẩy không hoạt động

Có thể bài viết này hơi cũ nhưng tôi đã thử mã do Devart trình bày và nó không phù hợp với tôi.

Với một vài sửa đổi, phiên bản này phù hợp với tôi:

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 ;

Giải thích:

1) Tại sao "+2" IN SET SubStrLen = CHAR_LENGTH(SUBSTRING_INDEX(strIDs, ',', 1)) + 2;

Khi bạn thực thi hàm MID trên dòng tiếp theo, chỉ mục chuỗi bắt đầu bằng 1. Nếu bạn có chuỗi sau '4500,2', với phiên bản Devart, MID trông giống như MID ('4500,2', 4,6) là return ', 2'.

Vì vậy, nếu bạn thêm 1 ở độ dài chuỗi con, bạn đang ở trên dấu phân cách. Nó không đủ, vì vậy bạn thêm chiều dài của dấu phân cách. Giờ thì tốt rồi.

2) Tại sao lại là IF strIDs = '' THEN trong điều kiện vòng lặp?

Bởi vì khi bạn thực hiện MID, bạn sẽ trả về một chuỗi ngay cả khi chuỗi này trống.

Thủ tục Devart đã được vá! Cảm ơn bạn rất nhiều vì bạn là một nhà cảm xạ :)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. sqlalchemy + flask, nhận tất cả các bài đăng hàng ngày

  2. AVG () - Tính giá trị trung bình của một cột trong MySQL

  3. MySQL Connector / J có đệm các hàng khi phát trực tuyến ResultSet không?

  4. Một số có thể được sử dụng để đặt tên cho một cột bảng MySQL không?

  5. PDO thực thi mảng thành chuỗi lỗi chuyển đổi