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... :cry:
Merci d'avance,
JM