Bonjour,
le delete sur des grosses tables étant très long, je me suis créé une petite procédure qui l'effectue en réalisant une copie dans une table temporaire "g_nomTableTempDelete"
Mon problème est le suivant : j'ai peur que si la procédure est appelée par deux utilisateurs en même temps, on se retrouve avec la table temporaire du premier utilisateur effacée par le second...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 PROCEDURE deleteFromTable (p_nomTable IN VARCHAR2, p_deleteWhere IN VARCHAR2) IS BEGIN dropTableIfExists(g_nomTableTempDelete); EXECUTE IMMEDIATE ('CREATE TABLE ' || g_nomTableTempDelete || ' AS SELECT * FROM ' || p_nomTable || ' WHERE NOT (' || p_deleteWhere || ')'); EXECUTE IMMEDIATE ('TRUNCATE TABLE ' || p_nomTable); EXECUTE IMMEDIATE ('INSERT INTO ' || p_nomTable || ' SELECT * FROM ' || g_nomTableTempDelete); EXECUTE IMMEDIATE ('DROP TABLE ' || g_nomTableTempDelete); END;
J'aimerais donc trouver un moyen de rendre la procédure "atomique". Mais puisque les instructions DDL font un commit, je pense que ça ne changera rien de la faire exécuter dans une transaction autonome... Il me faudrait une sorte de sémaphore, je ne sais pas trop comment faire...
Partager