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