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é :
Bien entendu, cela retourne un
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 decode ( data_default, null , null , data_default )
j'ai également tenté la solution du SUBSTR,1,50 qui retourne un
Code : Sélectionner tout - Visualiser dans une fenêtre à part ORA-00997: Utilisation illégale du type de données LONG
et une conversion vers un LOB
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
Pour info, la query complète :
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
Donc, auriez-vous une idée pour récupérer cette valeur ? Conversion de type ou autre...
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';
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.
Partager