2010-05-06 21 views
49

Vorrei recuperare tutti i nomi di tabelle da uno schema di database e, se possibile, ottenere tutte le tabelle che iniziano con un prefisso specificato.Come ottenere tutti i nomi di tabelle da un database?

Ho provato a utilizzare JDBC connection.getMetaData().getTables() ma non ha funzionato affatto.

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

Qualcuno potrebbe aiutarmi in questo?

risposta

101

È necessario eseguire un'iterazione su ResultSet chiamando next().

Questo è un esempio da java2s.com:

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

Colonna è il TABLE_NAME (vedere la documentazione del DatabaseMetaData::getTables).

+0

Grazie! hai fatto il mio giorno :) –

+2

Se questo non funziona come te, devi assicurarti che l'utente del database possa effettivamente mostrare le tabelle sul database. –

+1

Mostra tutte le tabelle in tutti i database. È possibile passare il nome del database come primo parametro per visualizzare solo le tabelle in tale db. – Mahdi

4

Se si desidera utilizzare un API di alto livello, che nasconde un sacco di complessità JDBC intorno metadati schema del database, dare un'occhiata a questo articolo: tavolo 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

Mostra tutte le tabelle in tutti i database. È possibile passare il nome del database come primo parametro per visualizzare solo le tabelle in tale db. – Mahdi

4

Nel tuo esempio problema viene passato nome pattern nella funzione getTables di DatabaseMetaData.

Alcuni database supportano l'identificatore di maiuscole, alcuni supportano identificatori di lettere minuscole. Per esempio oracle recupera il nome della tabella in maiuscolo, mentre postgreSQL lo preleva in minuscolo.

DatabaseMetaDeta fornisce un metodo per determinare come gli archivi di database identificatori, possono essere caso, maiuscolo, vedi minuscolo misti: http://docs.oracle.com/javase/7/docs/api/java/sql/DatabaseMetaData.html#storesMixedCaseIdentifiers()

Da sotto esempio, è possibile ottenere tutte le tabelle e vista di fornire il nome della tabella modello, se si vogliono solo le tabelle e quindi rimuovere "VIEW" dall'array 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; 
    } 
Problemi correlati