Как позвонить в H2 LINK_SCHEMA? - PullRequest
       36

Как позвонить в H2 LINK_SCHEMA?

0 голосов
/ 30 октября 2019

Я пытаюсь запустить link_schema

    final String query = "? = CALL LINK_SCHEMA('ROADS', '', '" + url + "', '" + user + "', '" + pass + "', 'ROADS');";
    CallableStatement statement = conn.prepareCall(query);
    statement.execute();
    ResultSet rs = statement.getResultSet();

Я получаю ResultSet, но он не содержит список таблиц, как было обещано. Также позже, когда я пытаюсь получить доступ к таблице, я получаю сообщение об ошибке «Схема не найдена». Где я ошибся?

Обновление: похоже, проблема в драйвере Oracle;проверьте секцию ответов и комментариев Рязанов Евгений .

1 Ответ

2 голосов
/ 30 октября 2019

Вам необходимо использовать

Statement st = con.createStatement();
ResultSet rs = st.executeQuery("CALL LINK_SCHEMA(…)");

или более безопасный и надежный

PreparedStatement ps = con.prepareStatement("CALL LINK_SCHEMA(?, '', ?, ?, ?, ?)");
ps.setString(1, "ROADS");
ps.setString(2, url);
ps.setString(3, user);
ps.setString(4, pass);
ps.setString(5, "ROADS");
ResultSet rs = ps.executeQuery();

Простой тестовый пример:

try (Connection c1 = DriverManager.getConnection("jdbc:h2:mem:1");
        Connection c2 = DriverManager.getConnection("jdbc:h2:mem:2")) {
    Statement s1 = c1.createStatement(), s2 = c2.createStatement();
    s1.execute("CREATE SCHEMA S; CREATE TABLE S.T1(ID INT); CREATE TABLE S.T2(ID INT)");
    try (ResultSet rs = s2.executeQuery("CALL LINK_SCHEMA('S', '', 'jdbc:h2:mem:1', '', '', 'S')")) {
        while (rs.next()) {
            System.out.println(rs.getString(1));
        }
    }
}
T1
T2
...