テーブルやビューのカタログ情報を取得しようとしているだけの場合は、mustaccioの別の回答に記載されているように、システムカタログは正常に動作します。しかしRPGまたはCOBOLプログラムにDESCRIBE TABLE
を埋め込みたい場合は、同様に動作します。動的な列数がある場合、またはコンパイル時にテーブル名がわからない場合は、これを実行する必要がある理由の1つです。プログラム内のFETCH
文の出力を受け取るために、表またはカーソルを記述して作成されたSQL記述子を使用できます。テーブルの説明を受け取るには、SQL Descriptor
またはSQLDA
が必要です。これは次のようになります。
これは、指定されたディスクリプタにテーブルに関する情報を取得します。この場合D1
。記述子の名前にはホスト変数を使用できます。この例では、20項目の記述子をlocal
に割り当てます。テーブルの列数が20を超える場合は、ALLOCATE DESCRIPTOR
ステートメントでより大きな記述子を要求できます。複数のモジュール間で指定された記述子を使用するsqlを広げる場合は、'D1'
をglobal 'D1'
に置き換えてグローバル記述子を使用する必要があります。またSQLDA
を使用することもできますが、それらを扱うのが難しくなることがあります。
ディスクリプタから情報を取得するには、GET DESCRIPTOR
を使用します。それはあなたが記述から抜け出すことができるもののすべての詳細に移動するには、このサイトの範囲を超えるだろうが、一例として、あなたはこのようなMYTABLE
の最初の列の列名を取得することができます:
dcl-s columnName Varchar(128) Inz('');
exec sql
get sql descriptor 'D1'
value 1 :columnName = name;
ディスクリプタを使用しているときにディスクリプタの割り当てを解除することを忘れないでください。
exec sql deallocate sql descriptor 'D1';
あなたはここにDESCRIBE TABLE
https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_71/db2/rbafzdescrtb.htmに関する詳細な情報を見つけることができます。知識センターには、ALLOCATE DESCRIPTOR
,DEALLOCATE DESCRIPTOR
、およびGET DESCRIPTOR
に関する情報もあります。
これはメインフレームのDB2(AS400?)ですか? Afaik DESCRIBEはUDBでのみ動作します... – dnoeth
私はわかりません。メインフレームのDB2でない場合は、テーブルのメタデータを取得する方法は?それがメインフレームのDB2かどうかを知る方法は? –
'SYSIBM.SYSCOLUMNS'を使用していますか? – dnoeth