delete avec sql dynamique
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:
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 :oops: