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"
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');
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";
Partager