Voilà, mon problème est celui-ci, je désire récupérer la valeur d'une colonne de type "LONG", et ce dans un decode, le principe est assez simple, je crée une query qui doit reconstituer un script de creation de table sans passer par DBMS_METADATA.

Bien entendu, seuls les rudiments sont nécessaires, or je bloque au niveau de la colonne data_default de la vue user_tab_cols. Impossible de trouver comment utiliser la valeur contenue à l'intérieur par un decode, voici le script que j'avais imaginé :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
decode ( data_default, null
                              , null
                              , data_default
              )
Bien entendu, cela retourne un
Code : Sélectionner tout - Visualiser dans une fenêtre à part
ORA-00997: Utilisation illégale du type de données LONG
j'ai également tenté la solution du SUBSTR,1,50 qui retourne un


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
select substr(data_default, 1, 50)
from user_tab_columns 
where table_name='T_NAME';
 
ORA-00932: inconsistent datatypes: expected number got long
et une conversion vers un LOB

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
select to_lob(data_default) 
from user_tab_cols 
where table_name = 'CXW8601_CLIENT';
 
ORA-00932: inconsistent datatypes: expected - got LONG
Pour info, la query complète :

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
32
33
34
35
36
37
38
39
40
41
42
43
44
 
 
select
       'Create table ' 
    || 'TOAD_PLAN_TABLE (' 
    || chr(13) 
    || to_char(xmlagg(xmlelement(str, chr(9) 
    || column_name 
    || ' ' 
    || data_type 
    -- Si la valeur est number, sa precision aparaitra dans la colonne data_precision, sinon c'est dans data_length
    || decode ( data_precision, null
                              , decode ( CHAR_COL_DECL_LENGTH, null 
                                                             , null 
                                                             , '(' || CHAR_COL_DECL_LENGTH || ')'
                                       ) 
                              , '(' || data_precision || ')'
              )
    -- Attribut de vérification si une colonne peut être nulle
    || decode ( NULLABLE, 'Y'
                        , ''
                        , ' NOT NULL'
              )
    -- Default value? (Probleme : Valeur en "long") ---> DATA_DEFAULT
 
 
    -- Selection de la dernière valeur du groupe pour la virgule
    || decode ( column_id 
                       , ( 
                            select max(column_id)
                            from user_tab_cols
                            where table_name='TOAD_PLAN_TABLE'
                          )
                        ,' '
                        ,','
              )
    || chr(13) ) order by column_id ).extract('/STR/text()').getclobval())
    || ')'
    -- Tablespace? 
    || ';'
    -- Alter tables ? Ajout des contraintes?
    as "Query creation de table"
from user_tab_cols
where table_name='TOAD_PLAN_TABLE';
Donc, auriez-vous une idée pour récupérer cette valeur ? Conversion de type ou autre...

Je précise que je sais que la méthode n'est pas idéale, c'est simplement un exercice qui permet d'appréhender diverses difficultés que l'on peut rencontrer en SQL.