如何在Oracle 12c中更新JSON字符串的一部分?

时间:2017-01-20 16:48:19

标签: json oracle12c clob

我的oracle DB中的表格如下所示。

CREATE TABLE my_table(
  id    RAW(16) NOT NULL,
  data  CLOB,
  CONSTRAINT my_table_pk PRIMARY KEY (id),
  CONSTRAINT my_table_json_chk CHECK (data IS JSON)
);


INSERT INTO my_table (id, data)
VALUES (SYS_GUID(),
        '{
          "FirstName"      : "aa",
          "LastName"       : "bb",          
          "Address"        : {
                              "Street"   : "99 My Street",
                              "City"     : "My City",
                              "Country"  : "UK",
                              "Postcode" : "A12 34B"
                             }');

现在我知道,我可以使用$获取JSON字符串的address等特定属性的值。

同样,我可以更新JSON字符串的Street属性而不在更新查询中提供整个JSON结构吗?

请帮我解决这个问题。

1 个答案:

答案 0 :(得分:1)

这是通过12.2.0.1.0中的PL / SQL支持的。新的PL / SQL对象支持对JSON内容进行细粒度操作

  • JSON_OBJECT_T:用于处理JSON对象
  • JSON_ARRAY_T:用于使用JSON Arrays

JSON_OBJECT_T和JSON_ARRAY_T是JSON_ELEMENT_T的子类型

这些对象提供了一组操作类似于GSON的JSON的方法。

enter code here 
 WITH FUNCTION updateTax(JSON_DOC in VARCHAR2 ) RETURN VARCHAR2 
 IS
    jo JSON_OBJECT_T;  
    price NUMBER;  
    taxRate NUMBER; 
 BEGIN
    jo := JSON_OBJECT_T(JSON_DOC);     
    taxRate := jo.get_Number('taxRate');   
    price := jo.get_Number('total');   
    jo.put('totalIncludingTax', price * (1+taxRate));  
    RETURN jo.to_string(); 
 END; 
 ORDERS as (
    select '{"taxRate":0.175,"total":10.00}' JSON_DOCUMENT       
      from dual 
 ) 
 select JSON_DOCUMENT, updateTax(JSON_DOCUMENT)
  from ORDERS; 

JSON_DOCUMENT                   UPDATETAX(JSON_DOCUMENT)
------------------------------- --------------------------------------------------------
{"taxRate":0.175,"total":10.00} {"taxRate":0.175,"total":10.00,"totalIncludingTax":11.75} 

https://docs.oracle.com/database/122/ADJSN/using-PLSQL-object-types-for-JSON.htm#ADJSN-GUID-F0561593-D0B9-44EA-9C8C-ACB6AA9474EE