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