如何调用 H2 LINK_SCHEMA?

Posted

技术标签:

【中文标题】如何调用 H2 LINK_SCHEMA?【英文标题】:How to call H2 LINK_SCHEMA? 【发布时间】:2019-10-30 10:56:24 【问题描述】:

我正在尝试运行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 驱动程序上;查看Evgenij Ryazanov的答案和评论部分。

【问题讨论】:

【参考方案1】:

你需要使用

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

【讨论】:

如果遇到异常,需要在此处发布。您还需要检查您是否使用了正确的 URL、源数据库已经存在、是否具有指定的模式(也检查字符的大小写,ROADSroads 可以不同)以及其中的一些表。网址到底长什么样? LINK_SCHEMA 如果在指定的数据库中未找到 schema,则不会返回错误,因此您需要自己检查它的存在。尝试检查ResultSet rs = DriverManager.getConnection(url, user, pass).getMetaData().getTables(null, "ROADS", null, null)的内容。 使用该 url 尝试上面评论中的命令,并检查 getMetaData().getTables() 是否返回一些行。 H2 在内部执行这样的命令并使用来自TABLE_NAME 列的表名。 H2 在来自 Oracle(或其他数据库)的结果集上使用 rs.next() / rs.getString("TABLE_NAME")。如果它返回一些正常名称,H2 也应该看到它们。下载 H2 的源代码(例如从 Maven Central),在org.h2.table.LinkSchema.linkSchema() 上设置断点,然后检查发生了什么。 H2 对 PostgreSQL 有一个技巧,看起来 Oracle 需要另一个技巧。如果您不想更改 H2 的来源,则需要为每个真实表使用 CREATE LINKED TABLE h2database.com/html/commands.html#create_linked_table 作为解决方法。

以上是关于如何调用 H2 LINK_SCHEMA?的主要内容,如果未能解决你的问题,请参考以下文章

如何使多个html共用一段导航

如何从 Java 和 H2 DB 连接到 H2 数据库

H2:如何通过更改 h2 源代码来更改 csvread 功能

如何访问gerrit的h2数据库

如果另一个 h2 选择关闭当前一个,我如何一次显示一个 h2?

如何查看我的数据库 H2 的数据,为啥 localhost:8080/h2 控制台不起作用?