вызов дерби (java db) «показать таблицы» из jdbc - PullRequest
4 голосов
/ 14 сентября 2011

Мне нужно перечислить таблицы в базе данных Derby (она же Java DB), используя JDBC в программе Java. Все, что я знаю для этого, это команда 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.

Итак, кто-нибудь может мне помочь перечислить таблицы в моей базе данных Derby (Java DB) из JDBC?

РЕДАКТИРОВАТЬ : Я осматриваюсь и начинаю чувствовать, что это может быть общий вопрос JDBC. Другими словами, можно / будет перечислять все таблицы БД с объектом DatabaseMetaData, который можно получить из объекта Connection. Заглядывая в это (и с нетерпением жду ответов) ...

EDIT 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 ]

5 голосов
/ 14 сентября 2011

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)

4 голосов
/ 14 мая 2015

Как Брайан предложил 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'");
1 голос
/ 30 марта 2018

Очень похожий вывод на 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'

Он также показывает, возможно, полезную информацию SCHEMA для каждой записи TABLE.Пропустите TABLETYPE = 'T', если вы также хотите просмотреть системные таблицы вашей базы данных, о которых пользователь уже упоминал ранее.

...