Анализ данных JSON из поля CLOB с использованием PL / SQL - PullRequest
0 голосов
/ 26 июня 2018

У меня есть данные в следующем формате, хранящиеся в поле CLOB таблицы -

{
  "key" : "PRODUCT_NAME",
  "value" : "Myproduct"
}, {
  "key" : "PRODUCT_TYPE",
  "value" : "Electronics"
}, {
  "key" : "PRODUCT_PRICE",
  "value" : "123456789.1"
}

Я хочу сохранить их в таблице, в которой будут столбцы PRODUCT_NAME, PRODUCT_TYPE, PRODUCT_PRICE, и они будут храниться как

PRODUCT_NAME PRODUCT_TYPE PRODUCT_PRICE
MyProduct    Electronics  123456789.1

Я хочу выполнить это с помощью Pl / SQL. Здесь есть какие-нибудь указатели?

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Используемое вами поле CLOB не является допустимым JSON, поэтому вы не можете напрямую использовать функции JSON. Вам нужно ознакомиться с документацией JSON и понять, как json должен храниться в таблице базы данных, чтобы упростить их использование. Одним из решений для вас было бы сначала проанализировать отдельные jsons, а затем применить JSON_OBJECT к каждому json. Кроме того, вам потребуется блок PIVOT или MAX(CASE) для преобразования строк в столбцы. Этот запрос работает в Oracle 12c и выше.

Пример данных

CREATE TABLE t AS 
  SELECT 1   AS id, 
         To_clob('{   "key" : "PRODUCT_NAME",   "value" : "Myproduct" }, {   "key" : "PRODUCT_TYPE",   "value" : "Electronics" }, {   "key" : "PRODUCT_PRICE",   "value" : "123456789.1" }') AS j 
  FROM   dual 
  UNION ALL 
  SELECT 2, 
         To_clob('{   "key" : "PRODUCT_NAME",   "value" : "Myproduct2" }, {   "key" : "PRODUCT_TYPE",   "value" : "Chemical" }, {   "key" : "PRODUCT_PRICE",   "value" : "25637.1" }') 
  FROM   dual; 

Запрос

WITH jdt AS 
( 
       SELECT id, 
              JSON_VALUE(jsons,'$.key')   AS k,  -- gets the "key"
              JSON_VALUE(jsons,'$.value') AS v   -- gets the "value"
       FROM   ( 
                     SELECT id, 
                            REGEXP_SUBSTR(j,'(.*?)\}(,|$)',1,LEVEL,'n',1) 
                                   || '}' AS jsons --split the clob field into individual jsons
                     FROM   t 
                            CONNECT BY PRIOR id = id 
                     AND    PRIOR SYS_GUID() IS NOT NULL 
                     AND    LEVEL <= REGEXP_COUNT(j,'\}(,|$)') ) ) 
SELECT * 
FROM   jdt pivot ( max ( v ) FOR k IN ( 'PRODUCT_NAME', 
                                       'PRODUCT_TYPE', 
                                       'PRODUCT_PRICE' ) );

 ID PRODUCT_NAME PRODUCT_TYPE   PRODUCT_PRICE
 1  Myproduct    Electronics    123456789.1
 2  Myproduct2   Chemical       25637.1
0 голосов
/ 26 июня 2018

Попробуйте использовать PL / JSON, он имеет различные функции и процедуры для анализа JSON https://pljson.github.io/pljson/

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