Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
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 26/12/2006, 14h33   #1
Membre habitué
 
Inscription : décembre 2005
Messages : 455
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 455
Points : 127
Points : 127
Par défaut ORACLE: accéder à une table dont le nom est dans une table

Bonjour,

J'ai une dizaine de tables d'erreurs dans ma base de données oracle.
Je voudrais chaque matin recevoir un mail qui liste toutes les données en erreur de la nuit.

Pour cela j'ai créé une procédure stockée qui va rechercher dans chaque tables les données en erreur.
J'ai donc tout d'abord fait un curseur comme suit :
Code :
1
2
3
4
5
6
7
 
 FOR C IN (SELECT TABLE_NAME
           FROM ALL_TABLES
           WHERE TABLE_NAME LIKE ERR_%')
 LOOP
   INSTRUCTION
  END LOOP;
Grâce à cette boucle j'obtiens la liste de mes tables d'erreur.
Ensuite je voudrais table par table lister les lignes en erreur.
Mais comment faire?
du sql dynamique?
Mais comment afficher mon résultat si je fais comme suit:
Code :
1
2
3
 
le_sql:='SELECT * FROM :1 WHERE FLAG='ERR''
EXECUTE IMMEDIATE le_sql USING c.table_name
Mais cela me semble bizarre et je ne vois pas ensuite comment récupérer les données de ma requête.
Quelqu'un pourrait il m'aider?Merci
claralavraie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2006, 14h41   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
http://sheikyerbouti.developpez.com/...mmediate/#L4.2
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2006, 14h59   #3
Membre habitué
 
Inscription : décembre 2005
Messages : 455
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 455
Points : 127
Points : 127
J'ai fait comme ceci:
Code :
1
2
3
 
le_sql:='SELECT DISTINCT DATE_PROCESS, NB_PROCESS FROM '||V_TABLE||'WHERE PROCESS_FLAG=''ERR''';
  EXECUTE IMMEDIATE le_sql RETURN INTO V_DATE, V_PROC_NUMBER;
Mais cela ne fonctionne pas.
Quand j'execute ma procédure j'ai l'erreur suivante:

Code :
1
2
3
4
5
 
 
ORA-00933: SQL command NOT properly ended
ORA-06512: at "ALERTE_S", line 25
ORA-06512: at line 2
claralavraie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2006, 15h02   #4
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
'WHERE ' WHERE

manque un espace
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2006, 15h12   #5
Membre habitué
 
Inscription : décembre 2005
Messages : 455
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 455
Points : 127
Points : 127
Ah oui je suis un pe tête en l'air avec les fêtes :-)

J'ai donc ajouter l'espace mais j'ai une nouvelle erreur qui me dit que je ne peux utiliser un return into qu'avec INSERT DELETE UPDATE.
Est ce exact?
ou y a t'il un probème avec ma syntaxe?
claralavraie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2006, 15h15   #6
Membre Expert
 
Avatar de nuke_y
 
Inscription : mai 2004
Messages : 1 812
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 1 812
Points : 1 609
Points : 1 609
Le lien de Fred me semble assez clair pourtant :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
DECLARE
  Emp_id            emp.emp_id%TYPE := 1214 ;
  Emp_name          emp.name_id%TYPE ;
  Emp_rec           emp%ROWTYPE ;
  LC$Requete        VARCHAR2(256) ;
BEGIN
  LC$Requete:=SELECT emp_name FROM EMP WHERE empno = :1’;
  EXECUTE IMMEDIATE LC$Requete INTO Emp_name USING Emp_id ;
 
  LC$Requete:=SELECT * FROM EMP WHERE empno = :1’;
  EXECUTE IMMEDIATE LC$Requete INTO Emp_rec USING Emp_id ;
END ;
Pourquoi utiliser un RETURN INTO au lieu du INTO simple ?
__________________
Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

Mon combat pour les droits des consommateurs face aux abus des grandes marques.
nuke_y est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2006, 15h21   #7
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
Attention, dans le cas où l'EXECUTE IMMEDIATE renvoie plus d'une ligne, il faut utiliser le BULK COLLECT
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2006, 15h51   #8
Membre habitué
 
Inscription : décembre 2005
Messages : 455
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 455
Points : 127
Points : 127
Merci pour votre aide
claralavraie 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 00h11.


 
 
 
 
Partenaires

Hébergement Web