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 :

truncate dans une procédure PL/SQL


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 64
    Par défaut truncate dans une procédure PL/SQL
    Bonjour,

    J'ai une procédure PL/SQL qui doit vider une table entière, j'ai donc voulu utilisé un truncate au lieu d'un delete (trop gourmand en temps d'exécution).

    Petit problème : j'ai une erreur sur le truncate à la compilation de ma proc.

    ma syntaxe est bonne pourtant.

    Le truncate est bien possible dans une proc PLSQL ?

    Merci pour vos réponses

  2. #2
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut
    Truncate, ce n'est pas du SQL donc ça ne se compile pas dans du PL/SQL, cependant on peut passer en indirect par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXECUTE IMMEDIATE 'TRUNCATE TABLE SO3'

  3. #3
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    attention, ça commit la transaction

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    Citation Envoyé par Fred_D
    attention, ça commit la transaction
    La transaction en cours est commitée parce qu'il s'agit d'une instruction DDL, non ?
    Dans ce cas, si l'on veut éviter ce principe, n'est-il pas possible d'encapsuler le code exécuté par EXECUTE IMMEDIATE dans une transaction autonome ?

  5. #5
    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
    Salut Magnus,

    Oui, cela committe parce que c'est une instruction DDL (=> commit implicit)

    On peut tout à fait encapsuler cela dans une procédure autonome, attention néanmoins au lock.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 64
    Par défaut
    merci beaucoup. Je ne savais pas

  7. #7
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut
    Citation Envoyé par plaineR
    ...
    On peut tout à fait encapsuler cela dans une procédure autonome, attention néanmoins au lock.
    Le truncate fonctionne en "nowait" donc il ne tolèrera pas d'accès concurent. s'il est appelé dans une procédure autonome, il se mettra donc en "concurence" avec sa procédure appelante. Si dans cette dernière il y a eu des modif sur la table, une exception sera levée...

    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
    SQL> create procedure trunc_toto is
      2  pragma autonomous_transaction;
      3  begin
      4  execute immediate 'truncate table toto';
      5  end;
      6  /
     
    Procédure créée.
     
    SQL> create table toto (c1 varchar(32));
     
    Table créée.
     
    SQL>  insert into toto values ('toto');
     
    1 ligne créée.
     
    SQL> call trunc_toto();
    call trunc_toto()
         *
    ERREUR à la ligne 1 :
    ORA-00054: resource busy and acquire with NOWAIT specified
    ORA-06512: at "LE_USER.TRUNC_TOTO", line 4
     
    SQL>

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Table verrouillée dans une procédure PL/SQL
    Par bao94 dans le forum PL/SQL
    Réponses: 3
    Dernier message: 31/10/2012, 09h08
  2. Utilisation d'une variable dans une procédure PL/SQL
    Par WOLO Laurent dans le forum PL/SQL
    Réponses: 6
    Dernier message: 31/10/2011, 11h00
  3. Réponses: 0
    Dernier message: 27/04/2009, 16h13
  4. 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
  5. Réponses: 5
    Dernier message: 01/04/2008, 12h00

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