【问题标题】:Oracle - json_mergepatch updating column to NULLOracle - json_mergepatch 将列更新为 NULL
【发布时间】:2021-12-26 18:45:23
【问题描述】:

我有一个带有 JSON 的表格列:

{ "name":"Tony","age":"20","sex":"male" }

当我尝试使用 json_mergepatch 添加新数据时:

UPDATE users SET user =
  json_mergepatch(user, '{"email":"tony@mail.com"}')
where name = 'Tony';

我的列数据变成Null而不是{ "name":"Tony","age":"20","sex":"male", "email":"tony@mail.com" }

见小提琴:https://dbfiddle.uk/?rdbms=oracle_18&fiddle=7cbe31629bb709d1bbe7056fc6710673 Fiddle 可以工作,但在我的代码中由于某种原因它不起作用。我的 JSON 是有效的。

我做错了什么?

更新


即使列是 CLOB,Oracle 似乎对 JSON 也有 4000 个字符的限制。使用json_mergepatch 操作时,如果该列有 4000 个字符,则将其设为 NULL!
发现这个低谷测试。

有没有办法克服这个限制?

【问题讨论】:

    标签: sql json oracle sql-update oracle19c


    【解决方案1】:

    这对我有用:

    CREATE TABLE users (
      id    NUMBER,
      xuser  VARCHAR2(4000),
      CONSTRAINT users_is_json CHECK (xuser IS JSON)
    );
    
    INSERT INTO users (id, xuser) VALUES (1, '{ "name":"Tony","age":"20","sex":"male" }');
    
    UPDATE users a 
    SET    a.xuser = JSON_MERGEPATCH(a.xuser, '{"email":"tony@email.com"}') 
    WHERE  a.xuser.name = 'Tony';
    
    SELECT * FROM users;
    
    ID  XUSER
    --  -----
    1   
    {
    "name" : "Tony",
    "age" : "20",
    "sex" : "male",
    "email" : "tony@xmail.com"
    }
    

    由于“user”是oracle的保留字,应该避免使用,我将其命名为“xuser”。当我删除别名“a”时,它会出现ORA-00904: "XUSER"."NAME": invalid identifier

    【讨论】:

      【解决方案2】:

      在这里找到解决方案:Oracle Update - JSON Merge Patch with more than 4000 characters

      UPDATE users SET user =
        json_mergepatch(user, '{"email":"tony@mail.com"}' RETURNING CLOB)
      where name = 'Tony';
      

      【讨论】:

        猜你喜欢
        • 2021-01-30
        • 1970-01-01
        • 2012-07-16
        • 2013-03-17
        • 2019-05-29
        • 2015-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多