我实际上想要使用构造JSON_TABLE查询存储在Oracle数据库中的JSON-String。这非常有效。
SQL查询
SELECT f.val
from JSON,
JSON_TABLE(json,'$' COLUMNS(val VARCHAR(4000) PATH '$.glossary.GlossDiv.GlossList.GlossEntry.GlossTerm')) as f
DB中的JSON-String
(顺便提一下json.org/example.html中的JSON示例)
{"glossary":{"title":"example glossary","GlossDiv":{"title":"S","GlossList":{"GlossEntry":{"ID":"SGML","SortAs":"SGML","GlossTerm":"Standard Generalized Markup Language","Acronym":"SGML","Abbrev":"ISO 8879:1986","GlossDef":{"para":"A meta-markup language, used to create markup languages such as DocBook.","GlossSeeAlso":["GML","XML"]},"GlossSee":"markup"}}}}}
现在我想在普通的Java应用程序中执行查询。我在五个线程中同时使用它。这就是我如何重现这个问题。在我的原始用例中,我在执行此查询的网站上快速按下按钮。
JsonRunnable.java
public class JsonRunnable implements Runnable {
public void run() {
try {
List<String> list = new ArrayList<String>();
java.util.Properties connProperties = new java.util.Properties();
connProperties.put("user", "");
connProperties.put("password", "");
Class.forName("oracle.jdbc.driver.OracleDriver");
String database =
"jdbc:oracle:thin:@myserver.com:1521/DB";
Connection conn = DriverManager.getConnection(database, connProperties);
String sql = "SELECT f.val from JSON, JSON_TABLE(json,'$' COLUMNS(val VARCHAR(4000) PATH '$.glossary.GlossDiv.GlossList.GlossEntry.GlossTerm')) as f";
PreparedStatement s1 = conn.prepareStatement(sql);
s1.execute(sql);
ResultSet rs = s1.getResultSet();
while (rs.next()) {
list.add(rs.getString(1));
}
s1.close();
conn.close();
System.out.println(list.get(0));
} catch (Exception ex) {
System.out.println(ex);
}
}
}
Main.java
public class Main {
public static void main(String[] args) {
for(int i = 0;i < 5;i++){
new Thread(new JsonRunnable()).start();
}
}
}
现在,我收到此错误,它告诉我在解析和处理XML时出现问题(错误消息是德语但您可以看到ORA错误消息):
java.sql.SQLException: ORA-19114: XPST0003 - Fehler beim Parsen des XQuery Ausdrucks:
ORA-19202: Fehler bei XML-Verarbeitung
jzntSCV1:invState2 aufgetreten
Oracle驱动程序: OJDBC 7 12.1.0.1
Java: 1.8
Oracle DB: Oracle Database 12c企业版12.1.0.2.0版 - 64位生产
在这种情况下有人可以帮助我吗?我其实真的失去了如何解决这个问题。非常感谢你们!
答案 0 :(得分:2)
您是否安装了最新的补丁集(Patch 24968615:DATABASE PROACTIVE BUNDLE PATCH 12.1.0.2.170117)。 这应该可以解决问题。
答案 1 :(得分:1)
我确实运行了sql:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul id="dropdown">
<li value="1">user name</li>
<li value="2">user age</li>
<li value="3">user height</li>
</ul>
这是正确的。 然后我做了app,就像你做的那样。并尝试12.0.1.1和12.0.1.2驱动程序。两者都运作良好。应用程序和sql一样正确。
我对问题的唯一想法是你的json表在不同的行中有不同的json-schemas或null。尝试更改你的sql以按rowid进行过滤,其中row具有上面显示的字符串并再次测试应用程序。可能当您在IDE中检查sql(比如说Pl / SQl开发人员)时,它只选择第一行,这就是它的工作原理,但是当你在app中运行它时,尝试一次选择所有行并选择其他(或空)模式行