sql >> Databasteknik >  >> RDS >> Oracle

Hämta tabellstruktur med dynamisk SQL

Du måste bestämma om du vill använda data_length eller data_precision baserat på data_type , vilket du kan göra med ett kasusuttryck:

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
/

Om jag skapar den tabellen som:

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

då producerar den frågan:

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

I det här exemplet har jag representerat ett tal som precision .skala , men du kanske inte har vågar att oroa dig för, eller kanske vill hantera dem annorlunda - beror på hur resultatet kommer att användas. Och jag har inkluderat ett tomt fält för datatyperna utan storlek, t.ex. CLOB och DATUM.

Observera också att tidsstämplar (och intervall) inkluderar precisionen i själva datatypen, så timestamp(3) kommer direkt från den kolumnens data_type . Tidsstämplar med tidszoner och intervall inkluderar även mellanslag i datatypens namn.

Så det här är en utgångspunkt, och du kan utöka den till andra datatyper som du behöver hantera på specifika sätt, eller (säg) dela upp tidsstämpelprecisionen i ett separat kommaseparerat fält.




  1. Få Age från DOB i MySQL

  2. to_char(nummer) funktion i postgres

  3. MySQL - Hur begränsar man ett resultat per ID?

  4. Beställ resultat från Mysql-gruppen av