使用PL / SQL从CLOB字段解析JSON数据

时间:2018-06-26 12:25:47

标签: json oracle plsql

我将以下格式的数据存储在表的CLOB字段中-

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

我想将它们存储在将包含列PRODUCT_NAMEPRODUCT_TYPEPRODUCT_PRICE的表中,并将它们存储为

PRODUCT_NAME PRODUCT_TYPE PRODUCT_PRICE
MyProduct    Electronics  123456789.1

我想使用Pl / SQL执行这些操作。这里有指针吗?

2 个答案:

答案 0 :(得分:2)

您使用的CLOB字段不是有效的JSON,因此您不能直接使用JSON函数。您需要遍历JSON documentation,并了解如何将json存储在数据库表中,以便更轻松地使用它们。一个适合您的解决方案是先解析各个json,然后在每个json上应用JSON_OBJECT。此外,您需要一个PIVOTMAX(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

答案 1 :(得分:0)

尝试使用PL / JSON,它具有用于JSON解析https://pljson.github.io/pljson/的各种功能和过程