在Oracle表中存储JSON数组

时间:2019-02-12 12:45:45

标签: java json oracle

我正在处理文件中的大量JSON数据,每个JSON对象都有一个类似的数组

field28436": [{
            "id": "C28679",
            "value": "Dutch"
        }, {
            "id": "C28963",
            "value": "English"
        }, {
            "id": "C28966",
            "value": "French"
        }, {
            "id": "C28968",
            "value": "German"
        }]

我需要将其存储在单列中的oracle数据库中。请提出一种数据类型或将其存储在单个列中的方式。我正在使用JAVA解析JSON。 例如,如果我将此值解析为键,那么使用哈希映射的值对如何将其存储在单个列中?有可能吗?

2 个答案:

答案 0 :(得分:0)

如果您100%确定长度不会超过4000字节,请使用varchar2列。否则,请使用CLOB或BLOB列。

在任何情况下,您都应该使用CHECK约束“增强”该列,以验证该值是有效的JSON,例如:

create table my_table
(
   id integer primary key, 
   data clob, 
   constraint validate_json CHECK (data IS JSON)
);

Oracle建议改用BLOB列,以避免CLOB使用的多字节字符集的开销。但是,这使得从Java(或任何SQL客户端)内部处理JSON变得更加复杂。

要存储这样的值,请使用PreparedStatement并使用setString()方法。当前的Oracle驱动程序不再需要setClob()来获取长字符串-至少不需要INSERT或UPDATE语句。

String jsonData = "field28436": [....]";
PreparedStatement pstmt = connection.prepareStatement(
      "insert into my_table (id, data) values (?, ?)");
pstmt.setInt(1, 42);
pstmt.setString(2, jsonData);
pstmt.executeUpdate();

要读取数据,将使用类似的内容:

PreparedStatement pstmt = connection.prepareStatement("select data from my_table where id = ?");
pstmt.setInt(1, 42);
ResultSet rs = psmt.executeQuery();
if (rs.next()) {
  String jsonData = rs.getString(1);
}

有关更多信息,我建议阅读JSON Developer's Guide

答案 1 :(得分:0)

在这种情况下,我不得不将json消息存储在表的一列中。我们使用了CLOB数据类型,效果很好