2017-01-20 1 views
1

다음과 같이 Oracle DB에 테이블이 있습니다.Oracle 12c에서 JSON 문자열의 일부를 업데이트하는 방법은 무엇입니까?

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 구조를 제공하지 않고도 JSON 문자열의 Street 속성을 업데이트 할 수 있습니까?

도와주세요.

+0

왜 DB에 JSON을 저장해야? 속성의 열 forceach를 만들고 특정 열을 쿼리하고 필터링 할 수도 있습니다. 값을 찾아서 특정 값만을 얻는 것은 기본적으로 db의 성능에 치명적인 무거운 문자열 연산입니다. –

+1

Chetan은 다른 요구 사항으로 인해 JSON을 DB에 저장 했으므로 이제 해당 디자인을 변경할 수 없습니다. 그러니이 의심에 대해 저를 도와 주시면 저에게 제안 해주십시오. – Raj

답변

-1

다음 클래스를 만들어 db 테이블의 데이터를 나타낼 수 있습니다.

public class PersonData 
    { 
     private string _data; 
     public string Guid { get; set; } 

     public string Data { get { return _data; } set { _data = value; } } 

     public Person Person 
     { 
      get 
      { 
       if (string.IsNullOrEmpty(_data)) 
       { 
        return null; 
       } 

       return JsonConvert.DeserializeObject<Person>(_data); 
      } 
      set 
      { 
       if (value == null) 
       { 
        _data = string.Empty; 
       } 

       _data = JsonConvert.SerializeObject(value); 
      } 
     } 
    } 
    public class Person 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 

     public Address Address 
     { 
      get; 
      set; 
     } 
    } 

    public class Address 
    { 
     public string Street { get; set; } 
     public string Cityr { get; set; } 
     public string Coutry { get; set; } 
     public string PostCode { get; set; } 
    } 

그리고 선택한 사람의 주소를 변경하려면 다음 방법을 만드십시오.

public void ChangePersonAddress(string guid) 
    { 
     //Retrive GUID and data from the database for the specified guid and create object of PersonData from it. 

     using (var conn = new SqlConnection("dbconnstring")) 
     { 
      var selectQuery = "SELECT id, data FROM my_table WHERE id = @id"; 
      using (var cmd = new SqlCommand(selectQuery, conn)) 
      { 
       cmd.Parameters.Add(new SqlParameter("@id", guid)); 
       conn.Open(); 

       var reader = cmd.ExecuteReader(); 

       if (reader.Read()) 
       { 
        var personData = new PersonData(); 
        personData.Guid = guid; 
        personData.Data = reader.GetString(1); 

        var person = personData.Person; 

        person.Address.Street = "Something new"; 

        personData.Person = person; 

        //Save changed address to the database by executing Update query on the table. 
        //This way it will update the JSON string in the data column. 
        var updateQuery = "UPDATE my_table SET data = @data WHERE id = @id"; 

        cmd.CommandText = updateQuery; 
        cmd.Parameters.Add(new SqlParameter("@data", personData.Data)); 

        cmd.ExecuteNonQuery(); 
       } 
      } 
     } 
    } 
1

이는 12.2.0.1.0의 PL/SQL을 통해 지원됩니다. 새로운 PL/SQL 객체는 JSON 내용의 세밀한 조작을 가능하게

  • JSON_OBJECT_T : JSON과 함께 작업하는
  • JSON_ARRAY_T 객체에 대한 : JSON 배열 작업을위한

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

관련 문제