sql >> Database teknologi >  >> RDS >> Oracle

Hentning af tabelstruktur med dynamisk SQL

Du skal beslutte, om du vil bruge data_length eller data_precision baseret på data_type , hvilket du kan gøre med et kasusudtryk:

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
/

Hvis jeg opretter den tabel som:

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

så producerer den forespørgsel:

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

I dette eksempel har jeg repræsenteret et tal som præcision .skala , men du har måske ikke vægte at bekymre dig om, eller vil måske håndtere dem anderledes - afhænger af, hvordan resultatet vil blive brugt. Og jeg har inkluderet et tomt felt for datatyperne uden størrelse, f.eks. CLOB og DATO.

Bemærk også, at tidsstempler (og intervaller) inkluderer præcisionen i selve datatypen, så timestamp(3) kommer direkte fra kolonnens data_type . Tidsstempler med tidszoner og intervaller inkluderer også mellemrum i datatypenavnet.

Så dette er et udgangspunkt, og du kan udvide det til andre datatyper, du skal håndtere på bestemte måder, eller (f.eks.) dele tidsstemplets præcision ud i et separat kommasepareret felt.




  1. OracleCommand SQL Parameter Binding

  2. Rediger kontrolfilen i Oracle 10g Release 2

  3. Sikker måde at sende mail via PHP til mange brugere

  4. php mysql sammenligne long og lat, returnere under 10 miles