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

 PostgreSQL Discussion :

Fonction LAST_INSERT_ID pour un DELETE


Sujet :

PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2005
    Messages
    144
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 144
    Par défaut Fonction LAST_INSERT_ID pour un DELETE
    Bonjour,

    j'utilise LAST_INSERT_ID pour récuperer le dernier ID insérer dans une table. Existe t-il une fonction similaire pour DELETE du style LAST_DELETE_ID ?

    Merci

  2. #2
    Membre éprouvé Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 864
    Par défaut
    Essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DELETE FROM matable WHERE macondition RETURNING "lenomdemacolonne"
    Et tu choisis la colonne qui contient ton id pour mettre dans "lenomdemacolonne"

  3. #3
    Membre confirmé
    Inscrit en
    Février 2005
    Messages
    144
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 144
    Par défaut
    Merci pour l'info mais j'ai une petite question. En effet je souhaite concaténer deux requêtes et donc je ne vois pas comment utiliser ce que tu m'indiques :

    En faites je dois récupérer l'id de matable1 pour l'utiliser dans matable2 donc je ne vois pas avec ta solution comment cela fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM matable1 where  blabla="toto@liv.fr";DELETE FROM matable2 where="id de matable1;
    mais la je ne vois pas comment avec RETURNING ?

    Merci

  4. #4
    Membre éprouvé Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 864
    Par défaut
    Non en effet, ça ne passe pas facilement car ton premier DELETE peut retourner plus d'un id.

    Tu peux peut-être essayer un truc comme ça:

    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
     
    CREATE LANGUAGE plpgsql;
     
    CREATE OR REPLACE FUNCTION proc_mon_delete
    (
    	_machaine character varying,
    	OUT ok character
    )
    RETURNS character
    AS $$
    DECLARE __id record;
    BEGIN
     
    	"ok" := CAST('ko' AS character(2));
     
    	FOR __id IN DELETE FROM matable1 WHERE "blabla" = _machaine RETURNING "id1" LOOP
    		DELETE FROM matable2 WHERE "id2" = __id."id1";
    	END LOOP;
     
    	"ok" := CAST('ok' AS character(2));
     
    	RETURN;
    END $$ LANGUAGE plpgsql;
    Puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM proc_mon_delete('toto@liv.fr');
    ça fait peut-être un peu artillerie lourde, mais au moins tu peux faire ce que tu veux, y compris ajouter la gestion d'exceptions et faire du ROLLBACK.

  5. #5
    Membre confirmé
    Inscrit en
    Février 2005
    Messages
    144
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 144
    Par défaut
    Merci a toi pour cette aide. J'ai besoin si tu peux que tu m'explique un peu. je suis obligé de faire un select pour chaque ligne c'est ça?

    C'est pour utiliser depuis un script shell donc puis je utiliser utiliser ta fonction dans une variable comme suit :

    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
    MAVARIABLE="CREATE LANGUAGE plpgsql;
     
    CREATE OR REPLACE FUNCTION proc_mon_delete
    (
    	_machaine character varying,
    	OUT ok character
    )
    RETURNS character
    AS $$
    DECLARE __id record;
    BEGIN
     
    	"ok" := CAST('ko' AS character(2));
     
    	FOR __id IN DELETE FROM matable1 WHERE "blabla" = _machaine RETURNING "id1" LOOP
    		DELETE FROM matable2 WHERE "id2" = __id."id1";
    	END LOOP;
     
    	"ok" := CAST('ok' AS character(2));
     
    	RETURN;
    END $$ LANGUAGE plpgsql;"
    puis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM $MAVARIABLE('toto@liv.fr');
    Merci

  6. #6
    Membre éprouvé Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 864
    Par défaut
    Non en fait, tu commence par définir un nouveau langage (le plpgsql) en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE LANGUAGE plpgsql;
    Ensuite tu crée ta fonction. Tu n'as pas besoin de créer tout ça à partir de ton script, sauf si il s'occuppe également de la création de ta base de données et de ses tables.
    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
     
    CREATE OR REPLACE FUNCTION proc_mon_delete
    (
    	_machaine character varying,
    	OUT ok character
    )
    RETURNS character
    AS $$
    DECLARE __id record;
    BEGIN
     
    	"ok" := CAST('ko' AS character(2));
     
    	FOR __id IN DELETE FROM matable1 WHERE "blabla" = _machaine RETURNING "id1" LOOP
    		DELETE FROM matable2 WHERE "id2" = __id."id1";
    	END LOOP;
     
    	"ok" := CAST('ok' AS character(2));
     
    	RETURN;
    END $$ LANGUAGE plpgsql;
    Puis enfin, tu peux l'appeler autant de fois que tu le souhaiteras depuis ton script en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM proc_mon_delete('toto@liv.fr');
    cette ligne exécutera le code se trouvant dans ta fonction 'proc_mon_delete'.

    Ta fonction commencera d'abord par exécuter la requête suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM matable1 WHERE "blabla" = 'toto@liv.fr' RETURNING "id"
    Puis pour tous les "id" retournés, elle exécutera la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM matable2 WHERE "id2" = "id";

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

Discussions similaires

  1. fonction c pour manipuler la structure date
    Par thomas_b dans le forum Windows
    Réponses: 4
    Dernier message: 28/07/2004, 16h28
  2. [winsock.h] Fonction recv() pour un socket en C
    Par Hikaru dans le forum Windows
    Réponses: 5
    Dernier message: 22/05/2004, 07h43
  3. Des fonctions OGL pour les images de format usuel ?
    Par jamal24 dans le forum OpenGL
    Réponses: 3
    Dernier message: 31/05/2003, 21h59
  4. Fonction/méthode pour obtenir l'IP de la machine
    Par sirex007 dans le forum Web & réseau
    Réponses: 3
    Dernier message: 10/04/2003, 14h36
  5. Réponses: 3
    Dernier message: 02/09/2002, 18h49

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