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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 64
    Points : 48
    Points
    48
    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 éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    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 sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

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

  4. #4
    Membre chevronné

    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
    Points : 1 775
    Points
    1 775
    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
    Points : 3 609
    Points
    3 609
    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 du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

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

  7. #7
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    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>

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    c'est bien ce qu'il dit quand il prévient de faire attention aux locks

  9. #9
    Membre chevronné

    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
    Points : 1 775
    Points
    1 775
    Par défaut
    Citation Envoyé par remi4444
    ...Si dans cette dernière il y a eu des modif sur la table...
    Tu parles de la procédure appelante ?
    Dans ton exemple, la procédure appelante ne modifie pas la structure de la table TOTO et pourtant l'invocation de la procédure génère un message d'erreur.
    Je ne comprends pas ta dernière phrase, tu peux la reformuler s'il te plait ?

  10. #10
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Désolé, je me suis peut etre mal exprimé effectivement...

    Je parlais simplement de modification des données, c'est a dire quelque chose qui provoque un lock.
    Une modification de structure provoquerait aussi un commit implicite donc le problème ne se poserait pas.

  11. #11
    Membre chevronné

    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
    Points : 1 775
    Points
    1 775
    Par défaut
    Citation Envoyé par remi4444
    Désolé, je me suis peut etre mal exprimé effectivement...
    Nan nan, j'ai tendance à faire des malentendus voilà tout

    J'ai donc finalement compris ton idée mais regarde ce que j'obtiens sur une base en 10gR1 :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    10g SOC5> create or replace procedure trunc_dvp is
      2    pragma autonomous_transaction;
      3  begin
      4    execute immediate 'truncate table dvp';
      5  end;
      6  /
     
    Procédure créée.
     
    10g SOC5> drop table dvp;
     
    Table supprimée.
     
    10g SOC5> create table dvp(x number(2));
     
    Table créée.
     
    10g SOC5> call trunc_dvp;
    commande inconnue début "call trunc..." - reste de la ligne ignoré.
    10g SOC5> call trunc_dvp();
    commande inconnue début "call trunc..." - reste de la ligne ignoré.
    10g SOC5> begin
      2  trunc_dvp;
      3  end;
      4  /
     
    Procédure PL/SQL terminée avec succès.
     
    10g SOC5> insert into dvp values (15);
     
    1 ligne créée.
     
    10g SOC5> begin
      2  trunc_dvp;
      3  end;
      4  /
    begin
    *
    ERROR à la ligne 1 :
    ORA-00054: ressource occupée et acquisition avec NOWAIT (pas d'attente) indiquée
    ORA-06512: à "SOC5.TRUNC_DVP", ligne 4
    ORA-06512: à ligne 2
     
     
    10g SOC5>
    Cet exemple illustre parfaitement l'exception qui est levée à partir du moment où j'ai inséré des données dans ma table.

    Ceci dit, je m'étonne de voir que la méthode call ne fonctionne pas chez moi.
    J'en profite pour te demander si tu n'aurais pas une explication par hasard (j'imagine bien que c'est complètement indépendant de ce topic) au fait que cette commande soit inconnue ?

  12. #12
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Citation Envoyé par Magnus
    ....
    Ceci dit, je m'étonne de voir que la méthode call ne fonctionne pas chez moi.
    J'en profite pour te demander si tu n'aurais pas une explication par hasard (j'imagine bien que c'est complètement indépendant de ce topic) au fait que cette commande soit inconnue ?
    Je pense qu'en mettant les parenthèses dans l'appel du call, ça aurait une meilleure chance de fonctionner....

    Eh oui je sais... pas de parenthèse à la déclaration, pas de parenthèse à l'interrieur d'un block, mais des parenthèses pour un call...

  13. #13
    Membre chevronné

    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
    Points : 1 775
    Points
    1 775
    Par défaut
    Citation Envoyé par remi4444
    Je pense qu'en mettant les parenthèses dans l'appel du call, ça aurait une meilleure chance de fonctionner....

    Eh oui je sais... pas de parenthèse à la déclaration, pas de parenthèse à l'interrieur d'un block, mais des parenthèses pour un call...
    Merci de ta patience Rémi mais tu remarqueras que dans mon exemple j'ai essayé les 2 syntaxes et aucune ne fonctionne (?)

  14. #14
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Citation Envoyé par Magnus
    Merci de ta patience Rémi mais tu remarqueras que dans mon exemple j'ai essayé les 2 syntaxes et aucune ne fonctionne (?)

    Ah oui ok je vais m'acheter des lunettes.....


    Ceci dit, je comprends pas... chez moi j'ai essayé avec le sqlplus classique et avec le sqlplus-worksheet ça fonctionne en 10gR2 en 9i et en 8i.
    La seule version que j'ai pas c'est la 10gR1.......

  15. #15
    Membre chevronné

    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
    Points : 1 775
    Points
    1 775
    Par défaut
    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
    8i CYRIL> show release
    release 801070400
    8i CYRIL> create or replace procedure trunc_dvp is
      2  begin
      3    execute immediate 'trunc table dvp';
      4    dbms_output.put_line('trunc effectué sur la table dvp');
      5  end;
      6  /
     
    Procédure créée.
     
    8i CYRIL> drop table dvp;
     
    Table supprimée.
     
    8i CYRIL> create table dvp (x long);
     
    Table créée.
     
    8i CYRIL> call trunc_dvp();
    commande inconnue début "call trunc..." - reste de la ligne ignoré.
    8i CYRIL> desc call
    ERROR :
    ORA-04043: object call does not exist
    En 8i ça ne fonctionne donc pas chez moi mais je vais considérer que c'est dû à un paramétrage ou autre...

    Merci pour les explications.

+ 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