0
votes

Échec de l'insertion à l'intérieur de la fonction stockée

J'ai une table avec des résultats de la course xxx pré>

et p> xxx pré>

Je veux stocker le lieu résultant dans une table différente avec p>

DROP FUNCTION IF EXISTS FortyTwo;
DELIMITER //
SET @place = 1//
SET @times = cast('00:00:00.000' as TIME(3))//
SET @y = 1//
CREATE FUNCTION `FortyTwo`(xtime TIME(3), xstartnr varchar(10)) RETURNS INT
    BEGIN
    DECLARE x INT;
        IF @times = xtime THEN
          SET x = @place;
        ELSE
          SET @place = @y;
          SET x = @place;
          SET @times = xtime;
        END IF;
    SET @y = @y +1;
    insert into fls119_platzierung (start_nr, platz, zeit) VALUES (xstartnr, x, xtime) on duplicate key update platz = x, zeit = xtime;
    RETURN x;
END//
DELIMITER ;
select FortyTwo(timediff(zeit7, zeit1), start_nr), start_nr, timediff(zeit7, zeit1) from fls119_ergebnisse erg where timediff(zeit7, zeit1) > 0  and rennen = 21
ORDER BY timediff(zeit7, zeit1) asc


0 commentaires

3 Réponses :


0
votes

Vous devez utiliser des variables locales ( déclarer V_VARIABLE DataType ) dans les routines stockées au lieu des variables définies par l'utilisateur ( @variable ). Les variables définies par l'utilisateur conservent leurs valeurs tout au long du processus et dans votre exemple, l'initialisation des variables est en dehors de la routine menant à des résultats inattendus.


0 commentaires

0
votes

Merci pour votre réponse. Si j'utilise des variables locales, comment puis-je garder le dernier numéro de lieu? Je dois distinguer si deux participants ont la même période finale, ils atteignent le même endroit (par exemple le lieu trois). Le prochain a eu la cinquième place, de sorte que la quatrième place n'est pas incluse ...

Pas sûr, l'initialisation variable est le problème. L'initialisation fonctionne, je pense. Je me demande simplement que Start_6 est mis à jour avec la place 12 au lieu de 1. La valeur de retour de FORTYTWO m'a donné le résultat correct. Donc numéro 6 sur la première place et ainsi de suite.


0 commentaires

0
votes

J'ai supprimé l'indice principal sur FLS119_PLATZIERUNG. Donc, le numéro '0006' a deux entrées! Un avec le bon endroit '1' et un avec '12' comme lieu. Donc, la question change un peu. Pourquoi le premier enregistrement de mon instruction SELECT est-il exécuté une seconde fois?


0 commentaires