Bonjour à tous,
j'ai commencé avant hier à regarder les procédures stockées qui ont l'air très pratiques pour des requêtes redondantes comme j'ai besoin d'en faire.
Pour l'instant je souhaite juste retourner la liste des objets contenus dans l'inventaire d'un joueur. Après il faudrait que la requête me renvoie la liste et la quantité pour chaque objet sachant que chaque objet est unique. Une "pile" de 8 tarte à la crème correspond donc à 8 entrées dans une table énorme.
La structure:
TABLE:
-primary
-colonne
PLAYER: // Liste des joueurs
-kId
-name
ENTITY_INVENTORY: // Liste les inventaires présents dans le monde (joueurs, coffres, marchand, etc...)
-kId
-playerkId
INVENTORY_ITEM: // Liste des objets présents dans les inventaires
-kId
-itemTypekId
-inventorykId
ITEM_TYPE: // liste des types d'objets avec leurs noms
-kId
-name
Bon alors récupérer tout ça dans une requête PHP avec PDO c'est du gâteau, mais avec une procstock je n'y arrive pas alors que j'y suis depuis 2 jours.
Mon problème est que lorsqu'il n'y a qu'un seul enregistrement dans la table ITEM_LIST ca marche. Quand il y en a deux je reçois une erreur 1172: return more than one row (logique). J'ajoute donc un curseur dans la proc et là catastrophe, le serveur ne réponds pas...
Je comprends franchement rien à ce qu'il se passe. Voilà ma procstock qui me renvoie bien une valeur si il n'y a qu'un objet dans l'inventaire ou subquery return more than... si il y a plusieurs objets. SQL me parle probablement de subquery car avant de récupérer les itemName je récupère leurs id dans la table inventory_item.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 BEGIN SELECT it.name INTO name FROM item_type it JOIN inventory_item ii JOIN entity_inventory ei JOIN player p ON it.kId = ii.itemTypekId AND ii.inventorykId = ei.kId AND ei.playerkId = p.kId WHERE p.mId = mId; END
Maintenant j'ajoute le curseur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 BEGIN declare done int DEFAULT 0; DECLARE cursor1 CURSOR FOR SELECT it.name INTO name FROM item_type it JOIN inventory_item ii JOIN entity_inventory ei JOIN player p ON it.kId = ii.itemTypekId AND ii.inventorykId = ei.kId AND ei.playerkId = p.kId WHERE p.mId = mId; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; OPEN cursor1; REPEAT FETCH cursor1 INTO name; IF done = 0 THEN SELECT name; END IF; UNTIL done END REPEAT; CLOSE cursor1; END
J'ai deux paramètres:
IN: mId (VARCHAR) à la fin du WHERE de la déclaration du curseur
OUT: name(VARCHAR) dans le REPEAT
En espérant avoir fourni toutes les infos nécessaires et dans l'attente de vos réponses , bonne journée.
Prisonier
Partager