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 对象来枚举所有 db 的表。对此进行调查(并期待回复)......

编辑 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

Show Tables 是 ij 命令,不是基本 SQL 语句,所以不能直接执行。正如您在“编辑 2”中所述,您可以使用 DatabaseMetaData 来执行此操作。另外两种方法是:您可以从系统目录中选择(请参阅http://db.apache.org/derby/docs/10.8/ref/rrefsistabs24269.html),或者您可以使用“ij.runScript”从程序中运行 ij 工具的方法,并将“显示表”命令传递给它(参见http://db.apache.org/derby/docs/10.8/publishedapi/jdbc3/org/apache/derby/tools/ ij.html )

于 2011-09-14T13:42:50.373 回答
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 回答
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 回答