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 :
On a donc un tableau renseigné comme ceci :
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 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; /
Col1 Col2 Col3
A1 B1 C1
A2 B2 C3
Pour interroger une colonne, je l'indique en dur dans le code :
Ce que je voudrais, c'est accéder à une colonne de la collection de façon dynamique. Par exemple en valorisant une variable :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 dbms_output.PUT_LINE(MaCollection(2).col2);
Bien évidemment, cet exemple ne fonctionne pas, mais y'a-t-il un moyen qui permettrait de le faire ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 v_col varchar2(10) := 'Col1'; dbms_output.PUT_LINE(MaCollection(2).v_col);
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.
Partager