[phpmyadmin] Les procédures stoquées

Les procédures stoquées [phpmyadmin] - SQL/NoSQL - Programmation

Marsh Posté le 26-10-2017 à 10:46:06    

Bonjour,
 
Je n'arrive pas à créer une procédure stoquée sous PHPMYADMIN, qui fasse plus d'une ligne... quelqu'un a-t-il déjà essayé ?
Une histoire de délémiteurs ?


Message édité par unisev le 26-10-2017 à 10:57:48
Reply

Marsh Posté le 26-10-2017 à 10:46:06   

Reply

Marsh Posté le 26-10-2017 à 13:30:07    

Citation :

Une histoire de délémiteurs ?


 
C'est effectivement possible. L'as-tu changé ? Quel est ton "code" ?


Message édité par pluj le 26-10-2017 à 13:30:26
Reply

Marsh Posté le 26-10-2017 à 13:55:34    

Je pensais que l'interface servait justement à contourner le swap de délimiteurs :
https://www.developpez.net/forums/attachments/p321564d1508766200/php/outils/phpmyadmin/interface-creer-procedure-stoquee-plusieurs-lignes-delimiteur/procstock.png/
 
C'est pas vraiment du code que je met la-dedans, c'est juste 2 lignes, qui marchent séparément (avec ou sans point-virgules) :
TRUNCATE TABLE `playerstatstrain`;
INSERT playerstatstrain SELECT * FROM playerstats;
 
https://www.developpez.net/forums/attachments/p321670d1508785111/php/outils/phpmyadmin/interface-creer-procedure-stoquee-plusieurs-lignes-delimiteur/procstoclerr.png/
 
C'est pareil avec ou sans les points-virgules en fin de ligne...


Message édité par unisev le 26-10-2017 à 13:57:35
Reply

Marsh Posté le 26-10-2017 à 14:49:20    

Une procédure stockée n'est pas censée commencer par begin :??:
Parce que là, il te dit clairement que t'as une faute de syntaxe SQL. Donc rien à voir avec le ;


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 26-10-2017 à 15:12:33    

Ok donc dans la boiboite, je dois mettre un truc genre ça :
 

Code :
  1. BEGIN
  2.    TRUNCATE TABLE `playerstatstrain`;
  3.    INSERT playerstatstrain SELECT * FROM playerstats;
  4. END


 
Je crois avoir déjà essayé, mais je re-test ce soir.


Message édité par unisev le 26-10-2017 à 15:17:38
Reply

Marsh Posté le 26-10-2017 à 19:37:13    

Oui, c'était bien ça, merci à vous !

Reply

Marsh Posté le 29-10-2017 à 12:38:28    

J'ai une nouveau "problème" après avoir écrit 2 procstock qui fonctionnent bien, dont voici un exemple :
http://unisev.cf/ProcStockOK.png
 
Cette procédure prend un paramètre en entrée : le pid du joueur.
 
J’aimerai créer une nouvelle procédure (disons "50-UnlockAllPlayers" ) qui jouerait "40-UnlockPlayer" pour chaque ligne de la requête suivante :
SELECT DISTINCT pid FROM playerstats;
 
Mes recherches n'ont rien données sur ce point précis, qui ne me paraissait pas relever d'une grande complexité au départ...


Message édité par unisev le 29-10-2017 à 12:46:40
Reply

Marsh Posté le 30-10-2017 à 20:54:54    

Bon alors là je bloque complètement... mon idée de faire une procstock qui lance l'autre procsotck ne parait pas réalisable...
 
Du coup je veux bien repartir dans la réécriture d'une nouvelle ProcStock mais je bloque :
 
Voici le code qui fonctionne :

Code :
  1. BEGIN
  2. INSERT INTO playerstats (pid, statname, value)
  3. SELECT mPID,statname,value FROM playerstatsunlock
  4. ON DUPLICATE KEY
  5. UPDATE value = playerstats.value+playerstatsunlock.value;
  6. CALL 45_ReRankPlayer(mPID);
  7. END


 
Je dois remplacer le paramètre mPID par la requête suivante :

Code :
  1. SELECT DISTINCT pid FROM playerstats


 
Des idées ?

Reply

Marsh Posté le 31-10-2017 à 00:04:53    

:hello: !
As-tu essayé de passer par des curseurs ? :??:
Un petit lien explicatif : Documentation
Cela donnerait un truc du genre :

Code :
  1. BEGIN
  2.     DECLARE done INT DEFAULT FALSE;
  3.     DECLARE pid INT;
  4.     DECLARE curseurPID CURSOR FOR SELECT DISTINCT pid FROM playerstats;
  5.     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
  6.     OPEN curseurPID;
  7.    
  8.     read_loop: LOOP
  9.         FETCH curseurPID INTO pid;
  10.         IF done THEN
  11.             LEAVE read_loop;
  12.         END IF;
  13.        
  14.         CALL 45_ReRankPlayer(pid);
  15.     CLOSE curseurPID;
  16. END;


A voir si cela pourrait correspondre à ton besoin cependant  [:cupra] Je ne comprends pas bien comment est fait ton INSERT à partir de ton SELECT :/
 
 :jap:


---------------
And in the end, the love you take is equal to the love you make
Reply

Marsh Posté le 31-10-2017 à 10:16:12    

Merci,
 
Je vais regarder pour les curseurs mais j'ai cru voir que c'était à utiliser en cas de dernier recours (plutôt déconseillé quoi), mais si y'a pas d'autre solution...
 
Je vais tenter d'explique ma procstock :
 
INSERT INTO playerstats (pid, statname, value)   ---> Je modifie la table playerstats...
SELECT mPID,statname,value FROM playerstatsunlock ---> je prends statname & value à partir de la table playerstatsunlock (qui est une sortie table "template" ) mais je remplace le pid par mPID le paramètre fixe de la procstock
ON DUPLICATE KEY
UPDATE value = playerstats.value+playerstatsunlock.value; ---> si la ligne existe déjà (avec mPID), je lui ajoute la valeur de playerstatsunlock
 
C'est plus clair ?


Message édité par unisev le 31-10-2017 à 10:18:12
Reply

Marsh Posté le 31-10-2017 à 10:16:12   

Reply

Marsh Posté le 04-11-2017 à 19:15:54    

Soileh a écrit :

:hello: !
As-tu essayé de passer par des curseurs ? :??:
Un petit lien explicatif : Documentation
Cela donnerait un truc du genre :

Code :
  1. BEGIN
  2.     DECLARE done INT DEFAULT FALSE;
  3.     DECLARE pid INT;
  4.     DECLARE curseurPID CURSOR FOR SELECT DISTINCT pid FROM playerstats;
  5.     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
  6.     OPEN curseurPID;
  7.    
  8.     read_loop: LOOP
  9.         FETCH curseurPID INTO pid;
  10.         IF done THEN
  11.             LEAVE read_loop;
  12.         END IF;
  13.        
  14.         CALL 45_ReRankPlayer(pid);
  15.     END LOOP;
  16.     CLOSE curseurPID;
  17. END;


A voir si cela pourrait correspondre à ton besoin cependant  [:cupra] Je ne comprends pas bien comment est fait ton INSERT à partir de ton SELECT :/
 
 :jap:


 
Parfait, il ne manquait que le END LOOP; avant le CLOSE curseurPID;  :)  
Merci !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed