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 :

Table verrouillée dans une procédure PL/SQL


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Table verrouillée dans une procédure PL/SQL
    hello,

    dans une pl/sql, lorsque la requete truncate table ma_table est executée,
    l'erreur ORA-0054 apparait de temps en temp et parfois tout le temps.
    Pourtant il n'y a aucun process en parallel qui execute la pl.

    la gestion de l'appel est gérée via une table avec un champ status
    quand le status = en_cours, on n'excute pas la pl. ce check se trouve au debut de la pl
    et seule la pl utilise la table à truncater et tous les curseurs sont bien fermés (en cas d'exception également)

    j'ai une déclaration comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Type t_tablo Is Table Of ma_table.refElement%Type INDEX BY BINARY_INTEGER;
    Est-ce que ca pourrait locker la table? si oui comment pourrais-je écrire autrement la déclaration ? sachant que t_tablo est utilisé un peu partout dans la pl :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    CREATE OR REPLACE PACKAGE BODY mon_pkg AS
     
    Type t_tablo Is Table Of ma_table.refElement%Type INDEX BY BINARY_INTEGER;
     
     
    PROCEDURE main as
     
    begin
     
    if est_en_cours=1 then
     
     log:
     
    else
     execute immediate 'truncate table ma_table';
     traiter;
     
    end if
     
    exception
        when others then
            fermer tous les curseurs ouverts
     
    end main;
     
    END pkg ;
    /
    Merci d'avance pour votre aide.

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Postez un code cohérent, c’est quoi le "est_en_cours", une variable une fonction? Qui la valorise et quand ? Sinon il va être difficile de vous aider.

  3. #3
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Points : 6 446
    Points
    6 446
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Il est pourtant certain qu'une autre transaction verrouille la table. TRUNCATE pose un verrou exclusif, donc il suffit qu'il y ait une mise à jour en cours.
    Pour l'identifier, voici plusieurs idées:
    - faire un select sur v$locked_object en cas d'erreur, et le logguer
    - attendre en cas d'erreur (DDL_LOCK_TIMEOUT en 11g par exemple) pour avoir le temps de rechercher la session bloquante. Ou pour lui laisser le temps de terminer sa transaction.
    Cordialement,
    Franck.

  4. #4
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    tu mettre un TRUNCATE et si la table est verrouillée à cause d'une transaction, le programme évité l'erreur à laide de block EXCEPTION...END

Discussions similaires

  1. Connections a une BD mysql dans une procédure stocké sql
    Par Zouko dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 13/05/2008, 15h42
  2. Réponses: 5
    Dernier message: 01/04/2008, 12h00
  3. Réponses: 3
    Dernier message: 13/10/2007, 16h31
  4. Réponses: 8
    Dernier message: 06/06/2007, 17h03
  5. truncate dans une procédure PL/SQL
    Par pierre.egaud dans le forum PL/SQL
    Réponses: 14
    Dernier message: 27/11/2006, 17h27

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