Oracle
 sql >> база данни >  >> RDS >> Oracle

Извличане на структура на таблица с динамичен SQL

Трябва да решите дали да използвате data_length или data_precision въз основа на data_type , което можете да направите с 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
/

Ако създам тази таблица като:

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

тогава тази заявка произвежда:

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

В този пример съм представил число като прецизност .мащаб , но може да нямате везни, за които да се притеснявате, или може да искате да се справите с тях по различен начин - зависи как ще се използва резултатът. И включих празно поле за типовете данни без размер, напр. CLOB и ДАТА.

Също така имайте предвид, че клеймата за време (и интервали) включват точността в самия тип данни, така че timestamp(3) идва директно от data_type на тази колона . Времевите клейма с часови зони и интервали също включват интервали в името на типа данни.

Така че това е отправна точка и можете да я разширите до други типове данни, които трябва да обработвате по специфични начини, или (да речем) да разделите точността на клеймото за време в отделно поле, разделено със запетая.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Нуждаете се от помощ за изпълнение на заявка за незабавно актуализиране

  2. Тип таблица в Пример за съхранявана процедура на Oracle

  3. ORA-01704:твърде дълъг низов литерал „Грешка при вмъкване на XML документ в тип колона на Oracle XMLTYPE“

  4. Проста рекурсивна заявка в Oracle

  5. На колко езика Null не е равно на нищо дори не на Null?