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 et pl/sql


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 115
    Points : 59
    Points
    59
    Par défaut truncate et pl/sql
    Bonjour à tous,

    j'ai un petit pb avec pl/sql.
    En effet, lorsque je lance la procédure pl/sql suivante avec DELETE, tout fonctionne normalement, alors que si je cherche à optimiser mon code et que j'utilise TRUNCATE, j'ai un message d'erreur.

    Pouvez-vous m'aider à résoudre ce problème ?

    Par ailleurs, si vous avez des suggestions pour améliorer ce genre de requêtes, elles sont les bienvenues
    -copie partielle d'une table d'un schéma dans un autre schéma, de façon régulière (c'est à dire tous les mois)
    - création d'un fichier de "log" qui sauvegarde automatiquement les données affichées par le dbms_output.


    Merci à tous

    MarieO

    Le message d'erreur est le suivant:
    Error report:
    ORA-06550: Ligne 7, colonne 10 :
    PLS-00103: Symbole "TABLE" rencontré à la place d'un des symboles suivants :
    := . ( @ % ;
    Symbole ":= inséré avant "TABLE" pour continuer.
    06550. 00000 - "line %s, column %s:\n%s"
    *Cause: Usually a PL/SQL compilation error.
    *Action:


    Voici le code concerné:

    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
    DEFINE ValAnnee = 2007
    DEFINE ValMois = 12
    DEFINE ValPeriode = 200712
    DECLARE
     iDateDeb VARCHAR2(25) := To_CHAR(sysdate,'DD/MM/YYYY, HH24:MI:SS');
     iDateFin VARCHAR2(25);
     iPeriode VARCHAR2(6) := &ValPeriode;
     iNb NUMBER;
    BEGIN
     TRUNCATE TABLE schema1.maTable;
     INSERT INTO schema1.maTable (id_info, nom, prenom, annee, mois)
      SELECT DISTINCT id_info, nom, prenom, annee, mois
      FROM schema2.maTable
      WHERE annee=&ValAnnee AND mois<=&ValMois ;
     SELECT COUNT(*) INTO iNb FROM schema1.maTable;
     iDateFin := To_CHAR(sysdate,'DD/MM/YYYY, HH24:MI:SS');
     dbms_output.put_line('Consolidation / période ' || iPeriode || ' ---');
     dbms_output.put_line (' durée du traitement : ' || iDateDeb || ' - ' || iDateFin);
     dbms_output.put_line('Nb dans la table : ' || iNb);
    END;
    /

  2. #2
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Il faut faire du sql dynamique pour du DDL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    EXECUTE IMMEDIATE 'TRUNCATE TABLE schema1.maTable';
    NB
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

    Oracle 12C R2 - Forms11GR2 - Toad 12 - sharePoint 2010

  3. #3
    Membre actif Avatar de DAB.cz
    Inscrit en
    Octobre 2006
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 221
    Points : 249
    Points
    249
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...
    BEGIN
      EXECUTE IMMEDIATE 'TRUNCATE TABLE schema1.maTable';
      INSERT INTO schema1.maTable (id_info, nom, prenom, annee, mois)
       .....
    DAB

  4. #4
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 115
    Points : 59
    Points
    59
    Par défaut
    Merci à vous deux pour cette réponse rapide.

    Ca marche !!! Je ne connaissais pas le SQL dynamique...
    Maintenant, j'aurais de nouvelles pistes de travail.

    D'autre part, si vous avez des idées pour automatiser des copies partielles de tables d'un schéma dans un autre tous les mois et optimier le code que j'utilise, elles sont les bienvenues...

    MarieO

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    regarde du coté des jobs

  6. #6
    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
    Vous n’avez pas besoin du SQL dynamique. Il suffit de sortir le truncate ainsi que le insert du bloc PL/SQL.

  7. #7
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Vous n’avez pas besoin du SQL dynamique. Il suffit de sortir le truncate ainsi que le insert du bloc PL/SQL.
    ????
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

    Oracle 12C R2 - Forms11GR2 - Toad 12 - sharePoint 2010

  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 : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    en effet d'ailleurs, on peut s'interroger sur l'usage du PL/SQL dans le cas présent

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Citation Envoyé par Garuda Voir le message
    ????
    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
    DEFINE ValAnnee = 2007
    DEFINE ValMois = 12
    DEFINE ValPeriode = 200712
    COL iDateDeb new_value iDateDeb noprint
     
    SELECT To_CHAR(sysdate,'DD/MM/YYYY, HH24:MI:SS') iDateDeb
    FROM dual;
     
     TRUNCATE TABLE schema1.maTable;
     INSERT INTO schema1.maTable (id_info, nom, prenom, annee, mois)
      SELECT DISTINCT id_info, nom, prenom, annee, mois
      FROM schema2.maTable
      WHERE annee=&ValAnnee AND mois<=&ValMois ;
     
    COL iDateFin new_value iDateFin noprint
     
    SELECT To_CHAR(sysdate,'DD/MM/YYYY, HH24:MI:SS') iDateFin 
    FROM dual;
     
     SELECT 'Nb dans la table : ' || COUNT(*) 
     FROM schema1.maTable;
     PROMPT Consolidation / période &ValPeriode ---
     PROMPT durée du traitement : &iDateDeb  - &iDateFin
    ou un truc du style

  10. #10
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 115
    Points : 59
    Points
    59
    Par défaut
    Est-ce que le fait de sortir mes requêtes TRUNCATE ... et INSERT INTO ... du bloc pl/sql va optimiser le traitement ?

    Qu'est-ce que cela change entre le fait de le mettre DANS le bloc ou HORS du bloc ?

    Est-il possible de créer un fichier .txt (sauvegardé dans un répertoire quelconque) qui contienne l'information affichée par dbms_output plutôt que de faire l'affichage à l'écran ?

    Marieo

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    PROMPT dans SQL*Plus permet d'afficher du texte

  12. #12
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 115
    Points : 59
    Points
    59
    Par défaut
    Bonjour,
    Prompt affiche du texte, mais uniquement à l'écran, n'est-ce pas ?

    D'autre part, je travaille avec sql developer.

    MarieO

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Comme dbms_output

    je ne sais pas si PROMPT fonctionne dans SQL Dev.

    Ceci étant tu peux continuer en PL/SQL mais en sortant le TRUNCATE du bloc. Ca n'aura pas d'effet sur le perf (du moins, négligeable) mais c'est plus propre que le SQL dynamique qui ici est inutile

  14. #14
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par orafrance Voir le message
    Ceci étant tu peux continuer en PL/SQL mais en sortant le TRUNCATE du bloc. Ca n'aura pas d'effet sur le perf (du moins, négligeable) mais c'est plus propre que le SQL dynamique qui ici est inutile
    Merci du tuyau ! Je ne connaissais pas ce truc là !

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    c'est mnitu qui a lever le "loup"

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

Discussions similaires

  1. Requête 'Truncate table' sur SQL Server conpact 3.5 ?
    Par Shypster dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 08/05/2009, 17h00
  2. truncate dans une procédure PL/SQL
    Par pierre.egaud dans le forum PL/SQL
    Réponses: 14
    Dernier message: 27/11/2006, 17h27
  3. Sql Server Probleme Truncate / Pas Arrondi
    Par Nathan_2 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 02/05/2006, 19h09
  4. [SQL Server] Data truncated bizarre
    Par djdada dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 26/10/2005, 17h31
  5. commande SQL truncate table xxx
    Par Yogy dans le forum SQL
    Réponses: 1
    Dernier message: 07/10/2004, 14h57

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