2011-06-28 37 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