V Oracle neexistuje žádná "možnost" to udělat; můžete umět najít klienta, který vám to umožní, protože se jedná o práci, která by se normálně dělala u klienta; Nevím o žádném.
Chcete-li rozšířit odpověď tbone
budete to muset dělat dynamicky. Toto není znamená, že musíte vypsat každý sloupec. Použili byste datový slovník
, konkrétně all_tab_columns
nebo user_tab_columns
k vytvoření vašeho dotazu. Bylo by jednodušší vytvořit pohled s přesnou definicí, kterou chcete, abyste jej mohli znovu použít, pokud chcete.
Cílem je využít skutečnosti, že existence sloupců je uložena v tabulce jako řetězec, k vytvoření dotazu pro použití daného sloupce. Protože jsou názvy sloupců a tabulky uloženy jako řetězce, můžete použít techniky agregace řetězců ke snadnému vytvoření dotazu nebo příkazu DDL, které pak můžete ručně nebo dynamicky spustit.
Pokud používáte Oracle 11g Release 2, listagg
je k dispozici funkce, která vám pomůže:
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')
;
Za předpokladu této struktury tabulky:
create table foo ( id number, a number, b number, c number);
create table bar ( foo_id number, a number, b number, c number);
Tento jediný dotaz vytvoří následující:
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 zde je SQL Fiddle abych to dokázal.
V nepoužíváte 11.2 můžete dosáhnout přesně stejných výsledků pomocí nezdokumentované funkce wm_concat
nebo uživatelem definovaná funkce stragg
, kterou vytvořil Tom Kyte. Oracle Base má článek o technikách agregace řetězců
a na Stack Overflow je mnoho příspěvků.
Jako malý doplněk můžete vytvořit přesně to, co hledáte, s malou změnou výše uvedeného dotazu. Můžete použít uvedený identifikátor
k vytvoření sloupce v TABLE_NAME.COLUMN_NAME
formát. máte citovat jej jako .
není platný znak pro název objektu v Oracle. Výhodou je, že získáte přesně to, co chcete. Nevýhodou je, že dotazování na vytvořený pohled je obrovská bolest, pokud nepoužijete select * from ...
; výběr pojmenovaných sloupců bude vyžadovat mají být citovány.
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