Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/01/2011, 17h22   #1
Invité régulier
 
Inscription : janvier 2011
Messages : 31
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 31
Points : 9
Points : 9
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 :
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:

Citation:
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
Reivilo35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2011, 17h42   #2
Membre Expert
 
Avatar de Garuda
 
Homme Philippe CHIRCOP
Chef de projet
Inscription : juin 2007
Messages : 1 109
Détails du profil
Informations personnelles :
Nom : Homme Philippe CHIRCOP
Localisation : France

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

Informations forums :
Inscription : juin 2007
Messages : 1 109
Points : 1 559
Points : 1 559
Code :
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;
__________________
Garuda गरूड
Brahmâ la Guerre et Vishnu la Paix

Oracle 10.2.0.4 - Forms6i patch 17 - Toad 11.1 - sharePoint 2010
Garuda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2011, 18h36   #3
Invité régulier
 
Inscription : janvier 2011
Messages : 31
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 31
Points : 9
Points : 9
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
Reivilo35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2011, 19h18   #4
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 520
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 520
Points : 3 967
Points : 3 967
lisez ceci : http://sheikyerbouti.developpez.com/execute_immediate/
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 09h01   #5
Membre Expert
 
Avatar de Garuda
 
Homme Philippe CHIRCOP
Chef de projet
Inscription : juin 2007
Messages : 1 109
Détails du profil
Informations personnelles :
Nom : Homme Philippe CHIRCOP
Localisation : France

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

Informations forums :
Inscription : juin 2007
Messages : 1 109
Points : 1 559
Points : 1 559
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 !
__________________
Garuda गरूड
Brahmâ la Guerre et Vishnu la Paix

Oracle 10.2.0.4 - Forms6i patch 17 - Toad 11.1 - sharePoint 2010
Garuda est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h06.


 
 
 
 
Partenaires

Hébergement Web