Salut,
J'aimerais créer une procédure qui génère un tableau croisé dynamique. Bien entendu, je sais que c'est impossible avec une commande SQL classique.
J'ai donc écrit une procédure qui génère dynamiquement une requête SQL avec toutes mes colonnes, mais je ne sais pas comment retourner le resultat de la requête comme celui d'un select clasique.
Si dessous le code que j'utilise :
Pour info, je fait ça pour intégrer le résultat dans un système de reporting extrêmement archaïque qui ne sais pas générer automatiquement des tableaux croisés (eh oui, ça existe encore).
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 declare stmt varchar2 (2048); abu varchar2(56); cursor cursor_abu is select distinct val_2 from t_slalom_outputs where table_name='WS3_MATURITY_LEVEL_PROCESS'; begin stmt := 'select ' || ' decode(grouping(val_3),1,''Grand Total'',val_3) as domain, ' || ' decode(grouping(val_4),1,''-'',val_4)as process'; open cursor_abu; loop fetch cursor_abu into abu; exit when cursor_abu%notfound; stmt := stmt || ' ,round(sum(decode(val_2,''' ||abu || ''',val_5,0))/sum(decode(val_2,''' ||abu || ''',1,0)),2) as "' ||abu ||'" '; end loop; close cursor_abu; stmt := stmt || 'from ' || 't_slalom_outputs ' || 'where ' || 'table_name=''WS3_MATURITY_LEVEL_PROCESS'' ' || 'group by rollup (val_3,val_4) ' || 'order by 1 asc, 2 asc'; execute immediate stmt; end;
Dans mon système, la seul chose que je peux lui donner est une requête SQL, donc si je peux lui renvoyer le résultat de la requête dans ma procédure, ce serait l'idéal.
PS. Non, je ne peux pas créer une fonction qui génère la requête et la donner à mon logiciel (il est archaïque, et mon client n'est pas prête à le changer)
Partager