2017-01-20 4 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

は、なぜあなたはデシベルで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_OBJECT_TとJSON_ARRAY_TがJSON_ELEMENT_T

のサブタイプです:JSONを扱うための
  • JSON_ARRAY_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

  • 関連する問題