sql >> Databáze >  >> RDS >> Oracle

Načítání struktury tabulky pomocí dynamického SQL

Musíte se rozhodnout, zda použít data_length nebo data_precision na základě data_type , což můžete provést pomocí výrazu typu case:

select listagg(column_name ||','|| data_type ||','||
  case 
    when data_type in ('VARCHAR2', 'NVARCHAR2', 'CHAR', 'RAW')
      then to_char(data_length)
    when data_type = 'NUMBER'
        and (data_precision is not null or data_scale is not null)
      then data_precision || case
        when data_scale > 0 then '.' || data_scale
      end
    end, ',') within group (order by column_id)
from all_tab_columns
where table_name = 'MYTABLENAME'
and owner = user -- if it is always current user, use user_tab_columns instead
/

Pokud tuto tabulku vytvořím jako:

create table mytablename (col1 varchar2(20), col2 number(2), col3 char(3), col4 date,
  col5 timestamp(3), col6 clob, col7 number(5,2));

pak tento dotaz vytvoří:

COL1,VARCHAR2,20,COL2,NUMBER,2,COL3,CHAR,3,COL4,DATE,,COL5,TIMESTAMP(3),,COL6,CLOB,,COL7,NUMBER,5.2

V tomto příkladu jsem reprezentoval číslo jako přesnost .měřítko , ale možná se nemusíte bát váhy, nebo s nimi možná budete chtít zacházet jinak – záleží na tom, jak bude výsledek použit. A zahrnul jsem prázdné pole pro datové typy bez velikosti, např. CLOB a DATE.

Všimněte si také, že časová razítka (a intervaly) zahrnují přesnost v samotném datovém typu, takže timestamp(3) pochází přímo z data_type daného sloupce . Časová razítka s časovými pásmy a intervaly také obsahují mezery v názvu datového typu.

Toto je tedy výchozí bod a můžete jej rozšířit na další datové typy, které potřebujete zpracovat konkrétními způsoby, nebo (řekněme) rozdělit přesnost časového razítka do samostatného pole odděleného čárkou.




  1. Úspora 30-února na Mysql (formátování data)

  2. MySQL - Použití COUNT(*) v klauzuli WHERE

  3. INSERT v jediném dotazu do 2 tabulek postgresql

  4. existuje alternativa k použití cyklu for pro vložení více dotazů