Oracle - json_mergepatch 将列更新为 NULL
Oracle - json_mergepatch updating column to NULL
我有一个 table 列 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" }
参见fiddle:https://dbfiddle.uk/?rdbms=oracle_18&fiddle=7cbe31629bb709d1bbe7056fc6710673
Fiddle 有效,但在我的代码中由于某种原因无效。我的JSON有效。
我做错了什么?
更新
似乎 Oracle 对 JSON 有 4000 个字符的限制,即使该列是 CLOB。当使用 json_mergepatch
操作时,如果该列有 4000 个字符,它将变为 NULL!
通过测试发现了这个。
有没有办法克服这个限制?
这对我有用:
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
在此处找到解决方案:
UPDATE users SET user =
json_mergepatch(user, '{"email":"tony@mail.com"}' RETURNING CLOB)
where name = 'Tony';
我有一个 table 列 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" }
参见fiddle:https://dbfiddle.uk/?rdbms=oracle_18&fiddle=7cbe31629bb709d1bbe7056fc6710673 Fiddle 有效,但在我的代码中由于某种原因无效。我的JSON有效。
我做错了什么?
更新
似乎 Oracle 对 JSON 有 4000 个字符的限制,即使该列是 CLOB。当使用 json_mergepatch
操作时,如果该列有 4000 个字符,它将变为 NULL!
通过测试发现了这个。
有没有办法克服这个限制?
这对我有用:
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
在此处找到解决方案:
UPDATE users SET user =
json_mergepatch(user, '{"email":"tony@mail.com"}' RETURNING CLOB)
where name = 'Tony';