Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.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 在Oracle中更新对象的json数组_Sql_Json_Oracle_Plsql_Sql Update - Fatal编程技术网

Sql 在Oracle中更新对象的json数组

Sql 在Oracle中更新对象的json数组,sql,json,oracle,plsql,sql-update,Sql,Json,Oracle,Plsql,Sql Update,嗨,我在Oracle数据库中有一个json列,它的数据类似于[{“id”:100,“make”:“BMW”},{“id”:110,“make”:“mercedes”}]。。。。。现在,我如何使用sql/plsql将id为110的make of对象更新到Toyota。谢谢。您可以使用12.1.0.2+版的json_table()函数解析json列。顺便说一句,可以通过为相关字符串类型列添加检查约束来签出字符串类型列,例如clob,varchar2。因此,请使用: update tab set

嗨,我在Oracle数据库中有一个json列,它的数据类似于[{“id”:100,“make”:“BMW”},{“id”:110,“make”:“mercedes”}]。。。。。现在,我如何使用sql/plsql将id为110的make of对象更新到Toyota。谢谢。

您可以使用12.1.0.2+版的
json_table()
函数解析json列。顺便说一句,可以通过为相关字符串类型列添加检查约束来签出字符串类型列,例如
clob
varchar2
。因此,请使用:

update tab
   set jsdata=(select case when js.id = 110 then replace(jsdata,js.make,'toyota') end
                 from tab
                cross join
                      json_table(jsdata, '$[*]'
                         columns(make    varchar2(50) path '$.make',
                                 id      int path '$.id')) js
                where js.id = 110   ) 

不幸的是,在数组中更改数据并不容易

create table t(
  id number primary key,
  json_ds varchar2(4000) check(json_ds is json)
);
insert into t values (1, '[{"id":100, "make":"BMW"},{"id":110,"make":"mercedes"}]');
commit;

update /*+ WITH_PLSQL */ t a
set json_ds = (
  with function update_json(p_in in varchar2) return varchar2 is
    l_ja json_array_t;
    l_po json_object_t;
    l_id number;
  begin
    l_ja := json_array_t.parse(p_in);
    for i in 0..l_ja.get_size - 1 loop
      l_po := json_object_t(l_ja.get(i));
      l_id := l_po.get_number('id');
      if l_id = 110 then
        l_po.put('make', 'Toyota');
      end if;
    end loop;
    return l_ja.to_string;
  end update_json;
  select update_json(a.json_ds) from dual
)
where id = 1;
/
select * from t;

ID  JSON_DS
1   [{"id":100,"make":"BMW"},{"id":110,"make":"Toyota"}]

向您问好,斯图·阿什顿

请发布您迄今为止尝试过的内容?这是否回答了您的问题?您可以使用,它在Oracle Database 20c预览版中提供,并将在21c版本中提供。