如何调用 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、源数据库已经存在、是否具有指定的模式(也检查字符的大小写,ROADS
和 roads
可以不同)以及其中的一些表。网址到底长什么样?
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?的主要内容,如果未能解决你的问题,请参考以下文章
H2:如何通过更改 h2 源代码来更改 csvread 功能