Oracle
 sql >> Base de données >  >> RDS >> Oracle

Renvoyer les noms de colonne Oracle au format table.column ?

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')
        ;

Cette requête renvoie :

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