2010-05-06 15 views
49

Me gustaría recuperar todos los nombres de tabla de un esquema de base de datos, y, si es posible, obtener toda la tabla comenzando con un prefijo especificado.¿Cómo obtener todos los nombres de tabla de una base de datos?

Intenté usar JDBC connection.getMetaData().getTables() pero no funcionó en absoluto.

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

¿Alguien podría ayudarme en esto?

Respuesta

101

Necesita repetir sobre su ResultSet llamando al next().

Este es un ejemplo de java2s.com:

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

Columna es el TABLE_NAME (véase la documentación de DatabaseMetaData::getTables).

+0

Gracias! Hiciste mi día :) –

+2

Si esto falla para ti (como me sucedió a mí), debes asegurarte de que el usuario de la base de datos pueda mostrar tablas en la base de datos. –

+1

Muestra todas las tablas en todas las bases de datos. Puede pasar el nombre de la base de datos como el primer parámetro para mostrar las tablas solo en ese db. – Mahdi

4

Si desea utilizar una API de alto nivel, que esconde una gran cantidad de la complejidad de JDBC alrededor de metadatos esquema de base, echar un vistazo a este artículo: mesa 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

Muestra todas las tablas en todas las bases de datos. Puede pasar el nombre de la base de datos como el primer parámetro para mostrar las tablas solo en ese db. – Mahdi

4

En el problema de ejemplo se pasa patrón de nombre en la función getTables de DatabaseMetaData.

Algunas bases de datos admiten identificador de mayúsculas, algunos admiten identificadores de minúsculas. Por ejemplo, oráculo obtiene el nombre de la tabla en mayúsculas, mientras que postgreSQL lo busca en minúsculas.

DatabaseMetaDeta proporciona un método para determinar cómo los identificadores de base de datos almacena, se pueden mezclar caso, en mayúsculas, consulte minúsculas: http://docs.oracle.com/javase/7/docs/api/java/sql/DatabaseMetaData.html#storesMixedCaseIdentifiers()

Desde abajo ejemplo, usted puede conseguir todas las tablas y vistas de proporcionar patrón de nombre de la tabla, si solo quiere tablas y luego elimina "VIEW" de la matriz 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; 
    } 
Cuestiones relacionadas