Mysql
 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" В 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Код на грешка:1406. Данните са твърде дълги за колона - MySQL

  2. Използване на libpqxx за съхраняване на данни в насипно състояние ИЛИ как да използвате израз COPY в libpqxx

  3. Изберете заявка с помощта на IN() и без никакво сортиране

  4. mysql замества текст в поле php

  5. Не може да се преобразува стойността за дата/час в MySQL в System.DateTime