更新json列oracle v12.2

bjg7j2ky  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(589)

我遇到了一种需要在表中动态更新json列的情况。见下面的结构

  1. create table tjson ( jsoncol CLOB CONSTRAINT tjson_chk CHECK (jsoncol IS JSON) );
  2. insert into tjson (jsoncol) VALUES ( '{"name" : "Kunal", "LName" : "Vohra" ,
  3. "salary" : "10000", "Age" : "25"}');
  4. insert into tjson (jsoncol) VALUES ( '{"name" : "Rahul", "LName" : "Sharma" ,
  5. "salary" : "20000", "Age" : "35"}');

现在我需要改变 salary 为完整表提供一个基于 some_condition 我可以使用 JSON_VALUE(jsoncol, '$.Age') ```
update tjson
set jsoncol = '"salary":$JustChangeSalary'
where some_condition;

  1. 工资是动态的,不是固定的。我只想换薪水。
  2. 我试过了 `json_mergepatch` 但这只能从 `Oracle version 19` . 我们正在使用 `Oracle version 12.2`
anhgbhbe

anhgbhbe1#

假设您想将kunal的薪水更新为15000,那么使用 JSON_EXISTS() 只在何处条件下起作用带他记录,而用传统的 REPLACE() set子句旁边的函数,其文字摘录包含与 salary 作为

  1. UPDATE tjson
  2. SET jsoncol = REPLACE( jsoncol, '"salary" : "10000"', '"salary" : "15000"' )
  3. WHERE JSON_EXISTS(jsoncol, '$.name?(@ == "Kunal")');

演示

pod7payv

pod7payv2#

之前 json_mergepatch 您可以使用基本的字符串函数,如 replace .
但是您需要注意这些-格式的差异可能会导致这些失败。您还可以更新符合条件的多个属性。
您可以通过以下方式在纯sql中安全地执行操作:
将json对象转换为具有 json_table 重建文档 json_object(agg) 以及 json_array(agg) ,根据需要传递新值。
例如:

  1. create table tjson (
  2. jsoncol CLOB CONSTRAINT tjson_chk CHECK (jsoncol IS JSON)
  3. );
  4. insert into tjson (jsoncol) VALUES (
  5. '{"name" : "Kunal", "LName" : "Vohra" , "salary" : "10000", "Age" : "25"}'
  6. );
  7. insert into tjson (jsoncol) VALUES (
  8. '{"name" : "Rahul", "LName" : "Sharma" , "salary" : "20000", "Age" : "35"}'
  9. );
  10. commit;
  11. select json_object (
  12. 'name' value j.name,
  13. 'LName' value j.LName,
  14. 'salary' value 30000, -- put new salary here
  15. 'Age' value j.Age
  16. )
  17. from tjson, json_table (
  18. jsoncol, '$'
  19. columns (
  20. name path '$.name',
  21. LName path '$.LName',
  22. Age int path '$.Age'
  23. )
  24. ) j
  25. where j.name = 'Kunal';
  26. JSON_OBJECT('NAME'VALUEJ.NAME,'LNAME'VALUEJ.LNAME,'SALARY'VALUE30000,--PUTNEWSALARYHERE'AGE'VALUEJ.AGE)
  27. {"name":"Kunal","LName":"Vohra","salary":30000,"Age":25}
  28. select t.jsoncol.name, t.jsoncol.salary
  29. from tjson t;
  30. NAME SALARY
  31. Kunal 10000
  32. Rahul 20000
  33. update tjson t
  34. set jsoncol = (
  35. select json_object (
  36. 'name' value j.name,
  37. 'LName' value j.LName,
  38. 'salary' value 30000, -- put new salary here
  39. 'Age' value j.Age
  40. )
  41. from tjson, json_table (
  42. jsoncol, '$'
  43. columns (
  44. name path '$.name',
  45. LName path '$.LName',
  46. Age int path '$.Age'
  47. )
  48. ) j
  49. where t.jsoncol.name = j.name
  50. )
  51. where t.jsoncol.name = 'Kunal';
  52. select t.jsoncol.name, t.jsoncol.salary
  53. from tjson t;
  54. NAME SALARY
  55. Kunal 30000
  56. Rahul 20000

显然这是。。。麻烦!对于复杂的文件来说是不切实际的。
幸运的是,从12.2开始,您可以使用pl/sql对象类型操作json文档:

  1. declare
  2. jdoc tjson.jsoncol%type;
  3. jobj json_object_t;
  4. begin
  5. select t.jsoncol
  6. into jdoc
  7. from tjson t
  8. where t.jsoncol.name = 'Kunal';
  9. jobj := json_object_t.parse ( jdoc );
  10. jobj.put ( 'salary', 40000 );
  11. jdoc := jobj.to_clob();
  12. update tjson t
  13. set jsoncol = jdoc
  14. where t.jsoncol.name = 'Kunal';
  15. end;
  16. /
  17. select t.jsoncol.name, t.jsoncol.salary
  18. from tjson t;
  19. NAME SALARY
  20. Kunal 40000
  21. Rahul 20000
展开查看全部

相关问题