sql >> データベース >  >> RDS >> Oracle

動的SQLを使用したテーブル構造の取得

    data_lengthを使用するかどうかを決定する必要があります またはdata_precision data_typeに基づく 、ケース式で実行できます:

    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とDATE。

    また、タイムスタンプ(および間隔)にはデータ型自体の精度が含まれているため、timestamp(3) その列のdata_typeから直接取得されます 。タイムゾーンと間隔のあるタイムスタンプでも、データ型名にスペースが含まれています。

    したがって、これは出発点であり、特定の方法で処理する必要がある他のデータ型に拡張したり、(たとえば)タイムスタンプの精度を個別のカンマ区切りフィールドに分割したりできます。




    1. SQLServerで制約の名前を見つける方法

    2. PostgreSQLのpggemをUbuntuにインストールするにはどうすればよいですか?

    3. 手順バッファオーバーフロー

    4. Laravel 5.5は、ConsoleTVのチャートパッケージを使用して動的チャートをレンダリングできません