Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Zwrócić nazwy kolumn Oracle w formacie table.column?

W Oracle nie ma takiej opcji; możesz być w stanie znaleźć klienta, który pozwoli ci to zrobić, ponieważ jest to praca, która normalnie byłaby wykonywana u klienta; Nie znam jednego.

Aby rozwinąć odpowiedź tbone będziesz musiał to robić dynamicznie. To nie oznacza, że ​​musisz wymienić każdą kolumnę. Możesz użyć słownika danych , w szczególności all_tab_columns lub user_tab_columns aby utworzyć zapytanie. Łatwiej byłoby utworzyć widok z dokładną definicją, którą chcesz, aby móc go ponownie użyć, jeśli chcesz.

Celem jest wykorzystanie faktu, że istnienie kolumn jest przechowywane w tabeli jako ciąg znaków w celu utworzenia zapytania do użycia tej kolumny. Ponieważ nazwy kolumn i nazwy tabel są przechowywane jako ciągi, można użyć technik agregacji ciągów, aby łatwo utworzyć zapytanie lub instrukcję DDL, którą można następnie wykonać ręcznie lub dynamicznie.

Jeśli używasz Oracle 11g Release 2, listagg funkcja jest dostępna, aby Ci pomóc:

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

Zakładając taką strukturę tabeli:

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

To pojedyncze zapytanie daje następujące wyniki:

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

a oto SQL Fiddle aby to udowodnić.

Jeśli nie używasz 11.2 możesz osiągnąć dokładnie te same wyniki używając nieudokumentowanej funkcji wm_concat lub funkcja zdefiniowana przez użytkownika stragg , który został stworzony przez Toma Kyte. Oracle Base ma artykuł na temat technik agregacji ciągów i jest wiele postów na Stack Overflow.

Jako mały dodatek, możesz stworzyć dokładnie to, czego szukasz, z niewielką zmianą w powyższym zapytaniu. Możesz użyć identyfikatora cytowanego aby utworzyć kolumnę w TABLE_NAME.COLUMN_NAME format. masz zacytować go jako . nie jest poprawnym znakiem dla nazwy obiektu w Oracle. Zaletą tego jest to, że zyskujesz dokładnie to, czego chcesz. Minusem jest to, że odpytywanie utworzonego widoku jest ogromnym problemem, jeśli nie używasz wybierz * z ...; wybranie nazwanych kolumn wymaga należy je zacytować.

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

To zapytanie zwraca :

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Programista procedur składowanych — SQL

  2. problem z zegarem w formie wyroczni

  3. Jak używać LITAGG do zwracania wierszy poprzedzonych cudzysłowami

  4. Jak złapać unikalny błąd ograniczenia w bloku PL/SQL?

  5. UTWÓRZ procedurę Oracle