|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Candidat au titre de Membre du Club
![]() Romain BILLOIRInscription : février 2007 Messages : 21 ![]() |
Bonjour, j'aimerais faire une fonction SQL me permettant de:
Soustraire à un champ d'une table, une valeur n, et si le résultat de cette soustraction est égal ou inférieur à 0, supprimer la ligne identifiée par son id, le tout donné en paramètre. Exemple: Table joueur: id | vie 1 | 100 2 | 25 Appel de la fonction: Code :
SELECT mafonction('joueur', 'vie', 1, 50); id | vie 1 | 50 2 | 25 Code :
SELECT mafonction('joueur', 'vie', 2, 30); id | vie 1 | 50 Je veux que tous les noms des champs & table soient donnés en paramètre car je compte utiliser cette fonction sur plusieurs table(vie des joueurs, nombre de ressources, etc...). Cette fonction peut paraître archi simple, mais pour un débutant en fonction SQL comme moi, je ne sais pas par où commencer. Si vous avez un tuto sur les fonctions SQL je suis preneur. Merci d'avance. |
|
|
00
|
|
|
#2 | |
|
Membre éprouvé
![]() Inscription : janvier 2009 Messages : 301 ![]() |
Bonjour,
Citation:
Il est impossible de faire l'ensemble de ces opérations dans une seule requête. Pour parvenir à ce résultat, il faut passer par un procédure stockée. Dans le respect des règles du forum, il serait bien de mentionner la base de données utilisée. En SQL, à ma connaissance, il n'est pas possible de passer le nom des tables en paramètres. Pour la lecture sur SQL, tu peux aller visite ce site http://sqlpro.developpez.com/ dans la partie "Initiation à SQL" Tu essaies de résoudre ta demande avec les éléments fournis, si tu as des difficultés, tu reviens nous les présenter. Bon courage |
|
|
|
00
|
|
|
#3 |
|
Membre éclairé
![]() |
seabs, en Oracle, on peut le nom de la table en parametre:
Mazike, sur quelle SGDB tu travail? |
|
|
00
|
|
|
#4 |
|
Candidat au titre de Membre du Club
![]() Romain BILLOIRInscription : février 2007 Messages : 21 ![]() |
Je suis sous PostgreSQL.
Si le passage en paramètre du nom de la table n'est pas possible je ferais plusieurs fonctions pour chaque table, enlevervie, soustraireressource, etc... mais une seul serait moins le foutoir |
|
|
00
|
|
|
#5 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 639 ![]() |
Bonjour,
Si, vous pouvez le faire sans problème au travers d'une procédure stocké. Recherchez un peu sur google il y a plein d'exemple dispo. Concernant votre problème initiale faites donc 2 requêtes (une pour update, suivi d'une pour delete). |
|
|
00
|
|
|
#6 | ||||
|
Membre éclairé
![]() |
je ne maitrise pas le PostgreSQL; mais j'essayé un sql standard:
pour ma mise à jour exemple Code :
et la suppression exemple Code :
|
||||
|
|
00
|
|
|
#7 | |||
|
Candidat au titre de Membre du Club
![]() Romain BILLOIRInscription : février 2007 Messages : 21 ![]() |
Citation:
Code :
|
|||
|
|
00
|
|
|
#8 |
![]() ![]() Inscription : octobre 2008 Messages : 1 508 ![]() |
On peut utiliser du SQL généré en plpgsql avec la fonction EXECUTE.
En revanche il n'est pas possible d'utiliser un type table%ROWTYPE comme tu l'as fait si "table" arrive dans la fonction sous la forme d'une chaine de caractères. Il faut utiliser directement le type final. A noter aussi que ce code n'est pas valable pour une exécution simultanée de la fonction par plusieurs appelants, car le contenu de la table peut changer entre le SELECT et l'UPDATE ou DELETE. Il serait préférable de faire directement de l'UPDATE et de faire ou non le DELETE en fonction du résultat de l'UPDATE, lequel peut être renvoyé avec une clause RETURNING. Faire directement l'UPDATE met de fait un verrou sur la ligne, ce qui assure l'exclusion mutuelle d'une manière simple et sûre. |
|
|
00
|
|
|
#9 |
|
Candidat au titre de Membre du Club
![]() Romain BILLOIRInscription : février 2007 Messages : 21 ![]() |
Je vais aller voir ça, mais finalement je pense qu'il est plus pratique dans mon cas de faire plusieurs fonctions car finalement les données à gérer, bien que tous des integer doivent être traitées différemment: la vie qui atteint 0 doit être supprimée, en revanche la ressource qui est demandée en trop grand nombre, doit renvoyer un message d'erreur et ne pas être modifiée, des échanges de ressources entre les tables(donc INSERT et non DELETE, etc...). Et merci pour le tuyau de l'update puis delete.
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com