web-dev-qa-db-ja.com

Informix SQL-すべてのフィールドとテーブルをリストする

Informix iSQLにはコマンド「info tables; "すべてのテーブルを表示します。
フィールドとそれぞれのデータ型を表示するための構文は「info columns for table; "

すべてのテーブルとすべてのフィールドのtable.fieldを表示する同様のコマンドはありますか?

18
CheeseConQueso

優先JOIN表記を使用する:

SELECT TRIM(t.tabname) || '.' || TRIM(c.colname) AS table_dot_column
  FROM "informix".systables  AS t
  JOIN "informix".syscolumns AS c ON t.tabid = c.tabid
 WHERE t.tabtype = 'T'
   AND t.tabid >= 100
 ORDER BY t.tabname, c.colno;

または、昔ながらのjoin-in-where-clause表記:

SELECT TRIM(t.tabname) || '.' || TRIM(c.colname) AS table_dot_column
  FROM "informix".systables AS t, "informix".syscolumns AS c
 WHERE t.tabid = c.tabid
   AND t.tabtype = 'T'
   AND t.tabid >= 100
 ORDER BY t.tabname, c.colno;

十分に新しいバージョンのIDSを使用していると想定すると、選択リストに記載されていない列で並べ替えることができます。クレームが発生した場合は、選択列に順序付けの列を追加します。

結合基準は明白です。 tabtype = 'T'は、systablesにリストされているビュー、シノニム、およびその他のアイテムではなく、テーブルのみをリストします。 tabid> = 100は、データベースで明示的に作成されたテーブルのみをリストし、システムカタログはリストしません。

これにはタイプ情報は含まれません-必要な場合は、もう少し作業を行う必要があります。 XPG4(X/Open標準)情報スキーマの古いバージョン(したがってファイル名)の大まかな近似を含むファイル$INFORMIXDIR/etc/xpg4_is.sqlが見つかります。そこには、型情報をsyscolumns.coltypeおよびsyscolumns.collengthから認識可能な文字列にデコードする関数などがあります。ただし、DISTINCT型や他のユーザー定義型は処理しないと思います。私は間違っていることが証明されてうれしいですが...そのファイルの関連部分をデータベースに追加すると、型情報も取得できるはずです。

また、ISQLとDB-AccessのすべてのINFOコマンドは、IDSサーバーでは実行されず、フロントエンドでシミュレートされることに注意してください。基本的に、プログラムは要求を受け取り、それをより複雑なSQLステートメントに変換します。 SQLCMDプログラムがINFOステートメントを処理する方法については、SQLCMDの一部であるファイルsqlinfo.ecのコード( IIUG Software Archive から入手可能)を参照してください。 (注:SQLCMDのINFO出力のフォーマットは、ISQLおよびDB-AccessのINFO出力とは異なります。)

32

Jonathan Lefferの回答が述べているように、 [〜#〜] syscolumns [〜#〜] のドキュメントに見られるように、列タイプと列の詳細の完全な処理は複雑になります。しかし、より複雑な型を使用していないデータベースを調べている場合、このスクリプトへのこの追加により、基本的な型とNULLが許可されているかどうかが示されます。

SELECT TRIM(t.tabname) || '.' || TRIM(c.colname) AS table_dot_column,
CASE 
  WHEN MOD(coltype,256)=0 THEN 'CHAR' 
  WHEN MOD(coltype,256)=1 THEN 'SMALLINT' 
  WHEN MOD(coltype,256)=2 THEN 'INTEGER' 
  WHEN MOD(coltype,256)=3 THEN 'FLOAT' 
  WHEN MOD(coltype,256)=4 THEN 'SMALLFLOAT' 
  WHEN MOD(coltype,256)=5 THEN 'DECIMAL' 
  WHEN MOD(coltype,256)=6 THEN 'SERIAL' 
  WHEN MOD(coltype,256)=7 THEN 'DATE' 
  WHEN MOD(coltype,256)=8 THEN 'MONEY' 
  WHEN MOD(coltype,256)=9 THEN 'NULL' 
  WHEN MOD(coltype,256)=10 THEN 'DATETIME' 
  WHEN MOD(coltype,256)=11 THEN 'BYTE' 
  WHEN MOD(coltype,256)=12 THEN 'TEXT' 
  WHEN MOD(coltype,256)=13 THEN 'VARCHAR' 
  WHEN MOD(coltype,256)=14 THEN 'INTERVAL' 
  WHEN MOD(coltype,256)=15 THEN 'NCHAR' 
  WHEN MOD(coltype,256)=16 THEN 'NVARCHAR' 
  WHEN MOD(coltype,256)=17 THEN 'INT8' 
  WHEN MOD(coltype,256)=18 THEN 'SERIAL8' 
  WHEN MOD(coltype,256)=19 THEN 'SET' 
  WHEN MOD(coltype,256)=20 THEN 'MULTISET' 
  WHEN MOD(coltype,256)=21 THEN 'LIST' 
  WHEN MOD(coltype,256)=22 THEN 'ROW (unnamed)' 
  WHEN MOD(coltype,256)=23 THEN 'COLLECTION' 
  WHEN MOD(coltype,256)=40 THEN 'LVARCHAR fixed-length opaque types' 
  WHEN MOD(coltype,256)=41 THEN 'BLOB, BOOLEAN, CLOB variable-length opaque types' 
  WHEN MOD(coltype,256)=43 THEN 'LVARCHAR (client-side only)' 
  WHEN MOD(coltype,256)=45 THEN 'BOOLEAN' 
  WHEN MOD(coltype,256)=52 THEN 'BIGINT' 
  WHEN MOD(coltype,256)=53 THEN 'BIGSERIAL' 
  WHEN MOD(coltype,256)=2061 THEN 'IDSSECURITYLABEL'
  WHEN MOD(coltype,256)=4118 THEN 'ROW (named)' 
  ELSE TO_CHAR(coltype)
END AS Type,
BITAND(coltype,256)=256 AS NotNull
  FROM "informix".systables  AS t
  JOIN "informix".syscolumns AS c ON t.tabid = c.tabid
 WHERE t.tabtype = 'T'
   AND t.tabid >= 100
 ORDER BY t.tabname, c.colno;
1

Syscolumnsテーブルを使用します。このような情報は IBM Informix SQLガイド で説明されています。

私は単純なPython InformixOracle および PostgreSQL のスキーマ情報を示すユーティリティを実行しました。これらは便利ですデータベースを比較する必要がある場合。

1
Michał Niklas