Récupérer la valeur d'un type long par un SELECT statement
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:
1 2 3 4 5
|
decode ( data_default, null
, null
, data_default
) |
Bien entendu, cela retourne un
Code:
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:
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:
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:
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.