IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Procédure: Update or Delete si <= 0


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Artisan menuisier alu pvc
    Inscrit en
    Février 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Artisan menuisier alu pvc

    Informations forums :
    Inscription : Février 2007
    Messages : 23
    Points : 27
    Points
    27
    Par défaut Procédure: Update or Delete si <= 0
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT mafonction('joueur', 'vie', 1, 50);
    résultat:
    id | vie
    1 | 50
    2 | 25

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT mafonction('joueur', 'vie', 2, 30);
    résultat:
    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.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    566
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2009
    Messages : 566
    Points : 1 045
    Points
    1 045
    Par défaut
    Bonjour,

    Soustraire à un champs d'une table, une valeur n, et si le résultat de cette soustraction est égal ou inférieur a 0, supprimer la ligne identifié par son id, le tout donnée en paramètre.
    Tu veux soustraire la valeur N de la colonne VIE. Dans le cas ou le résultat devient inférieur à 0, tu supprimes la ligne.

    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

  3. #3
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    seabs, en Oracle, on peut le nom de la table en parametre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from &nom_table


    Mazike, sur quelle SGDB tu travail?
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Artisan menuisier alu pvc
    Inscrit en
    Février 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Artisan menuisier alu pvc

    Informations forums :
    Inscription : Février 2007
    Messages : 23
    Points : 27
    Points
    27
    Par défaut
    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

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    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).

  6. #6
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    je ne maitrise pas le PostgreSQL; mais j'essayé un sql standard:

    pour ma mise à jour

    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    update
    (
     
    SELECT * 
    FROM joueur AS t  
    where id=1
    and ((vie-50)>0 )
     
    )  
     set vie=50

    et la suppression

    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    delete from
    (
     
    SELECT * 
    FROM joueur AS t  
    where id=1
    and ((vie-50)<=0 )
     
    )
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Artisan menuisier alu pvc
    Inscrit en
    Février 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Artisan menuisier alu pvc

    Informations forums :
    Inscription : Février 2007
    Messages : 23
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par boussafi Voir le message
    je ne maitrise pas le PostgreSQL; mais j'essayé un sql standard: [...]
    Le tout est de mettre ça dans une procédure stocké. J'ai essayé quelque chose:
    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
    CREATE OR REPLACE FUNCTION soustraireousupprimer(identifiant integer, nbreasoustraire integer)
      RETURNS void AS
    $BODY$DECLARE ligneResultat base%ROWTYPE;
    BEGIN
    	SELECT id, vie INTO ligneResultat FROM base WHERE id = identifiant;
    	IF FOUND THEN
    		IF ligneResultat.vie < nbreASoustraire THEN
    			DELETE FROM base WHERE id = identifiant;
    		ELSE
    			UPDATE base SET vie = vie - nbreASoustraire WHERE id = identifiant;
    		END IF;
    	END IF;
    END
    $BODY$
      LANGUAGE plpgsql VOLATILE
      COST 100;
    Celà fonctionne, mais j'aimerais vraiment ne pas créer 20fonctions différentes pour mes 20tables... :/ je vais essayer d'amélioré ça.

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    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.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Artisan menuisier alu pvc
    Inscrit en
    Février 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Artisan menuisier alu pvc

    Informations forums :
    Inscription : Février 2007
    Messages : 23
    Points : 27
    Points
    27
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA][DAO] Update via Delete + Add : Astuces ?
    Par philou22 dans le forum Access
    Réponses: 11
    Dernier message: 22/02/2007, 11h47
  2. pb lock sur update ou delete
    Par cyberyan dans le forum Oracle
    Réponses: 1
    Dernier message: 13/12/2006, 08h20
  3. Obtenir code retour requête UPDATE et DELETE
    Par SurfingJeff dans le forum SQL
    Réponses: 3
    Dernier message: 02/08/2006, 12h27
  4. [trigger] insert update et delete
    Par kooljy dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 13/07/2006, 08h56
  5. Evenement sur UPDATE, INSERT, DELETE
    Par papouAlain dans le forum Langage SQL
    Réponses: 6
    Dernier message: 23/12/2004, 14h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo