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:
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).
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;
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
Partager