2010-05-06 14 views
49

Chciałbym pobrać wszystkie nazwy tabel ze schematu bazy danych i, jeśli to możliwe, uzyskać wszystkie tabele zaczynające się od określonego prefiksu.Jak uzyskać wszystkie nazwy tabel z bazy danych?

Próbowałem używać JDBC's connection.getMetaData().getTables(), ale nie działało w ogóle.

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)); 
} 

Czy ktoś może mi w tym pomóc?

Odpowiedz

101

Musisz wykonać iterację zestawu wyników, dzwoniąc pod numer next().

Jest to przykład z java2s.com:

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

Kolumna jest TABLE_NAME (patrz dokumentacji DatabaseMetaData::getTables).

+0

Dzięki! Zrobiłeś mój dzień :) –

+2

Jeśli to ci się nie uda (tak jak mnie) musisz upewnić się, że użytkownik bazy danych rzeczywiście pokazuje tabele w bazie danych. –

+1

Pokazuje wszystkie tabele we wszystkich bazach danych. Nazwę bazy danych można przekazać jako pierwszy parametr, aby wyświetlić tylko tabele w tej bazie danych. – Mahdi

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

Pokazuje wszystkie tabele we wszystkich bazach danych. Nazwę bazy danych można przekazać jako pierwszy parametr, aby wyświetlić tylko tabele w tej bazie danych. – Mahdi

4

W przykładzie problemu przepuszcza tabeli wzorzec nazwy w funkcji getTables DatabaseMetaData.

Niektóre bazy danych obsługują wielkie litery, niektóre obsługują małe litery. Na przykład oracle pobiera wielką nazwę tabeli, podczas gdy postgreSQL pobiera ją małymi literami.

DatabaseMetaDeta zapewnia sposób, aby określić jak identyfikatory przechowuje baz danych, mogą być mieszane litery, wielkie litery, małe litery patrz: http://docs.oracle.com/javase/7/docs/api/java/sql/DatabaseMetaData.html#storesMixedCaseIdentifiers()

Od poniżej przykładzie, można uzyskać wszystkie tabele i widok zapewniając nazwa tabeli wzór, jeśli ciebie chcesz tylko tabele, a następnie usuń "WIDOK" z tablicy 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; 
    } 
Powiązane problemy