在 oracle 中更新 JSON 键的值

Posted

技术标签:

【中文标题】在 oracle 中更新 JSON 键的值【英文标题】:Update the value of JSON key in oracle 【发布时间】:2021-02-03 13:37:22 【问题描述】:

我正在使用 Oracle SQL Developer 并且想要更新 JSON 中特定键的值。

我正在使用以下查询:

   update M  
  set  OBJECT = json_mergepatch (   
     OBJECT, ' "$.ABC.DATA.WORKFLOW_STATUS.ABC" : "MONIKA" ' 
   ) WHERE KEY_1 = '121';

输出:错误报告

SQL 错误:ORA-00904:“JSON_MERGEPATCH”:标识符无效 00904. 00000 - "%s: 无效标识符"

请建议我正确的查询。

【问题讨论】:

原始 JSON 的结构是什么,您期望的 JSON 结果是什么? 在我的 JSON 中,此路径 (ABC.DATA.WORKFLOW_STATUS.ABC) 存在 n 想要更新此键中的值,但它不支持 JSON_MERGEPATCH 请告诉我们您的 Oracle 数据库的准确版本 - 不是 SQL Developer,而是数据库本身。每个提出问题的人都应该这样做。 @StewAshton 我正在使用 Oracle Database 12c 企业版 JSON_MERGEPATCH 是在 Oracle 数据库 19c 版中引入的。如果您尝试在旧版本中使用它,您将收到“无效标识符”消息 - 您已经这样做了。 【参考方案1】:

假设您尝试更新的 JSON 的结构类似于:

CREATE TABLE test_data
AS
    SELECT '121' AS key_1, '
    "ABC": 
        "WORKFLOW_STATUS": 
            "ABC": "some value",
            "XYZ": 5.23
        ,
        "OTHER": "fancy text"
    ,
    "DEF": 123
' AS object_val FROM DUAL
    UNION ALL
    SELECT '122' AS key_1, '
    "ABC": 
        "WORKFLOW_STATUS": 
            "ABC": "other value",
            "XYZ": 2
        ,
        "OTHER": "cool text"
    ,
    "DEF": 999
' AS object_val FROM DUAL;

更新 JSON 路径 $.ABC.DATA.WORKFLOW_STATUS.ABC 的正确语法是这样的:

UPDATE test_data
   SET object_val = json_mergepatch (object_val, '"ABC":"WORKFLOW_STATUS":"ABC":"MONIKA"')
 WHERE key_1 = '121';

【讨论】:

感谢@E J Egyed,但我仍然面临同样的错误。 您的 Oracle 数据库是什么版本? JSON_MERGEPATCH 直到 19c 才引入。 我使用的是 Oracle Database 12c 企业版 那么您将无法使用 JSON_MERGEPATCH,因为它是 19c 中引入的新功能 谢谢@EJ Egyed,但今天我已经替换了 JSON_MERGEPATCH,我们可以使用 Regexp_replace 代替 JSON_MERGEPATCH,它会起作用。

以上是关于在 oracle 中更新 JSON 键的值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JSON 对象中获取键的值 [重复]

如何在 JSON 键的 postgres 更新语句中增加值

更新 Firebase 中键的值

如何更新嵌套字典中键的值?

当键的名称中有点时(在 oracle 中),我如何访问 JSON 值?

更新/更改存储在 NSArray 中的 NSDictionary 键的值