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
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
Essaye
Et tu choisis la colonne qui contient ton id pour mettre dans "lenomdemacolonne"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 DELETE FROM matable WHERE macondition RETURNING "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; }
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.
mais la je ne vois pas comment avec RETURNING ?
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;
Merci
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:
Puis
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;
ç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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT * FROM 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; }
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 :
puis
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;"
Merci
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT * FROM $MAVARIABLE('toto@liv.fr');
Non en fait, tu commence par définir un nouveau langage (le plpgsql) en faisantEnsuite 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 CREATE 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
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;
cette ligne exécutera le code se trouvant dans ta fonction 'proc_mon_delete'.
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT * FROM proc_mon_delete('toto@liv.fr');
Ta fonction commencera d'abord par exécuter la requête suivante:
Puis pour tous les "id" retournés, elle exécutera la ligne:
Code : Sélectionner tout - Visualiser dans une fenêtre à part DELETE FROM matable1 WHERE "blabla" = 'toto@liv.fr' RETURNING "id"
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; }
Merci cela commence a être plus clair mais j'ai encore une interrogation . Je cite :
Ou dois je crée la fonction. Dans mon script shell, un script autre et comment appeler cette fonction dans mon script shell.Ensuite tu crée ta fonction. Tu n'as pas besoin de créer tout ça à partir de ton script
Merci
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; }
Ah ok je crois avoir compris, je dois crée un trigger.
Merci
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; }
ok cool merci beaucoup avec tout cela je penses pourvoir me dépatouiller. Par curiosité sais tu si cela fonctionne sous Mysql aussi ?
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; }
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager