【问题标题】:Adding elements in the end to a json array of objects in Oracle最后将元素添加到Oracle中的json对象数组中
【发布时间】:2023-03-23 23:59:01
【问题描述】:

我在 Oracle 数据库中有一个名为“配置”的 json 列,其中包含类似的数据-

{"sections":[{"active":true,"code":"page.about"},{"active":true,"code":"page.title"}...]}

如何向 CLOB 中的“sections”数组添加元素? 例如,将此对象添加到 CLOB- {"active":false, "code":"page.body"}

我试图这样做-

 UPDATE *TABLE_NAME*
SET configuration = JSON_MODIFY(configuration, 'append $.sections',JSON_QUERY(N'{"active":false,"code":"page.body"}'))

但我得到了这个错误- 错误报告 - SQL 错误:ORA-00917:缺少逗号 00917. 00000 - “缺少逗号” *原因:
*行动:

谢谢!

【问题讨论】:

  • 你用的是什么版本的oracle?
  • 19c 版本....
  • JSON_MODIFY 不是 Oracle 中的函数,而是 SQL Server 中的函数

标签: sql oracle


【解决方案1】:

你可以创建函数:

CREATE FUNCTION json_append_array(
  json  IN CLOB,
  path  IN VARCHAR2,
  value IN CLOB
) RETURN CLOB
IS
  j_obj JSON_OBJECT_T := JSON_OBJECT_T(json);
  j_arr JSON_ARRAY_T  := j_obj.get_Array(path);
BEGIN
  j_arr.append( JSON_OBJECT_T(value) );
  RETURN j_obj.to_Clob();
END;
/

然后你可以更新表格:

UPDATE TABLE_NAME
SET configuration = JSON_APPEND_ARRAY(
                      configuration,
                      'sections',
                      '{"active":false,"code":"page.body"}'
                    );

然后:

SELECT *
FROM   table_name;

输出:

CONFIGURATION
{"sections":[{"active":true,"code":"page.about"},{"active":true,"code":"page.title"},{"active":false,"code":"page.body"}]}

db小提琴here

【讨论】:

    【解决方案2】:

    您可以将数组拆分为行,使用UNION ALL 添加另一行并重新聚合并使用JSON_MERGEPATCH 更新对象:

    MERGE INTO table_name dst
    USING (
      SELECT t.ROWID AS rid,
             a.new_value
      FROM   table_name t
             CROSS JOIN LATERAL (
               SELECT JSON_OBJECT(
                        KEY 'sections' VALUE JSON_ARRAYAGG(value FORMAT JSON)
                      ) AS new_value
               FROM   (
                 SELECT value
                 FROM   JSON_TABLE(
                          t.configuration,
                          '$.sections[*]'
                          COLUMNS value CLOB FORMAT JSON PATH '$'
                        )
                 UNION ALL
                 SELECT EMPTY_CLOB() || '{"active":false,"code":"page.body"}' FROM DUAL
               )
             ) a
    ) src
    ON (dst.ROWID = src.rid)
    WHEN MATCHED THEN
      UPDATE
      SET configuration = JSON_MERGEPATCH(dst.configuration, src.new_value);
    

    其中,对于样本数据:

    CREATE TABLE table_name (configuration CLOB CHECK (configuration IS JSON));
    
    INSERT INTO table_name ( configuration )
    VALUES ('{"sections":[{"active":true,"code":"page.about"},{"active":true,"code":"page.title"}]}');
    

    那么,在merge语句之后:

    SELECT *
    FROM   table_name;
    

    输出:

    CONFIGURATION
    {"sections":[{"active":true,"code":"page.about"},{"active":true,"code":"page.title"},{"active":false,"code":"page.body"}]}

    db小提琴here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多