Хранение массива JSON в таблице Oracle - PullRequest
0 голосов
/ 12 февраля 2019

Я обрабатываю огромные данные JSON из файла, и каждый объект JSON имеет массив, подобный

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

Мне нужно сохранить его в базе данных Oracle в одном столбце.Пожалуйста, предложите тип данных или способ хранить его в одном столбце.Я использую JAVA для анализа JSON.Например, если я анализирую это значение как ключ, пару значений, используя hashmap, как я могу сохранить его в одном столбце?Возможно ли это?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

У меня была такая ситуация, когда мне приходилось хранить сообщение json в столбце таблицы.мы использовали CLOB Datatype, и он работал хорошо

0 голосов
/ 12 февраля 2019

Используйте столбец varchar2, если вы на 100% уверены, что длина никогда не превысит 4000 байтов.В противном случае используйте столбец CLOB или BLOB.

В любом случае вам следует «расширить» этот столбец с помощью ограничения CHECK, подтверждающего, что значение является допустимым JSON, например:

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

Oracle рекомендует использовать BLOBвместо столбца, чтобы избежать издержек многобайтового набора символов, используемого CLOB.Однако это делает обработку JSON немного более сложной изнутри Java (или любого клиента SQL).

Для сохранения такого значения используйте 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...