2011-06-28 52 views
2

在編寫一個通過JDBC驅動程序連接Java和DB2的程序時,我試圖編寫一個程序來檢索給定數據庫中的所有數據(包含在所有表中的所有記錄)。當我運行程序時,我發現它大部分工作。但是,有幾張表格沒有收集數據。我從IBM捆綁的Command Editor訪問這些表,發現它們包含數據。我跑DB2中的表類型

SELECT * FROM SYSCAT.COLUMNS其中tabname = '表'

針對數據庫後發現,這些表曾在SYSCAT.COLUMNS表中沒有列的記錄。相信我拼錯了表名,我跑

SELECT * FROM SYSCAT.COLUMNS

針對數據庫和手動看着桌子底下TABNAME。我找不到。當我跑

SELECT * FROM SYSCAT.TABLES

我發現表中可用表的列表。但是,在SYSCAT.TABLES中,我還發現沒有任何類型'A'的表在SYSCAT.COLUMNS中有任何記錄。我在想,IBM的推理是什麼,以及我如何才能找出這些特定類型的表的字段名稱。

TL; DR如何在不使用SYSCAT.COLUMNS的情況下通過對DB2數據庫的標準SQL查詢獲取DB2的列名?

回答

6

這很有意義,因爲'A'類型的表是另一個表的別名。

如果要查找類型爲'A'的表的列,請查看BASE_TABSCHEMA和BASE_TABNAME列以查找別名所引用的模式和表的名稱。如果您查看該表,它將在syscolumns中。

換句話說,你應該重寫你的查詢是這樣的:

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

BTW,DB2文檔包含一個完整的參考系統目錄。這是here