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 :
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;
/
Merci de votre aide