8

Java プログラムで JDBC を使用して、Derby (別名 Java DB) データベースのテーブルを列挙する必要があります。これを行うために私が知っているのは、SHOW TABLES コマンドだけです。

私は最初にこれに似たもので試しました...

String strConnectionURL = "jdbc:derby:/path/to/derby/database;create=false";
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
Connection connection = DriverManager.getConnection(strConnectionURL);
Statement statement = connection.createStatement();
boolean boResult = statement.execute("SHOW TABLES");
if (boResult) {
    System.out.println("yay!");
}

...しかし、それは例外をスローします:

java.sql.SQLSyntaxErrorException: Syntax error: Encountered "SHOW" at line 1, column 1.

次に、CallableStatement を使用する必要があるのではないかと考えたので、これを試しました...

String strConnectionURL = "jdbc:derby:/path/to/derby/db;create=false";
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
Connection connection = DriverManager.getConnection(strConnectionURL);
CallableStatement statement = connection.prepareCall("SHOW TABLES");
boolean boResult = statement.execute();
if (boResult) {
    System.out.println("yippee!");
}

...しかし、それは同じ例外をスローします:

java.sql.SQLSyntaxErrorException: Syntax error: Encountered "SHOW" at line 1, column 1.

では、JDBC から Derby (Java DB) データベースのテーブルを列挙するのを手伝ってくれる人はいますか?

編集:私は周りを見回していて、これは一般的なJDBCの質問かもしれないと感じ始めています。つまり、Connection オブジェクトから取得できる DatabaseMetaData オブジェクトを使用して、すべてのデータベースのテーブルを列挙できます。それを調べて(そして応答を楽しみにしています)...

編集 2 : 純粋な JDBC ソリューションを見つけましたが、代替案を聞いて喜んでいます...

String strConnectionURL = "jdbc:derby:/path/to/db;create=false";
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
Connection connection = DriverManager.getConnection(strConnectionURL);
DatabaseMetaData dbmd = connection.getMetaData();
ResultSet resultSet = dbmd.getTables(null, null, null, null);
while (resultSet.next()) {
    String strTableName = resultSet.getString("TABLE_NAME");
    System.out.println("TABLE_NAME is " + strTableName);
}
4

3 に答える 3

5

Bryanがij.runScriptを提案したように、コードは次のようになります。

public void showTbls() throws Exception{
    String sqlIn = "SHOW TABLES;";
    InputStream stream = new ByteArrayInputStream(sqlIn.getBytes(StandardCharsets.UTF_8));
    ij.runScript(conn,stream,StandardCharsets.UTF_8.name(), System.out,"UTF-8");
    stream.close();
}

connダービー接続が開かれていると仮定します

ただし、欠点は、文字列出力しか得られないことです。以下から取得するような ResultSet ではありません。

Statement stmt = conn.createStatement();
ResultSet results = stmt.executeQuery("SELECT * FROM sys.systables");

または、ユーザー テーブル名のみが必要な場合は、次の SQL を使用できます。

ResultSet results = stmt.executeQuery("SELECT TABLENAME FROM SYS.SYSTABLES WHERE TABLETYPE='T'");
于 2015-05-14T19:32:18.310 に答える
5

Show Tables はベース SQL ステートメントではなく ij コマンドであるため、直接実行することはできません。「EDIT 2」で指摘したように、DatabaseMetaData を使用してこれを行うことができます。他に 2 つの方法があります。システム カタログから選択するか ( http://db.apache.org/derby/docs/10.8/ref/rrefsistabs24269.htmlを参照)、または「ij.runScript」を使用します。プログラム内から ij ツールを実行し、それに「show tables」コマンドを渡すメソッド ( http://db.apache.org/derby/docs/10.8/publishedapi/jdbc3/org/apache/derby/tools/を参照) ij.html )

于 2011-09-14T13:42:50.373 に答える
3

SHOW TABLES と非常によく似た出力。次の jdbc 準拠のクエリを使用して生成できます。

    SELECT TABLENAME, (SELECT SCHEMANAME  
            FROM SYS.SYSSCHEMAS  
            WHERE SYS.SYSTABLES.SCHEMAID = SYS.SYSSCHEMAS.SCHEMAID) 
    AS SCHEMANAME
    FROM SYS.SYSTABLES WHERE TABLETYPE='T'

また、各 TABLE エントリの有用な SCHEMA 情報も表示されます。前にユーザーが言及したように、データベースのシステムテーブルも表示する場合は、TABLETYPE='T' をスキップします。

于 2018-03-29T21:13:05.197 に答える