Чтение данных JSON из большого двоичного объекта

#json #oracle #plsql #oracle-apex

#json #Oracle #plsql #oracle-apex

Вопрос:

Редактировать — oracle версии 19c

Я загружаю файл json, используя тип файла просмотра в APEX, а затем сохраняю его в таблице как большой двоичный объект. Таблица выглядит следующим образом —

 File_ID    Filename             Mime_type          created_on      blob_content
   1       file_new.json     application/json       9/1/2020           (BLOB)

  

Теперь я хочу проанализировать это и прочитать содержимое большого двоичного объекта в виде таблицы в oracle. Как я могу это сделать?

Файл Json выглядит примерно так, но содержит сотни строк.

 [{"Id":"50021","eName":"random123", "Type":"static","Startdate":"07/03/2020","Enddate":"08/02/2020,"nominations":[{"nominationId":"152","nominationMaxCount":7500,"offer":[{"Id":"131","Type":"MONEY","clientId":41,
"stateExclusions":[],"divisionInclusions":["111","116","126","129"]]}]

  

Комментарии:

1. версия Oracle?

2. @thatjeffsmith — извините, я пропустил это. Это 19c.

3. итак, вы хотите увидеть идентификатор, имя, тип, Startdate…as столбцы, и каждый из них отображается как столбец в строке для вашего SQL? Я предполагаю, что вы также хотите, чтобы массив nominations был каким-то вложенным столбцом?

4. @thatjeffsmith — Да, вы правы. Я хорошо разбираюсь либо в строках, либо в столбцах, поскольку позже я могу изменять формат, который я хочу. Я не могу прочитать только содержимое. Я буду следовать вашим шагам и читать блоги, чтобы узнать, смогу ли я это сделать?

Ответ №1:

Шаг первый — добавьте ограничение проверки IS JSON в свой столбец BLOB_CONTENT.

 ALTER TABLE CLOBS
ADD CONSTRAINT CLOB_JSON CHECK 
(CLOBS IS JSON)
ENABLE; -- yes my table name and my column are both named CLOBS
  

Шаг второй — добавьте некоторые данные.

База данных предоставляет собственные вызовы SQL для анализа / запроса содержимого JSON в вашем большом двоичном объекте.

Мои данные, одна строка. В этом документе JSON есть несколько простых массивов.

 {
  "results" : [
    {
      "columns" : [
        {
          "name" : "REGION_ID",
          "type" : "NUMBER"
        },
        {
          "name" : "REGION_NAME",
          "type" : "VARCHAR2"
        }
      ],
      "items" : [
        {
          "region_id" : 1,
          "region_name" : "Europe"
        },
        {
          "region_id" : 2,
          "region_name" : "Americas"
        },
        {
          "region_id" : 3,
          "region_name" : "Asia"
        },
        {
          "region_id" : 4,
          "region_name" : "Middle East and Africa"
        }
      ]
    }
  ]
}
  

Я могу использовать функцию jsonv_value(), если я хочу извлечь один атрибут, и я могу ссылаться на них, используя $. notation . Я ссылаюсь на массивы, как и следовало ожидать.

 select json_value(CLOBS,'$.results.columns[0].name')   FIRST_COLUMN,
       json_value(CLOBS,'$.results.columns[1].name')   SECOND_COLUMN
  from CLOBS
 where ID = 1;
  

Результаты —
введите описание изображения здесь

У нашего архитектора продукта (Beda) есть отличная серия блогов с гораздо лучшими примерами, чем этот.

Комментарии:

1. Спасибо. Я обновил вопрос примером моего файла json

2. у меня сейчас нет времени возвращаться назад, возможно, это сделает кто-то другой, но прочитайте эти сообщения от Беды, у него есть примеры именно того, что вы хотите.