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 : 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
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