[10g] [PL/SQL] - interroger dynamiquement une collection
Bonjour,
je me demande comment il est possible (ou plus simplement si c'est possible) de balayer toutes les colonnes d'un record dans un bloc PL/SQL ou d'indiquer dynamiquement le nom d'une colonne .
Comme un exemple est plus parlant qu'une longue explication, je me lance.
Prenons le jeu de test suivant, à savoir une collection que j'alimente manuellement :
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
|
declare
-- définition du record
TYPE R_TEST IS RECORD (
Col1 varchar2(8),
Col2 varchar2(8),
Col3 varchar2(8)
);
MonRecord R_TEST;
-- définition de la collection
TYPE C_TEST IS TABLE OF R_TEST index by binary_integer ;
MaCollection C_TEST ;
BEGIN
MonRecord.Col1 := ('A1');
MonRecord.Col2 := ('B1');
MonRecord.Col3 := ('C1');
MaCollection(1) := MonRecord;
MonRecord.Col1 := ('A2');
MonRecord.Col2 := ('B2');
MonRecord.Col3 := ('C2');
MaCollection(2) := MonRecord;
END;
/ |
On a donc un tableau renseigné comme ceci :
Col1 Col2 Col3
A1 B1 C1
A2 B2 C3
Pour interroger une colonne, je l'indique en dur dans le code :
Code:
1 2
|
dbms_output.PUT_LINE(MaCollection(2).col2); |
Ce que je voudrais, c'est accéder à une colonne de la collection de façon dynamique. Par exemple en valorisant une variable :
Code:
1 2 3
|
v_col varchar2(10) := 'Col1';
dbms_output.PUT_LINE(MaCollection(2).v_col); |
Bien évidemment, cet exemple ne fonctionne pas, mais y'a-t-il un moyen qui permettrait de le faire ?
On peut indexer une collection par un varchar2 pour pointer directement sur une ligne. Y'a-t-il un équivalent sur les colonnes?
Mon besoin est que je dois descendre le contenu d'une table dans une collection (C_TEST), et sur des colonnes que je ne connais pas à l'avance, je vais devoir effectuer un traitement. Le nom des colonnes et le traitement est stocké dans une table de paramètrage, d'où mon problème pour interagir entre les données et le code.
Ma collection est fixe, puisque c'est la même table qui est attaquée, mais etant donné sa structure ( + de 400 colonnes), je ne me vois pas tester le nom des 400 colonnes en dur dans le code.
Merci pour vos idées et suggestions.