sql >> Base de Datos >  >> RDS >> Oracle

¿Devuelve los nombres de las columnas de Oracle en formato table.column?

No hay "opción" en Oracle para hacer esto; usted puede ser capaz de encontrar un cliente que le permita hacerlo, ya que este es un trabajo que normalmente se haría en el cliente; no conozco uno

Para ampliar respuesta de tbone vas a tener que hacer esto dinámicamente. Esto no significa que tienes que listar cada columna. Usaría el diccionario de datos , específicamente all_tab_columns o user_tab_columns para crear tu consulta. Sería más fácil crear una vista con la definición exacta que desea para que pueda reutilizarla si lo desea.

El objetivo es usar el hecho de que la existencia de las columnas se almacena en una tabla como una cadena para crear una consulta para usar esa columna. Como los nombres de las columnas y las tablas se almacenan como cadenas, puede usar técnicas de agregación de cadenas para crear fácilmente una consulta o declaración DDL que luego puede ejecutar de forma manual o dinámica.

Si utiliza Oracle 11g versión 2, listagg La función está disponible para ayudarte:

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

Asumiendo esta estructura de tabla:

create table foo ( id number, a number, b number, c number);
create table bar ( foo_id number, a number, b number, c number);

Esta única consulta produce lo siguiente:

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

y aquí hay un SQL Fiddle para demostrarlo.

Si no está usando 11.2, puede lograr exactamente los mismos resultados usando la función no documentada wm_concat o la función definida por el usuario stragg , que fue creado por Tom Kyte. Oracle Base tiene un artículo sobre técnicas de agregación de cadenas y hay muchas publicaciones en Stack Overflow.

Como un pequeño apéndice, puede crear exactamente lo que está buscando con un pequeño cambio en la consulta anterior. Puede usar un identificador citado para crear una columna en TABLE_NAME.COLUMN_NAME formato. tienes para citarlo como . no es un carácter válido para un nombre de objeto en Oracle. El beneficio de esto es que obtienes exactamente lo que quieres. La desventaja es que consultar la vista creada es una gran molestia si no usa select * from ...; la selección de columnas con nombre requerirá que sean citados.

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

Esta consulta devuelve :

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