Bonjour,
ayant dans une procédure PL/SQL un "DELETE" qui me prend énormément de temps, j'ai cherché comment y remédier et j'ai trouvé que c'était beaucoup plus rapide de faire une requête du genre :
Problème quand je fais ça : mon package utilise la table en question "tab_a_supprimer". Et lorsque j'appelle plusieurs procédures successivement depuis un programme extérieur (en powerbuilder), l'appel à la procédure qui contient le delete marche correctement, mais lors de l'appel suivant à une autre procédure du package, le programme plante parce que "existing state of package has been discarded". Quand je regarde depuis SQL developper, en effet le package n'est plus compilé!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 CREATE TABLE tab_new AS SELECT * FROM tab_a_supprimer WHERE <conditions de sauvegarde>; ALTER TABLE tab_a_supprimer RENAME TO tab_sav; ALTER TABLE tab_new RENAME TO tab_a_supprimer; -- recréation des contraintes, triggers, indexes et GRANT DROP TABLE tab_sav; -- quand tout est OK
Il a en quelque sorte été "décompilé" puisqu'à un moment donné, lors de la suppression de la table, il était dans un état incohérent.
Est-ce que quelqu'un voit comment je pourrais éviter ça, en rendant l'ensemble de mes requêtes atomique ou quelque chose comme ça?
En attendant j'ai contourné le problème en ne faisant pas un DROP mais un TRUNCATE, et en recopiant ensuite les lignes de la table temporaire.
Partager