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 :

Problème avec boucle for/loop.


Sujet :

PL/SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 31
    Points : 19
    Points
    19
    Par défaut Problème avec boucle for/loop.
    Bonjour,

    J'essaie d'utiliser les fonctions 'for' et 'loop' afin d'effectuer un comptage d'occurrences de tables avant et après nettoyage de celles-ci.

    J'utilise le script suivant avec la table qui s'appelle 'cpt_purge' et les champs qui s'appellent 'nomtable' (assez explicite) et 'nbenrav' (nombre d'enregistrements avant) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    declare
      t_nbrenr number;
     
    begin
      for coltab in (select nomtable from cpt_purge order by nomtable)
      loop
        select count(*) into t_nbrenr from coltab;
        update cpt_purge set nbenrav=t_nbrenr where nomtable=coltab;
      end loop;
    end;
    /
    Il y a une erreur sur le nom de la table:

    Error report:
    ORA-06550: Ligne 7, colonne 40 :
    PL/SQL: ORA-00942: Table ou vue inexistante
    ORA-06550: Ligne 7, colonne 5 :
    PL/SQL: SQL Statement ignored
    ORA-06550: Ligne 8, colonne 62 :
    PLS-00382: expression du mauvais type
    06550. 00000 - "line %s, column %s:\n%s"
    *Cause: Usually a PL/SQL compilation error.
    *Action:
    Je n'arrive pas à voir ce qui gêne, et je ne sais pas comment indiquer le nom de la table dans la clause 'where' de l''update'.

    Des collègues m'ont émis l'idée d'utiliser la clause 'EXECUTE IMMEDIATE' que j'ai rajouté devant l'update, mais sans résultat.

    Merci pour votre aide.
    Cordialement,

    Olivier

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    declare
    t_nbrenr number;
    
    begin
    for coltab in (select nomtable from cpt_purge order by nomtable)
    loop
    execute immediate 'select count(*) from '||coltab.nom_table into t_nbrenr;
    update cpt_purge set nbenrav=t_nbrenr where nomtable=coltab.nom_table;
    end loop;
    end;

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    Merci Garuda!
    J'ai essayé et ça semble répondre à mes besoins.
    Je testerai plus demain...

    Par contre, je n'arrive pas à m'expliquer les différences avec mon premier script et la fonctionnalité du 'EXECUTE IMMEDIATE' combiné au double |.
    Si tu pouvais m'éclairer ou qqun d'autre?
    Merci.

    Cdlt,
    Olivier

  4. #4

  5. #5
    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
    EXECUTE_IMMEDIATE prend comme paramètre un chaine contenant une requete SQL.
    Le double pipe '||' est tout simplement l'opérateur de concaténation du SQL et du PL/SQL !

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

Discussions similaires

  1. Problème avec boucle for
    Par GLDRX dans le forum LabVIEW
    Réponses: 1
    Dernier message: 14/06/2010, 21h43
  2. Problème avec boucle for
    Par kayenne77 dans le forum Débuter
    Réponses: 1
    Dernier message: 10/03/2009, 08h09
  3. [batch] problème avec boucle for
    Par TanEk dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 22/04/2008, 14h41
  4. Problème avec boucle for() et action POST
    Par Oli_Ifre dans le forum Langage
    Réponses: 4
    Dernier message: 26/04/2007, 09h52
  5. [ActionScript] Problème avec boucle 'FOR'
    Par BnA dans le forum Flash
    Réponses: 7
    Dernier message: 02/11/2006, 09h26

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