8

DatabaseMetaData.getTables()メソッドを使用してすべてのdbテーブルを取得しようとしています。ただし、この方法ではデータベーススキーマ名のパターンが必要です。現在のデータベース接続のスキーマ名を取得することは可能ですか?

4

5 に答える 5

9

現在の接続の標準スキーマは、ログインに使用するユーザーの名前です。したがって、ユーザーがであるSCOTT場合は、を使用する必要がSCOTTありますDatabaseMetaData.getTables()

ユーザー名は。から取得できますDatabaseMetaData.getUserName()

ただし、JDBCドライバーで行われるスキーマ/ユーザー名の比較は大文字と小文字が区別され、通常はユーザー名は大文字であることに注意してください。

DatabaseMetaData.getUserName()すべての状況で正しいケースで名前が返されるかどうかは100%わかりません。確かに、その値を使用する前に、upperCase()を実行することをお勧めします。

于 2012-11-12T09:44:23.593 に答える
3

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;

    }
于 2012-11-12T09:42:47.877 に答える
3

Java 7以降ConnectiongetSchemaメソッドがあります:https ://docs.oracle.com/javase/8/docs/api/java/sql/Connection.html#getSchema--

于 2017-03-01T02:13:32.423 に答える
3

残念ながら、その答えは一貫した解決策がないということです。JohnがSally.Tableにアクセスできる場合...クエリは機能しますが、getUserName()はSallyスキーマではなくJohnを返します。Oracleの場合、ユーザーは自分のスキーマを所有し、他のユーザーがアクセスできる場合もありますが、そのユーザーIDがその接続のデフォルトのスキーマです。

さらに、getSchemaName()もgetCatalog()もスキーマ名を返しません。

@horse_with_no_nameは、示されているようにオブジェクト参照でオーバーライドされない限り、指定されたユーザー名が(デフォルトの)スキーマ名であるため、Oracleに最も近い答えを持っています。

他のデータベースの場合、同じルールが一貫して適用されるわけではありません。

于 2018-07-16T16:08:41.737 に答える
1

スキーマ名は次を使用して取得できます

Connection conn = 
DriverManager.getConnection("jdbc:oracle:thin:@server:port:SID",prop);    
DatabaseMetaData databaseMetaData = conn.getMetaData();
System.out.println("schema name >>>> "+databaseMetaData.getUserName());
于 2012-11-12T09:56:47.037 に答える