2011-06-28 2 views
2

Lors de l'écriture d'un programme qui interface Java et DB2 via le pilote JDBC, j'ai tenté d'écrire un programme qui récupérait toutes les données (tous les enregistrements contenus dans toutes les tables) dans une base de données donnée. Lorsque j'ai lancé le programme, j'ai constaté que cela fonctionnait surtout. Cependant, il y avait plusieurs tables dont il n'a pas collecté de données. J'ai accédé à ces tables à partir de l'éditeur de commandes fourni par IBM et j'ai constaté qu'elles contenaient des données. J'ai couruTypes de tables dans DB2

SELECT * FROM SYSCAT.COLUMNS OÙ TABNAME = 'Table'

contre la base de données et a constaté que ces tables avaient aucune trace de colonne dans la table SYSCAT.COLUMNS. Croire que je mal orthographiés nom de la table, j'ai couru

SELECT * FROM SYSCAT.COLUMNS

contre la base de données et regardé manuellement la table sous TABNAME. Je ne pouvais pas le trouver. Quand je courais

SELECT * FROM SYSCAT.TABLES

J'ai trouvé la table dans la liste des tables disponibles. Cependant, dans SYSCAT.TABLES, j'ai également trouvé qu'aucune table de TYPE 'A' n'avait d'enregistrements dans SYSCAT.COLUMNS. Je me demandais quel était le raisonnement d'IBM et comment je pouvais savoir quels étaient les noms de champs pour ces types particuliers de tables. Comment puis-je obtenir des noms de colonnes pour DB2 sans utiliser SYSCAT.COLUMNS via une requête SQL standard à une base de données DB2?

Répondre

6

Cela est logique car les tables de type 'A' sont un alias à une autre table.

Si vous souhaitez rechercher les colonnes d'une table de type 'A', recherchez dans les colonnes BASE_TABSCHEMA et BASE_TABNAME le nom du schéma et de la table référencés par l'alias. Si vous regardez cette table, elle sera dans syscolumns.

En d'autres termes, vous devez réécrire votre requête ainsi:

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

BTW, la documentation DB2 contient une référence complète au catalogue du système. C'est here.