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 28/07/2011, 09h16   #1
Membre à l'essai
 
Inscription : avril 2005
Messages : 80
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 80
Points : 20
Points : 20
Par défaut Curseur avec requête en variable et nombre de champs inconnu

Bonjour,

Mon travaille consiste à parcourir une liste de noms de tables (noms contenu dans le champs du autre table) et pour chacune récupérer sa clé primaire et ensuite parcourir le contenu de la table en sélectionnant que les champs de la clé primaire.
Pour le moment, j'arrive seulement à :
  • parcourir ma liste de noms de table.
  • obtenir le détails de la clé primaire.

Voici mon programme en simplifié et avec le strict nécessaire pour comprendre mon soucis:
Code :
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
-- Positionnement des paramètres
SET NEWPAGE 0
SET SPACE 0
SET ECHO OFF
SET TERM ON
SET FEEDBACK ON
SET HEADING OFF
SET TAB OFF
SET LINESIZE  200
SET TRIMSPOOL ON
SET PAGESIZE 0
SET VERIFY OFF
SET SERVEROUTPUT ON SIZE 1000000
 
DECLARE
	TYPE type_tab IS varray (200) OF VARCHAR2(500);
	iter					NUMBER(4, 0) := 1;
	colonne					VARCHAR2(50) := '';
	colonnes_cle			VARCHAR2(5000) := '';
	requeteAnalyse			VARCHAR2(2000) := '';
	requeteColonnes			VARCHAR2(255) := '';
	requeteColonnesCle		VARCHAR2(255) := '';
	curseurColonnesCle		sys_refcursor;
	tab_colonnes_cle		type_tab;
 
 
	CURSOR Cur1 IS
		SELECT m.* FROM liste_noms_table m
		ORDER BY m.nom_table;
	V1 Cur1%RowType;
 
 
BEGIN
	/* Parcours des tables de la liste */
	FOR V1 IN Cur1 LOOP
		BEGIN
			iter := 1;
			colonnes_cle := '';
			tab_colonnes_cle := type_tab();
			requeteAnalyseCle := 'select t.* from ' || V1.nom_table;
 
			dbms_output.put_line('	Parcours des informations de la table ' || V1.nom_table);
			/* Récupération des noms de colonnes de la contrainte primaire (primary key) */
			iter := 1;
			requeteColonnesCle := 'select column_name from user_cons_columns where constraint_name in (select index_name from user_constraints where table_name = ''' || V1.nom_table || ''' and CONSTRAINT_TYPE=''P'')';
			OPEN curseurColonnesCle FOR requeteColonnesCle;
			LOOP
				FETCH curseurColonnesCle INTO colonne;
				EXIT WHEN curseurColonnesCle%NOTFOUND; 
				tab_colonnes_cle.EXTEND;
				tab_colonnes_cle(iter) := colonne;
				colonnes_cle := colonnes_cle || colonne || ',';
				iter := iter + 1;
			END LOOP;
 
			/* Parcours des enregistrements de la table */
			requeteAnalyseCle := REPLACE(requeteAnalyseCle, 't.*', RTRIM(colonnes_cle, ','));
			dbms_output.put_line(requeteAnalyseCle);
		END;
	END LOOP;
END;
 
/
 
exit;
Au final, ma variable requeteAnalyseCle contient la requête que je veux jouer mais je ne peux pas utiliser sys_refcursor (trouvé ici) , du moins pas avec une clause into car je ne peux pas donner le nombre de champs en sortie (différent à chaque table de la liste).

Quelqu'un aurait-il une idée et surtout un bout de code? Car, j'ai bien quelques pistes sur internet (Execute immediate, bulk...) mais je n'arrive pas à adapter le code...

Merci d'avance,

JM
jm49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 11h52   #2
Membre confirmé
 
Homme Grégoire MARTIN
Ingénieur développement logiciels
Inscription : janvier 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Homme Grégoire MARTIN
Âge : 32
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Finance

Informations forums :
Inscription : janvier 2011
Messages : 128
Points : 225
Points : 225
Bonjour,

Pour résumer ton problème c'est que tu ne connais pas à l'avance dans quelle structure tu va pouvoir fetcher ta requête ?

Code :
1
2
3
4
5
6
7
 
OPEN curseurColonnesCle FOR requeteAnalyseCle;
LOOP
       FETCH curseurColonnesCle INTO <une structure indeterminée>;
       .....
END LOOP;
CLOSE curseurColonnesCle ;
en tout cas ceci semble être impossible :
http://download.oracle.com/docs/cd/B..._variables.htm

Citation:
PL/SQL makes sure the return type of the cursor variable is compatible with the INTO clause of the FETCH statement. For each column value returned by the query associated with the cursor variable, there must be a corresponding, type-compatible field or variable in the INTO clause. Also, the number of fields or variables must equal the number of column values. Otherwise, you get an error.
ORA-007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 13h35   #3
Membre à l'essai
 
Inscription : avril 2005
Messages : 80
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 80
Points : 20
Points : 20
J'avais bien peur que ce soit impossible et tu me le confirmes là, donc dommage pour moi, je vais chercher une autre méthode.

Merci,

JM
jm49 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 15h32.


 
 
 
 
Partenaires

Hébergement Web