Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Abrufen der Tabellenstruktur mit dynamischem SQL

Sie müssen entscheiden, ob Sie data_length verwenden möchten oder data_precision basierend auf dem data_type , was Sie mit einem case-Ausdruck tun können:

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
/

Wenn ich diese Tabelle erstelle als:

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

dann erzeugt diese Abfrage:

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

In diesem Beispiel habe ich eine Zahl als Genauigkeit dargestellt .Skala , aber Sie haben möglicherweise keine Skalen, um die Sie sich Sorgen machen müssen, oder möchten sie anders handhaben - hängt davon ab, wie das Ergebnis verwendet wird. Und ich habe ein leeres Feld für die Datentypen ohne Größe eingefügt, z. CLOB und DATUM.

Beachten Sie auch, dass Zeitstempel (und Intervalle) die Genauigkeit im Datentyp selbst enthalten, also timestamp(3) kommt direkt aus dem data_type dieser Spalte . Zeitstempel mit Zeitzonen und Intervallen enthalten auch Leerzeichen im Datentypnamen.

Dies ist also ein Ausgangspunkt und Sie können ihn auf andere Datentypen erweitern, die Sie auf bestimmte Weise verarbeiten müssen, oder (sagen wir) die Zeitstempelpräzision in ein separates, durch Kommas getrenntes Feld aufteilen.