Il n'y a pas d'« option » dans Oracle pour faire cela; vous pouvez être en mesure de trouver un client qui vous permet de le faire, car il s'agit d'un travail qui serait normalement effectué chez le client ; Je n'en connais pas.
Pour développer la réponse de tbone
vous allez devoir le faire dynamiquement. Cela ne fait pas signifie que vous devez lister chaque colonne. Vous utiliserez le dictionnaire de données
, en particulier all_tab_columns
ou user_tab_columns
pour créer votre requête. Il serait plus facile de créer une vue avec la définition exacte que vous souhaitez afin de pouvoir la réutiliser si vous le souhaitez.
Le but est d'utiliser le fait que l'existence des colonnes est stockée dans une table sous forme de chaîne afin de créer une requête pour utiliser cette colonne. Comme les noms de colonne et les noms de table sont stockés sous forme de chaînes, vous pouvez utiliser des techniques d'agrégation de chaînes pour créer facilement une requête ou une instruction DDL que vous pouvez ensuite exécuter manuellement ou dynamiquement.
Si vous utilisez Oracle 11g Release 2, listagg
fonction est disponible pour vous aider :
select 'create or replace view my_view as
select '
|| listagg( table_name || '.' || column_name
|| ' as '
|| substr(table_name,1,1) || '_'
|| column_name, ', ')
within group
( order by case when table_name = 'FOO' then 0 else 1 end
, column_id
)
|| ' from foo f
join bar b
on f.id = b.foo_id'
from user_tab_columns
where table_name in ('FOO','BAR')
;
En supposant cette structure de table :
create table foo ( id number, a number, b number, c number);
create table bar ( foo_id number, a number, b number, c number);
Cette requête unique produit ce qui suit :
create or replace view my_view as
select FOO.ID as F_ID, FOO.A as F_A, FOO.B as F_B, FOO.C as F_C
, BAR.FOO_ID as B_FOO_ID, BAR.A as B_A, BAR.B as B_B, BAR.C as B_C
from foo f
join bar b on f.id = b.foo_id
et voici un SQL Fiddle pour le prouver.
Si vous n'utilisez pas 11.2, vous pouvez obtenir exactement les mêmes résultats en utilisant la fonction non documentée wm_concat
ou la fonction définie par l'utilisateur stragg
, créé par Tom Kyte. Oracle Base a un article sur les techniques d'agrégation de chaînes
et il y a beaucoup de messages sur Stack Overflow.
En tant que petit addendum, vous pouvez réellement créer exactement ce que vous recherchez en modifiant légèrement la requête ci-dessus. Vous pouvez utiliser un identifiant entre guillemets
pour créer une colonne dans le TABLE_NAME.COLUMN_NAME
format. Vous avez pour le citer comme .
n'est pas un caractère valide pour un nom d'objet dans Oracle. L'avantage est que vous gagnez exactement ce que vous voulez. L'inconvénient est que l'interrogation de la vue créée est très pénible si vous n'utilisez pas select * from ...
; la sélection de colonnes nommées nécessitera qu'ils soient cités.
select 'create or replace view my_view as
select '
|| listagg( table_name || '.' || column_name
|| ' as '
|| '"' || table_name || '.'
|| column_name || '"', ', ')
within group
( order by case when table_name = 'FOO' then 0 else 1 end
, column_id
)
|| ' from foo f
join bar b
on f.id = b.foo_id'
from user_tab_columns
where table_name in ('FOO','BAR')
;
create or replace view my_view as
select FOO.ID as "FOO.ID", FOO.A as "FOO.A", FOO.B as "FOO.B", FOO.C as "FOO.C"
, BAR.FOO_ID as "BAR.FOO_ID", BAR.A as "BAR.A"
, BAR.B as "BAR.B", BAR.C as "BAR.C"
from foo f
join bar b on f.id = b.foo_id