2011-06-28 11 views
2

JDBCドライバでJavaとDB2のインタフェースをとるプログラムを作成しているときに、特定のデータベース内のすべてのデータ(すべてのテーブルに含まれるすべてのレコード)を取得するプログラムを作成しようとしました。私がプログラムを実行したとき、私はそれがほとんど働いていることを発見しました。しかし、データを収集していないテーブルがいくつかありました。私はIBMのバンドルされたCommand Editorからこれらのテーブルにアクセスし、それらにデータが含まれていることがわかりました。私は、データベースに対してSYSCAT.COLUMNS WHERE TABNAME = 'テーブル'DB2のテーブル型

FROM

SELECT *を実行し、これらのテーブルはSYSCAT.COLUMNS表に何列レコードを持っていたことがわかりました。私はそのテーブル名をスペルミスと信じて、私は、データベースに対して

SELECT * FROM SYSCAT.COLUMNS

を実行し、手動でTABNAME下の表を探しました。私はそれを見つけることができませんでした。私はSYSCAT.TABLES

FROM

SELECT *を実行したとき、私は可能なテーブルの一覧でテーブルを見つけました。しかし、SYSCAT.TABLESでは、TYPE 'A'の表のどれもがSYSCAT.COLUMNSにレコードを持っていないことがわかりました。私はこれについてのIBMの推論が何であるか、またこれらの特定のタイプのテーブルのフィールド名がどのようになっているかを知ることができたと思っていました。

TL; DR DB2データベースの標準SQLクエリを使用してSYSCAT.COLUMNSを使用せずにDB2の列名を取得する方法を教えてください。

答えて

6

これは、タイプ 'A'のテーブルが別のテーブルの別名であるため意味があります。

'A'タイプのテーブルのカラムを検索する場合は、BASE_TABSCHEMAカラムとBASE_TABNAMEカラムを参照して、エイリアスが参照しているスキーマとテーブルの名前を見つけます。あなたがそのテーブルを参照すると、それはsyscolumnsになります。あなたのクエリをこのように書き換える必要がありますつまり

SELECT * FROM SYSCAT.COLUMNS WHERE TABNAME= 
(SELECT BASE_TABNAME FROM SYSCAT.TABLES WHERE TABNAME = 'Table') 

ところで、DB2のドキュメントでは、システムカタログへの完全なリファレンスが含まれています。それはhereです。

関連する問題