Использование DatabaseMetaData.getMetaData отвечает на базовые представления all_objects, all_tab_comments и all_synonyms.Эти представления принимают во внимание то, что предоставлено для доступа.
SELECT_CATALOG_ROLE предоставляет доступ к каталогу, который позволил бы запрашивать dba_objects.
Для выполнения того, что запрашивается, зеркальный API Java для DatabaseMetaData.getMetaData() .getTables (..) может быть легко написана для использования представлений dba_xyz.Что-то вроде этого.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import oracle.jdbc.OracleConnection;
import oracle.jdbc.OracleDatabaseMetaData;
public class MyMetaData extends OracleDatabaseMetaData {
public MyMetaData(Connection conn) {
super((OracleConnection) conn);
}
public synchronized ResultSet getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types) throws SQLException {
// catalog isn't used
// dba view based sql
String sql = "SELECT NULL AS table_cat,"+
" o.owner AS table_schem,\n "+
" o.object_name AS table_name,\n "+
" o.object_type AS table_type,\n"+
" c.comments AS remarks\n" +
" FROM dba_objects o, dba_tab_comments c\n"+
" WHERE o.owner LIKE :1 ESCAPE '/'\n "+
" AND o.object_name LIKE :2 ESCAPE '/'\n"+
" AND o.owner = c.owner (+)\n "+
" AND o.object_name = c.table_name (+)\n";
// bind params
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, schemaPattern == null ? "%" : schemaPattern);
stmt.setString(2, tableNamePattern == null ? "%" : tableNamePattern);
return stmt.executeQuery();
}
public static void main(String[] args) throws SQLException {
String conString = "jdbc:oracle:thin:@//localhost:1521/xe";
Properties props = new Properties();
props.setProperty("user", "klrice");
props.setProperty("password", "klrice");
Connection conn = DriverManager.getConnection(conString, props);
// use this class
MyMetaData md = new MyMetaData(conn);
// test it out
ResultSet rset = md.getTables(null, "ORDS_METADATA", null, null);
while (rset.next()) {
System.out.println(rset.getString(2));
}
}
}