Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Retornar nomes de colunas Oracle no formato table.column?


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