DatabaseMetaData.getTables()メソッドを使用してすべてのdbテーブルを取得しようとしています。ただし、この方法ではデータベーススキーマ名のパターンが必要です。現在のデータベース接続のスキーマ名を取得することは可能ですか?
5 に答える
現在の接続の標準スキーマは、ログインに使用するユーザーの名前です。したがって、ユーザーがであるSCOTT
場合は、を使用する必要がSCOTT
ありますDatabaseMetaData.getTables()
。
ユーザー名は。から取得できますDatabaseMetaData.getUserName()
。
ただし、JDBCドライバーで行われるスキーマ/ユーザー名の比較は大文字と小文字が区別され、通常はユーザー名は大文字であることに注意してください。
DatabaseMetaData.getUserName()
すべての状況で正しいケースで名前が返されるかどうかは100%わかりません。確かに、その値を使用する前に、upperCase()を実行することをお勧めします。
getCatalogs()で遊んでみてください。これはクイックドラフトです
public List<String> getDatabases(DBEnv dbEnv) {
Connection conn = getConnection(dbEnv);
List<String> resultSet = new ArrayList<String>();
try {
DatabaseMetaData metaData = conn.getMetaData();
ResultSet res = metaData.getCatalogs();
while (res.next()) {
resultSet.add(res.getString("TABLE_CAT"));
}
} catch (SQLException e) {
logger.error(e.toString());
}
return resultSet;
}
Java 7以降Connection
、getSchema
メソッドがあります:https ://docs.oracle.com/javase/8/docs/api/java/sql/Connection.html#getSchema--
残念ながら、その答えは一貫した解決策がないということです。JohnがSally.Tableにアクセスできる場合...クエリは機能しますが、getUserName()はSallyスキーマではなくJohnを返します。Oracleの場合、ユーザーは自分のスキーマを所有し、他のユーザーがアクセスできる場合もありますが、そのユーザーIDがその接続のデフォルトのスキーマです。
さらに、getSchemaName()もgetCatalog()もスキーマ名を返しません。
@horse_with_no_nameは、示されているようにオブジェクト参照でオーバーライドされない限り、指定されたユーザー名が(デフォルトの)スキーマ名であるため、Oracleに最も近い答えを持っています。
他のデータベースの場合、同じルールが一貫して適用されるわけではありません。
スキーマ名は次を使用して取得できます
Connection conn =
DriverManager.getConnection("jdbc:oracle:thin:@server:port:SID",prop);
DatabaseMetaData databaseMetaData = conn.getMetaData();
System.out.println("schema name >>>> "+databaseMetaData.getUserName());