Problème de type sur une vue avec union

Fermé
Igmarh - 6 déc. 2017 à 15:50
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 - 29 déc. 2017 à 19:40
Bonjour
j'ai un problème sur le type d'une colonne dans une vue comportant un union

CREATE TABLE table_name (column_name NUMBER(10));

[insertion de rangées dans la table]

CREATE OR REPLACE FORCE VIEW view_name (column_name) AS SELECT column_name FROM table_name; -> OK view_name.column_name est de type number(10)

CREATE OR REPLACE FORCE VIEW view_name (column_name) AS SELECT column_name FROM table_name WHERE column_name<10 UNION SELECT column_name FROM table_name WHERE column_name>=10; -> idem OK

CREATE OR REPLACE FORCE VIEW view_name (column_name) AS SELECT column_name FROM table_name WHERE column_name<10 UNION SELECT NULL FROM table_name WHERE column_name>=10; -> KO view_name.column_name est de type number tout court, j'ai perdu le "(10)"

j'ai fait d'autres essais avec lesquels je n'obtient pas number(10) mais number tout court :
CREATE OR REPLACE FORCE VIEW view_name (column_name) AS SELECT CAST(column_name AS NUMBER(10)) FROM table_name WHERE column_name<10 UNION SELECT CAST(NULL AS NUMBER(10)) FROM table_name WHERE column_name>=10;
CREATE OR REPLACE FORCE VIEW view_name (column_name) AS SELECT CAST(column_name AS NUMBER(10)) FROM table_name WHERE column_name<10 UNION SELECT CAST(column_name AS NUMBER(10)) FROM table_name WHERE column_name>=10;

j'ai trouvé la solution suivante :
CREATE OR REPLACE FORCE VIEW view_name (column_name) AS SELECT CAST(column_name AS NUMBER(10)) FROM
(SELECT column_name column_name FROM table_name WHERE column_name<10 UNION SELECT column_name column_name FROM table_name WHERE column_name>=10);
mais pas très esthétique, et de plus celà engendre un temps de réponse légèrement supérieur

Quelqu'un aurait-il une solution pour forcer le type de ma colonne à number(10) ?

d'avance merci
A voir également:

2 réponses

forum92 Messages postés 220 Date d'inscription lundi 6 juillet 2015 Statut Membre Dernière intervention 14 août 2018 133
29 déc. 2017 à 19:03
Bonjour,
Est tu sur que 'column_name<10' compare bien la longueur et non le contenu du champ ?
0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
29 déc. 2017 à 19:40
bonsoir,
je suis surpris que ceci te convienne:
CREATE OR REPLACE FORCE VIEW view_name (column_name) AS SELECT CAST(column_name AS NUMBER(10)) FROM 
(SELECT column_name column_name FROM table_name WHERE column_name<10 UNION SELECT column_name column_name FROM table_name WHERE column_name>=10); 

je te suggère d'expliquer ce que tu veux réaliser.
0