【问题标题】:Update the value of JSON key in oracle在 oracle 中更新 JSON 键的值
【发布时间】: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 版中引入的。如果您尝试在旧版本中使用它,您将收到“无效标识符”消息 - 您已经这样做了。

标签: json oracle


【解决方案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,它会起作用。
猜你喜欢
  • 1970-01-01
  • 2021-03-10
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 2020-04-14
  • 2017-07-30
  • 2021-10-04
相关资源
最近更新 更多