Bonjour,

Dans une procédure je transfère des données dans un fichier .lis via la commande UTL_FILE. Ces données doivent être ordonnées en colonnes et chaque colonne peut recevoir des données de tailles différentes (essentiellement du VARCHAR2). Cela devrait donner ceci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
aaaaaaaa     bbbbbb      ccccc
aaa          bbbbb       ccccccc
aaaaaaaaa    bbbbbb      cc
Mais cela donne ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
aaaaaaaa     bbbbbb      ccccc
aaa      bbbbb        cccccccc
aaaaaaaaa     bbbbbb      cc
Pour le moment j'utilise la commande CHR(9) pour faire des tabulations et séparer les colonnes.

Le problème est qu'en VARCHAR2 la commande CHR(9) s'avère inutile. En effet certaines de mes données peuvent varier de 5 à 30 caractères. Je me disais donc que convertir en CHAR mes données (reçues via des select) serait la solution.

J'ai testé en utilisant des variables déclarées en CHAR qui reçoivent les données en VARCHAR2. En code cela donne quelque chose comme ça:

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
 
CURSOR c IS
SELECT col1, col2, col3 ...    -- données en VARCHAR2
FROM ...   
WHERE ...;
w       c%rowtype;
 
var1   CHAR(50);
var2   CHAR(50);
var3   CHAR(50);
...
BEGIN
   ...
   FOR w IN c LOOP
       var1 := w.col1;
       var2 := w.col2;
       var3 := w.col3;
       UTL_FILE.PUT_LINE(fichier, var1||CHR(9) ||var2||CHR(9) ||var3);
   END LOOP;
   ...
END;
Cette solution fonctionne mais cela me fait beaucoup de variable à déclarer, et je n'aime pas le fait que les déclarations soient faites en dur (c'est-à-dire que la taille des variables soient entrées dans le code).

Je pose donc ma question, y a t-il une commande pour convertir un VARCHAR2 en CHAR ?
Si non auriez-vous une autre solution ?

PS: évidemment quand je dis convertir en CHAR cela veut dire gardé la taille du VARCHAR2 : VARCHAR2(30) -> CHAR(30) même s'il n'y a que 15 caractères.