从jdbc调用derby(java db)'show tables'

时间:2011-09-14 03:44:32

标签: jdbc derby javadb

我需要在Java程序中使用JDBC枚举Derby(aka 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);
}

3 个答案:

答案 0 :(得分:5)

Show Tables是一个ij命令,而不是基本SQL语句,因此您无法直接执行它。正如您在“编辑2”中所述,您可以使用DatabaseMetaData来执行此操作。另外两种方法是:您可以从系统目录中选择(参见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

答案 1 :(得分:4)

正如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是开放的德比Connection

但缺点是你只获得字符串输出。不是你得到的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'");

答案 2 :(得分:1)

非常相似的输出     显示表格; 可以使用以下符合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' 如果您还想以之前提到的用户身份查看数据库的系统表。