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"

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;
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...
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...