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

Oracle Discussion :

Problème de requête dynamique


Sujet :

Oracle

  1. #1
    Membre à l'essai
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Janvier 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 8
    Points : 12
    Points
    12
    Par défaut Problème de requête dynamique
    Hi all!

    Je me trouve confronté à un petit soucis en PLSQL sur une base oracle8i
    J'essaie (mais je galère pas mal) de faire un petit bloc PLSQL qui me récupère le nombre de lignes d'un certain type (Insert,Update,Delete).

    Quand je lance la requête sous PLSQL Developper:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT SUM( CASE WHEN dmltype$$ = 'I' THEN 1 ELSE 0 END ) num_pending_inserts,
           SUM( CASE WHEN dmltype$$ = 'U' THEN 1 ELSE 0 END ) num_pending_updates,
           SUM( CASE WHEN dmltype$$ = 'D' THEN 1 ELSE 0 END ) num_pending_deletes
           FROM
           mlog$_equipment_object_tab;
    J'obtiens bien mes trois colonnes Insert,Update et Delete.

    Après quelques ajustements:
    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
    DECLARE
      select_I VARCHAR2(2000);
      volume_I NUMBER;
      select_U VARCHAR2(2000);
      volume_U NUMBER;
      select_D VARCHAR2(2000);
      volume_D NUMBER;
     
      CURSOR mlog is
        select log_table from all_snapshot_logs
        where log_table = 'MLOG$_EQUIPMENT_OBJECT_TAB';
     
      mlog_name VARCHAR2(50);
     
    BEGIN
      FOR IC IN mlog LOOP
        mlog_name := IC.LOG_TABLE;
     
        --déclaration des commandes
        select_I := 'SELECT SUM(CASE WHEN DMLTYPE$$ = "I" THEN 1 ELSE 0 END) FROM ' || mlog_name || 'WHERE CHANGE_VECTOR IS NOT NULL;' ;
        select_U := 'SELECT SUM( CASE WHEN DMLTYPE$$ = "U" THEN 1 ELSE 0 END ) FROM' || mlog_name;
        select_D := 'SELECT SUM( CASE WHEN DMLTYPE$$ = "D" THEN 1 ELSE 0 END ) FROM' || mlog_name;
     
        --exécution des commandes
        execute immediate select_I
          into volume_I;
        execute immediate select_U
          into volume_U;
        execute immediate select_D
          into volume_D;
     
      -- Output le volume de données à répliquer
      -- DBMS_OUTPUT.put_line('Log: '||IC.LOG_TABLE || 'Inserts: '||num_pending_inserts || 'Updates: ' || num_pending_updates || 'Deletes: ' || num_pending_deletes );
     
      END LOOP;
     
    END;
    Quand je test ce bloc il me sort une exception ORA-00972: indentifier too long.
    Comment le nom de ma table (27 caractères) peut être trop long dans un cas et pas dans l'autre? Est-ce que ce sont mes adaptations qui sont pas terribles (ce qui est plus que probable étant donné mon niveau en PLSQL...)?

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 22
    Points : 68
    Points
    68
    Par défaut
    Bonjour,
    vous pouviez utiliser le DBMS_OUTPUT package pour voir votre requête dynamique assemblée.
    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    sqlplus "TEST_SCHEMA@OR11203"
     
    set serveroutput on
    DECLARE
      select_u VARCHAR2(2000);
      mlog_name CONSTANT VARCHAR2(30) := 'UN_NOM';
    BEGIN
       select_u := 'SELECT SUM( CASE WHEN DMLTYPE$$ = "U" THEN 1 ELSE 0 END ) FROM' || mlog_name;
       dbms_output.put_line('select_u = '||chr(10) || select_u);
    END;
    /
    Le résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select_u =
    SELECT SUM( CASE WHEN DMLTYPE$$ = "U" THEN 1 ELSE 0 END ) FROMUN_NOM
    Procédure PL/SQL terminée avec succès.
    Vous pouvez voir qu'un espace blanc manque après 'FROM'.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Janvier 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 8
    Points : 12
    Points
    12
    Par défaut
    Bonjour Andrei,

    Effectivement il y une erreur au niveau de l'espace après le from, ainsi qu'avant le where...on ne remarquera pas le fait que j'ai mis des doubles quotes au lieu de deux simples quotes
    Je me sens tout penaud...Merci pour votre aide en tout les cas. Je mets le sujet en résolu.

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

Discussions similaires

  1. Problème requète dynamique et paramètres en prompt
    Par lionrouge dans le forum iReport
    Réponses: 1
    Dernier message: 17/11/2010, 22h24
  2. Réponses: 0
    Dernier message: 03/01/2010, 13h40
  3. Problème Requête dynamique multi valeurs
    Par Bûth dans le forum PL/SQL
    Réponses: 2
    Dernier message: 17/03/2009, 11h01
  4. Réponses: 3
    Dernier message: 04/08/2008, 15h35
  5. Réponses: 1
    Dernier message: 01/08/2008, 17h25

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