Bonjour à tous,
Je voudrais faire un script qui va deleter les données de toutes les tables de ma base selon certaines conditions.
J'utilise un curseur pour récupérer les noms des tables (pour optimiser la maintenance vu que je sais pas on va ajouter ou supprimer des tables dans le futur).
Ensuite dans ma boucle je pose une variable de type varchar qui sera le contenu de ma requête, que j'exécute ensuite via un "execute immediate".
Mon problème : ça ne marche pas! (lol)
Pour entrer dans les détails : quand il n'y a aucune donnée dans les tables : ça passe nickel. (tu m'étonnes!) Le script se termine et tout va bien.
Mais quand on a des données (environ 500 000 lignes) ça mouline dans le vide et il ne delete rien.
Voici mon code :
Merci de votre aide
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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 CREATE OR REPLACE PROCEDURE BOS.Suppression_des_erreurs_BOS ( p_DateFonc IN VARCHAR2, p_IDProvenance IN INTEGER ) IS CURSOR c_NomTable IS --Curseur qui récupère le nom de toutes les tables de la base BOS SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER='BOS'; l_NomTable c_NomTable%ROWTYPE; --Ligne de lecture du curseur v_DateFonc varchar2(10); --Date à supprimer en paramètre v_IDProvenance varchar2(10); --ID Provenance v_Requete varchar2(500); --Chaine de requête SQL dynamique BEGIN v_DateFonc := p_DateFonc; v_IDProvenance := TO_CHAR(p_IDProvenance); OPEN c_NomTable; --Ouverture du curseur LOOP FETCH c_NomTable INTO l_NomTable; EXIT WHEN c_NomTable%NOTFOUND; --Sortir à la fin du curseur v_REQUETE := 'DELETE FROM ' || l_NomTable.TABLE_NAME || ' WHERE DAT_MAJ_PHT >=''' || v_DateFonc || ''' AND ID_PROVENANCE =''' || v_IDProvenance || ''''; EXECUTE IMMEDIATE v_REQUETE; END LOOP; CLOSE c_NomTable; --Fermeture du curseur END; /![]()
Partager