Sql 在Oracle中更新对象的json数组
嗨,我在Oracle数据库中有一个json列,它的数据类似于[{“id”:100,“make”:“BMW”},{“id”:110,“make”:“mercedes”}]。。。。。现在,我如何使用sql/plsql将id为110的make of对象更新到Toyota。谢谢。您可以使用12.1.0.2+版的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
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版本中提供。