如何在oracle 12.1中更新JSON列

如何在oracle 12.1中更新JSON列,json,oracle,Json,Oracle,我正在尝试更新oracle 12.1中的JSON列。是否有任何json函数可用于更新json。我添加了一个约束JSON\u列为JSON 我试过: UPDATE tablename SET JSON = json_mergepatch(JSON, '{"STRUCTURE_NAME":null}'); 但此功能仅适用于19c This "STRUCTURE_NAME": "ABC:STATE:L12345", needs to be updated with "STRUCTURE_NAME":n

我正在尝试更新oracle 12.1中的JSON列。是否有任何json函数可用于更新json。我添加了一个约束JSON\u列为JSON

我试过:

UPDATE tablename SET JSON =
json_mergepatch(JSON, '{"STRUCTURE_NAME":null}');
但此功能仅适用于19c

This "STRUCTURE_NAME": "ABC:STATE:L12345", needs to be updated with "STRUCTURE_NAME":null

在19c之前,如果要更改JSON文档中的任何值,必须替换整个内容:

create table t (
  doc varchar2(100)
    check ( doc is json ) 
);

insert into t values ('{
  "changeMe" : "to null",
  "leaveMe"  : "alone"
}');

update t
set    doc = '{
  "changeMe" : null,
  "leaveMe"  : "alone"
}';

select * from t;

DOC                                               
{
  "changeMe" : null,
  "leaveMe"  : "alone"
}  
请注意,当您使用19c并使用
json\u mergepatch
时,将属性设置为
null
会将其从文档中删除:

update t
set    doc = json_mergepatch ( 
  doc, 
  '{
    "changeMe" : null
  }');

select * from t;

DOC                   
{"leaveMe":"alone"}   

谢谢Chris-我尝试更新的JSON大约为5MB,以JSON格式排序将产生53K行。我想只更新一个参数:Updated JSON:[SOURCE_SYSTEM]已更新为null:“Type”:“DROP”,“SOURCE_SYSTEM”:“null”,“Type”:“ABCD”我们可以只更新参数,而不是使用整个JSON:update tbl SET DOCUMENT_COLUMN=REPLACE(JSON,SOURCE_SYSTEM,'null');JSON只是文本,所以理论上是的。但是,您必须确保文档中没有其他内容与替换匹配!JSON:“节点”:[{“类型”:“删除”、“链接”:“版本ID”:12345678,“ID”:“12345678”,“CAB_ID”:“650252419”,“AEND”:“ABC_123456”,“弯曲”:“650252418”,“序列号”:0,“状态”:“成功”,“删除标志”:“2019-03-25T19:36:26Z”,“CUR_-WO_-ID”:123456,“创建的”;“2018-12-19T16:21:54Z”,“修改的”:“2019-02-06T14:23:00Z”,“源系统”:“空”,“类型”:“ABCD”{]UPDATE tablename SET JSON=REPLACE(JSON,'node.STATUS','REVERTED');这没有帮助。它显示了1行已更新,但尚未更新。这是因为JSON中没有字符串
节点。状态
!您不能在
替换
中使用JSON路径表达式。您需要搜索要更改的文档中的确切文本。例如,如果在您的示例中希望
“键入”:“ABCD”
要变为null,您需要
替换(JSON,““TYPE”:“ABCD”,““TYPE”:null”)
或者只
替换(JSON,““ABCD”,“null”)
并且希望“ABCD”不在文档中!是的,它已经起作用了。是否可以使用12.1中的JSON路径表达式进行更新