2010-05-06 4 views
49

Je voudrais récupérer tous les noms de table d'un schéma de base de données, et, si possible, obtenir toute table commençant par un préfixe spécifié.Comment obtenir tous les noms de tables d'une base de données?

J'ai essayé d'utiliser connection.getMetaData().getTables() de JDBC mais cela n'a pas fonctionné du tout.

Connection jdbcConnection = DriverManager.getConnection("", "", ""); 
DatabaseMetaData m = jdbcConnection.getMetaData(); 
ResultSet tables = m.getTables(jdbcConnection.getCatalog(), null, "TAB_%", null); 
for (int i = 0; i < tables.getMetaData().getColumnCount(); i++) { 
    System.out.println("table = " + tables.getMetaData().getTableName(i)); 
} 

Quelqu'un pourrait-il m'aider?

Répondre

101

Vous devez effectuer une itération sur votre appel ResultSet next().

Voici un exemple de java2s.com:

DatabaseMetaData md = conn.getMetaData(); 
ResultSet rs = md.getTables(null, null, "%", null); 
while (rs.next()) { 
    System.out.println(rs.getString(3)); 
} 

Colonne est le TABLE_NAME (voir la documentation de DatabaseMetaData::getTables).

+0

Merci! vous avez fait ma journée :) –

+2

Si cela échoue pour vous (comme il m'a fait), vous devez vous assurer que l'utilisateur de la base de données peut réellement afficher des tables sur la base de données. –

+1

Affiche toutes les tables de toutes les bases de données. Vous pouvez passer le nom de la base de données en tant que premier paramètre pour afficher les tables uniquement dans cette base de données. – Mahdi

4

Si vous souhaitez utiliser une API de haut niveau, qui cache beaucoup de la complexité JDBC dans les métadonnées de schéma de base de données, jetez un oeil à cet article: http://www.devx.com/Java/Article/32443/1954

26
public void getDatabaseMetaData() 
    { 
     try { 

      DatabaseMetaData dbmd = conn.getMetaData(); 
      String[] types = {"TABLE"}; 
      ResultSet rs = dbmd.getTables(null, null, "%", types); 
      while (rs.next()) { 
       System.out.println(rs.getString("TABLE_NAME")); 
      } 
     } 
      catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 
+0

Affiche toutes les tables de toutes les bases de données. Vous pouvez passer le nom de la base de données en tant que premier paramètre pour afficher les tables uniquement dans cette base de données. – Mahdi

4

Dans votre exemple de problème est table passée modèle de nom dans la fonction getTables de DatabaseMetaData.

Certaines bases de données prennent en charge l'identificateur en majuscules, d'autres prennent en charge les identificateurs en minuscules. Par exemple, Oracle récupère le nom de la table en majuscules, alors que PostgreSQL le récupère en minuscules.

DatabaseMetaDeta fournit une méthode pour déterminer comment la base de données des identifiants de magasins, peuvent être mélangés cas, majuscules, voir minuscules: http://docs.oracle.com/javase/7/docs/api/java/sql/DatabaseMetaData.html#storesMixedCaseIdentifiers()

De exemple ci-dessous, vous pouvez obtenir toutes les tables et la vue de fournir un modèle de nom de table, si vous veulent seulement des tables puis suppriment "VIEW" du tableau TYPES.

public class DBUtility { 
    private static final String[] TYPES = {"TABLE", "VIEW"}; 
    public static void getTableMetadata(Connection jdbcConnection, String tableNamePattern, String schema, String catalog, boolean isQuoted) throws HibernateException { 
      try { 
       DatabaseMetaData meta = jdbcConnection.getMetaData(); 
       ResultSet rs = null; 
       try { 
        if ((isQuoted && meta.storesMixedCaseQuotedIdentifiers())) { 
         rs = meta.getTables(catalog, schema, tableNamePattern, TYPES); 
        } else if ((isQuoted && meta.storesUpperCaseQuotedIdentifiers()) 
         || (!isQuoted && meta.storesUpperCaseIdentifiers())) { 
         rs = meta.getTables(
           StringHelper.toUpperCase(catalog), 
           StringHelper.toUpperCase(schema), 
           StringHelper.toUpperCase(tableNamePattern), 
           TYPES 
          ); 
        } 
        else if ((isQuoted && meta.storesLowerCaseQuotedIdentifiers()) 
          || (!isQuoted && meta.storesLowerCaseIdentifiers())) { 
         rs = meta.getTables( 
           StringHelper.toLowerCase(catalog), 
           StringHelper.toLowerCase(schema), 
           StringHelper.toLowerCase(tableNamePattern), 
           TYPES 
          ); 
        } 
        else { 
         rs = meta.getTables(catalog, schema, tableNamePattern, TYPES); 
        } 

        while (rs.next()) { 
         String tableName = rs.getString("TABLE_NAME"); 
         System.out.println("table = " + tableName); 
        } 



       } 
       finally { 
        if (rs!=null) rs.close(); 
       } 
      } 
      catch (SQLException sqlException) { 
       // TODO 
       sqlException.printStackTrace(); 
      } 

    } 

    public static void main(String[] args) { 
     Connection jdbcConnection; 
     try { 
      jdbcConnection = DriverManager.getConnection("", "", ""); 
      getTableMetadata(jdbcConnection, "tbl%", null, null, false); 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 
1
public static ArrayList<String> getTablesList(Connection conn) 
      throws SQLException { 

     ArrayList<String> listofTable = new ArrayList<String>(); 

     DatabaseMetaData md = conn.getMetaData(); 

     ResultSet rs = md.getTables(null, null, "%", null); 

     while (rs.next()) { 
      if (rs.getString(4).equalsIgnoreCase("TABLE")) { 
       listofTable.add(rs.getString(3)); 
      } 
     } 
     return listofTable; 
    } 
Questions connexes