IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Rendre une procédure "atomique"


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Par défaut Rendre une procédure "atomique"
    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...

  2. #2
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Si tu vires la première ligne, cela fonctionnerait comme tu veux non ?

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Par défaut
    Je suis obligé de laisser un drop, car j'ai eu le cas où un programme plantait en cours de route, du coup la table n'est jamais supprimée, et quand on redémarre le programme ça met une erreur car la table existe déjà.

    Mais même si je vire cette ligne, je pense que j'aurai toujours le problème possible, dans le cas où l'utilisateur 2 va me faire un "create table", alors que l'utilisateur 1 est en train d'exécuter la procédure, et a déjà fait le create table mais n'est pas encore parvenu jusqu'au drop....

  4. #4
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Citation Envoyé par brassouille Voir le message
    Mais même si je vire cette ligne, je pense que j'aurai toujours le problème possible, dans le cas où l'utilisateur 2 va me faire un "create table", alors que l'utilisateur 1 est en train d'exécuter la procédure, et a déjà fait le create table mais n'est pas encore parvenu jusqu'au drop....
    Non tu ne peux pas créer 2 tables avec le même nom sous un même schéma

    Il y a plusieurs solutions pour t'en sortir :
    - passer par des temporary table
    - ajouter le nom du user au nom de table temporaire
    - indiquer dans une autre table que cette procédure est en cours d'exécution
    - ...

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Par défaut
    En fait pour la temporary table :
    - je ne peux pas la créer AVANT d'exécuter la procédure vu que je ne connais pas son schéma
    - si je la crée PENDANT la procédure, j'aurai toujours le même problème qu'actuellement, je risque de faire un create alors qu'un autre create a déjà été fait par un accès concurrent.

    Pour le nom du user ça n'ira pas car on utilise toujours le même user, par contre je dois pouvoir faire ça en récupérant un identifiant de transaction ou quelque chose comme ça

    Pour ta troisième solution, oui je pourrais, ça fait effectivement office de sémaphore, mais ça m'embête un peu de créer une table "bidon" chez le client juste pour des raisons d'optimisation de code...

    Bon, je vais tenter de trouver un identifiant de transaction alors, merci pour ton aide

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Par défaut
    Par contre je suis en train de me dire que si un programme plante ou est arrêté brutalement, je n'effacerai jamais la table temporaire qu'il aura créée, si je l'ai suffixée par un identifiant de transaction...

Discussions similaires

  1. [Lazarus] Rendre une procédure accessible au programme utilisant l'unité
    Par Darkyl dans le forum Lazarus
    Réponses: 6
    Dernier message: 11/05/2015, 19h56
  2. Rendre une procédure générale
    Par DeveloppeurWeb dans le forum PL/SQL
    Réponses: 0
    Dernier message: 02/12/2010, 17h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo