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

  1. #1
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    144
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 144
    Points : 62
    Points
    62
    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
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 564
    Points : 7 285
    Points
    7 285
    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"
    Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
     
    int main(int argc, char **argv) {
     
        printf("So long, and thanks for the fish, Dennis...\n");
        return 0;
    }

  3. #3
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    144
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 144
    Points : 62
    Points
    62
    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
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 564
    Points : 7 285
    Points
    7 285
    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.
    Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
     
    int main(int argc, char **argv) {
     
        printf("So long, and thanks for the fish, Dennis...\n");
        return 0;
    }

  5. #5
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    144
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 144
    Points : 62
    Points
    62
    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
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 564
    Points : 7 285
    Points
    7 285
    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";
    Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
     
    int main(int argc, char **argv) {
     
        printf("So long, and thanks for the fish, Dennis...\n");
        return 0;
    }

  7. #7
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    144
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 144
    Points : 62
    Points
    62
    Par défaut
    Merci cela commence a être plus clair mais j'ai encore une interrogation . Je cite :
    Ensuite tu crée ta fonction. Tu n'as pas besoin de créer tout ça à partir de ton script
    Ou dois je crée la fonction. Dans mon script shell, un script autre et comment appeler cette fonction dans mon script shell.

    Merci

  8. #8
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 564
    Points : 7 285
    Points
    7 285
    Par défaut
    En fait, tu crée ta fonction directement dans ta base, de la même manière que tu as créé tes tables en base (donc depuis ton PHPPgAdmin, ou PgAdminIII ou ta console psql ou même depuis un simple script)
    Une fois qu'elle est en base, elle y reste une fois pour toutes!

    Ensuite, l'appel à la fonction est considéré comme un simple SELECT en SQL, donc tu peux l'exécuter depuis ton script, tout comme tu voulais le faire avec tes DELETE.
    Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
     
    int main(int argc, char **argv) {
     
        printf("So long, and thanks for the fish, Dennis...\n");
        return 0;
    }

  9. #9
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    144
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 144
    Points : 62
    Points
    62
    Par défaut
    Ah ok je crois avoir compris, je dois crée un trigger.

    Merci

  10. #10
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 564
    Points : 7 285
    Points
    7 285
    Par défaut
    Citation Envoyé par pcsystemd Voir le message
    Ah ok je crois avoir compris, je dois crée un trigger.

    Merci
    Si tu crée un trigger pour utiliser cette fonction, alors tu dois changer son type de retour en OPAQUE (elle retourne actuellement du type character).
    Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
     
    int main(int argc, char **argv) {
     
        printf("So long, and thanks for the fish, Dennis...\n");
        return 0;
    }

  11. #11
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    144
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 144
    Points : 62
    Points
    62
    Par défaut
    ok cool merci beaucoup avec tout cela je penses pourvoir me dépatouiller. Par curiosité sais tu si cela fonctionne sous Mysql aussi ?


  12. #12
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 564
    Points : 7 285
    Points
    7 285
    Par défaut
    Non, sous MySQL tu dois écrire ta procédure différemment.
    De plus, le plpgsql n'existant pas, tu devras l'écrire en SQL.

    Et pour l'appeler ça sera:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    call mabase.proc_mon_delete('toto@liv.fr');
    Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
     
    int main(int argc, char **argv) {
     
        printf("So long, and thanks for the fish, Dennis...\n");
        return 0;
    }

+ 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