Announcement

Collapse
No announcement yet.

SP: REPEAT läuft 1x zu oft

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SP: REPEAT läuft 1x zu oft

    Hallo Leute!

    Es geht um folgendes. Meine SP ließt aus einem VIEW IDs raus. Für jede dieser IDs soll in einer Tabelle ein DS angelegt werden.

    Code:
    CREATE DEFINER=`root`@`localhost` PROCEDURE `mySP`(IN `p_myP` INT)
    	LANGUAGE SQL
    	NOT DETERMINISTIC
    	CONTAINS SQL
    	SQL SECURITY DEFINER
    	COMMENT ''
    BEGIN
    	DECLARE newID int(10);
    	DECLARE done INT DEFAULT 0;
    	DECLARE cur CURSOR FOR SELECT id FROM v_myVIEW WHERE sfId = p_myP AND an = 1;
    	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    	
    	OPEN cur;
    	
    	REPEAT
    		FETCH cur INTO newID;
    		INSERT INTO `myTBL` (`some_id`, `parameter`, `an`, `datum`, `modified_by`) VALUES (newID, p_myP, 0, NOW(), 999);
    	UNTIL done=1 END REPEAT;
    	
    	CLOSE cur;
    END
    Das funktioniert soweit sehr gut, aber hier nun das Problem:

    Liefert mir die SELECT auf den VIEW 3 DS zurück (z.B. 10,11,12), so werden in die myTBL 4 DS geschrieben (10,11,12,12). Der Letzte findet sich immer doppelt.
    So,.... und jetzt steh ich an! Vermutlich is es irgendwo eine Kleinigkeit oder was weiss der Kuckuck was, nur verzweifle ich schon, weil ichs einfach nicht sehe
    Bitte um Hilfe!!! Danke!!! LG

    idsC

  • #2
    Okay, hab einfach einen work-arround gemacht... und zwar den REPEAT...UNTIL Teil durch folgendes ersetzt:
    Code:
    read_loop: LOOP
       	FETCH cur INTO schid;
    	IF done THEN
          	     LEAVE read_loop;
    	END IF;
    	INSERT INTO `myTBL` (`some_id`, `parameter`, `an`, `datum`, `modified_by`) VALUES (newID, p_myP, 0, NOW(), 999);
    
    END LOOP;

    Comment


    • #3
      Hallo,
      Originally posted by idsC View Post
      ...Der Letzte findet sich immer doppelt.
      So,.... und jetzt steh ich an! Vermutlich is es irgendwo eine Kleinigkeit oder was weiss der Kuckuck was, nur verzweifle ich schon, weil ichs einfach nicht sehe
      Dein CONTINUE HANDLER FOR NOT FOUND setzt die Variable done auf 1. Ausgelöst wird dieser Handler, wenn das FETCH keinen nächsten Datensatz mehr findet (FOR NOT FOUND). In deinem Code wird das INSERT INTO `myTBL` jedoch auch dann ausgeführt, wenn das vorhergende FETCH keinen Datensatz mehr gefunden hat. Zum Verständnis: Auch wenn die Abbruchbedingung erfüllt ist, wird der letzte Schleifendurchlauf ja noch bis zum Ende ausgeführt.

      Korrekt wäre:
      [highlight=sql]
      OPEN cur;

      REPEAT
      FETCH cur INTO newID;
      if not done then
      INSERT INTO `myTBL` (`some_id`, `parameter`, `an`, `datum`,
      `modified_by`)
      VALUES (newID, p_myP, 0, NOW(), 999);
      end if;
      UNTIL done=1 END REPEAT;

      CLOSE cur;
      [/highlight]
      oder:
      [highlight=sql]
      OPEN cur;

      FETCH cur INTO newID;
      while not done
      INSERT INTO `myTBL` (`some_id`, `parameter`, `an`, `datum`,
      `modified_by`)
      VALUES (newID, p_myP, 0, NOW(), 999);
      FETCH cur INTO newID;
      END while;

      CLOSE cur;
      [/highlight]

      Gruß Falk
      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

      Comment

      Working...
      X