Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 更新json列oracle v12.2_Sql_Json_Oracle_Sql Update_Oracle12c - Fatal编程技术网

Sql 更新json列oracle v12.2

Sql 更新json列oracle v12.2,sql,json,oracle,sql-update,oracle12c,Sql,Json,Oracle,Sql Update,Oracle12c,我需要在表中动态更新json列。见下文结构 create table tjson ( jsoncol CLOB CONSTRAINT tjson_chk CHECK (jsoncol IS JSON) ); insert into tjson (jsoncol) VALUES ( '{"name" : "Kunal", "LName" : "Vohra" , "salary" : "10000", "Age

我需要在表中动态更新json列。见下文结构

create table tjson ( jsoncol CLOB CONSTRAINT tjson_chk CHECK (jsoncol IS JSON) );    

insert into tjson (jsoncol) VALUES ( '{"name" : "Kunal", "LName" : "Vohra" , 
                                       "salary" : "10000", "Age" : "25"}');

insert into tjson (jsoncol) VALUES ( '{"name" : "Rahul", "LName" : "Sharma" , 
                                       "salary" : "20000", "Age" : "35"}');
现在,我需要根据
某些条件将
薪资
更改为完整表的动态值

我可以使用
JSON\u值(jsoncol,$.Age')

工资是动态的,不是固定的。我愿意只改变薪水


我尝试了
json\u mergepatch
,但这只能从
Oracle版本19
中获得。我们使用的是Oracle 12.2版

假设您希望将Kunal的工资更新为15000,然后在WHERE条件下使用
JSON_EXISTS()
SET子句旁边的函数,其文字摘录包含与
薪资相关的键值组合

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

json\u mergepatch
之前,您可以使用基本的字符串函数,如
replace

但是您需要注意这些-格式的差异可能会导致这些失败。您还可以更新符合条件的多个属性

您可以通过以下方式在纯SQL中安全地执行操作:

  • 使用
    JSON\u表将JSON对象转换为行和列
  • 使用
    json\u对象(agg)
    json\u数组(agg)
    重构文档,根据需要传递新值
例如:

create table tjson ( 
  jsoncol CLOB CONSTRAINT tjson_chk CHECK (jsoncol IS JSON) 
);

insert into tjson (jsoncol) VALUES ( 
  '{"name" : "Kunal", "LName" : "Vohra" , "salary" : "10000", "Age" : "25"}'
);

insert into tjson (jsoncol) VALUES ( 
  '{"name" : "Rahul", "LName" : "Sharma" , "salary" : "20000", "Age" : "35"}'
);

commit;

select json_object (
  'name' value j.name,
  'LName' value j.LName,
  'salary' value 30000, -- put new salary here
  'Age' value j.Age
) 
from   tjson, json_table (
  jsoncol, '$'
  columns (
    name path '$.name',
    LName path '$.LName',
    Age int path '$.Age'
  )
) j
where  j.name = 'Kunal';

JSON_OBJECT('NAME'VALUEJ.NAME,'LNAME'VALUEJ.LNAME,'SALARY'VALUE30000,--PUTNEWSALARYHERE'AGE'VALUEJ.AGE)   
{"name":"Kunal","LName":"Vohra","salary":30000,"Age":25}  

select t.jsoncol.name, t.jsoncol.salary
from   tjson t;

NAME    SALARY   
Kunal    10000     
Rahul    20000     


update tjson t
set    jsoncol = (
  select json_object (
    'name' value j.name,
    'LName' value j.LName,
    'salary' value 30000, -- put new salary here
    'Age' value j.Age
  ) 
  from   tjson, json_table (
    jsoncol, '$'
    columns (
      name path '$.name',
      LName path '$.LName',
      Age int path '$.Age'
    )
  ) j
  where t.jsoncol.name = j.name
)
where t.jsoncol.name = 'Kunal';

select t.jsoncol.name, t.jsoncol.salary
from   tjson t;

NAME    SALARY   
Kunal    30000     
Rahul    20000   
显然这是。。。大而笨重的这对于复杂的文档是不切实际的

幸运的是,从12.2开始,您可以使用PL/SQL对象类型操作JSON文档:

declare
  jdoc tjson.jsoncol%type;
  jobj json_object_t;
begin
  select t.jsoncol
  into   jdoc
  from   tjson t
  where  t.jsoncol.name = 'Kunal';

  jobj := json_object_t.parse ( jdoc );
  jobj.put ( 'salary', 40000 );
  jdoc := jobj.to_clob();

  update tjson t
  set    jsoncol = jdoc
  where  t.jsoncol.name = 'Kunal';
end;
/

select t.jsoncol.name, t.jsoncol.salary
from   tjson t;

NAME    SALARY   
Kunal    40000     
Rahul    20000   

它失败了。SQL错误:ORA-40442:JSON路径表达式语法错误@BarbarosÖzhan该问题与一个bug有关。它的温度也在12摄氏度以内。咨询你的管理员,告诉他需要应用最新的JSON补丁包,其中包括bug.18999568的补丁(补丁编号参考请参见Note.1992767.1)@KunalVohra。谢谢@BarbarosÖzhan。同时,我又问了一个与oracle DB脚本相关的问题,您能看一下吗
declare
  jdoc tjson.jsoncol%type;
  jobj json_object_t;
begin
  select t.jsoncol
  into   jdoc
  from   tjson t
  where  t.jsoncol.name = 'Kunal';

  jobj := json_object_t.parse ( jdoc );
  jobj.put ( 'salary', 40000 );
  jdoc := jobj.to_clob();

  update tjson t
  set    jsoncol = jdoc
  where  t.jsoncol.name = 'Kunal';
end;
/

select t.jsoncol.name, t.jsoncol.salary
from   tjson t;

NAME    SALARY   
Kunal    40000     
Rahul    20000