Não há "opção" no Oracle para fazer isso; você pode ser capaz de encontrar um cliente que lhe permita fazê-lo, pois este é um trabalho que normalmente seria feito no cliente; Eu não sei de um.
Para expandir a resposta do tbone você terá que fazer isso dinamicamente. Isso não significa que você tem que listar todas as colunas. Você usaria o dicionário de dados , especificamente all_tab_columns ou
user_tab_columns
para criar sua consulta. Seria mais fácil criar uma visão com a definição exata que você deseja para que você possa reutilizá-la se quiser. O objetivo é usar o fato de que a existência das colunas é armazenada em uma tabela como uma string para criar uma consulta para usar essa coluna. Como os nomes das colunas e das tabelas são armazenados como strings, você pode usar técnicas de agregação de strings para criar facilmente uma consulta ou instrução DDL que pode ser executada manualmente ou dinamicamente.
Se você estiver usando o Oracle 11g Release 2, o
listagg
função está disponível para ajudá-lo: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')
;
Assumindo esta estrutura de tabela:
create table foo ( id number, a number, b number, c number);
create table bar ( foo_id number, a number, b number, c number);
Essa única consulta produz o seguinte:
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
e aqui está um SQL Fiddle Para o provar.
Se você não estiver usando o 11.2, poderá obter exatamente os mesmos resultados usando a função não documentada
wm_concat
ou a função definida pelo usuário stragg
, que foi criado por Tom Kyte. O Oracle Base tem um artigo sobre técnicas de agregação de strings
e há muitos posts no Stack Overflow. Como um pequeno adendo, você pode realmente criar exatamente o que está procurando com uma pequena alteração na consulta acima. Você pode usar um identificador entre aspas para criar uma coluna em
TABLE_NAME.COLUMN_NAME
formato. Você tem para citá-lo como .
não é um caractere válido para um nome de objeto no Oracle. A vantagem disso é que você ganha exatamente o que deseja. A desvantagem é que consultar a visualização criada é uma grande dor se você não usar select * from ...
; selecionar colunas nomeadas exigirá que sejam 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 retorna :
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