sql >> Databasteknik >  >> RDS >> Mysql

Proceduren för att gå igenom kommaseparerad sträng fungerar inte

Kanske det här inlägget är lite för gammalt men jag har provat koden som presenteras av Devart och det fungerar inte för mig.

Med få ändringar fungerar den här versionen för mig :

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 ;

Förklaringar:

1) Varför "+2" IN SET SubStrLen = CHAR_LENGTH(SUBSTRING_INDEX(strIDs, ',', 1)) + 2;

När du kör MID-funktionen på nästa rad börjar strängindex med 1. Om du har följande sträng '4500,2', med Devart-versionen, ser MID ut som MID('4500,2',4,6) som är retur ',2'.

Så om du lägger till 1 vid delsträngens längd är du på avgränsaren. Det räcker inte. Så du lägger till längden på avgränsaren. Nu är det bra.

2) Varför IF strIDs = '' THEN i slingtillståndet?

För när du gör MID returnerar du en sträng även om denna sträng är tom.

Devart-proceduren är korrigerad! Tack så mycket för att du svarar :)



  1. PostgreSQL 9.1 installation och databaskodning

  2. Använda Passport med Sequelize och MySQL

  3. postgresql - sql - antal "sanna" värden

  4. Tillstånd nekad inuti /var/www/html när du skapar en webbplats och dess filer med apache2-servern