[英]Update a json column after use JSON_MERGEPATCH
有这个
create table departments_json (
department_id
integer
NOT NULL
CONSTRAINT departments_json__id__pk PRIMARY KEY,
department_data
CLOB
NOT NULL
CONSTRAINT departments_json__data__chk CHECK ( department_data IS JSON )
);
insert into departments_json
json values ( 110, '{
"department": "Accounting",
"employees": [
{
"name": "Higgins, Shelley",
"job": "Accounting Manager",
"hireDate": "2002-06-07T00:00:00"
},
{
"name": "Gietz, William",
"job": "Public Accountant",
"hireDate": "2002-06-07T00:00:00"
}
]
}'
);
和新的 json :
{
"employees": [
{
"name": "Chen, John",
"job": "Accountant",
"hireDate": "2005-09-28T00:00:00"
},
{
"name": "Greenberg, Nancy",
"job": "Finance Manager",
"hireDate": "2002-08-17T00:00:00"
},
{
"name": "Urman, Jose Manuel",
"job": "Accountant",
"hireDate": "2006-03-07T00:00:00"
}
]
}
在此POST 之后,响应对我有很大帮助。 但现在是时候用新的 json 更新列 Department_data。 我正在使用这个查询:
update departments_json d
set d.department_data =
WITH employees ( json ) AS (
SELECT j.json
FROM departments_json d
CROSS APPLY JSON_TABLE(
d.department_data,
'$.employees[*]'
COLUMNS (
json CLOB FORMAT JSON PATH '$'
)
) j
WHERE d.department_id = 110
UNION ALL
SELECT j.json
FROM JSON_TABLE(
'{
employees: [
{
name: Chen, John,
job: Accountant,
hireDate: 2005-09-28T00:00:00
},
{
name: Greenberg, Nancy,
job: Finance Manager,
hireDate: 2002-08-17T00:00:00
},
{
name: Urman, Jose Manuel,
job: Accountant,
hireDate: 2006-03-07T00:00:00
}
]
}',
'$.employees[*]'
COLUMNS (
json CLOB FORMAT JSON PATH '$'
)
) j
)JSON_MERGEPATCH(
d.department_data,
(
SELECT JSON_OBJECT(
KEY 'employees'
VALUE JSON_ARRAYAGG( json FORMAT JSON RETURNING CLOB )
FORMAT JSON
)
FROM employees
)
)
WHERE d.department_id = 110;
但是我遇到了这个错误,我不知道哪里错了
错误 :
Error en la línea de comandos : 3 Columna : 5
Informe de error -
Error SQL: ORA-00936: falta una expresión
00936. 00000 - "missing expression"
*Cause:
*Action:
出了什么问题,我正在执行此步骤: LINK
注意:这是我的表的样子:
更新
应用 MP0 建议后,这就是我的查询的样子(两个选项)
但问题是我有这个错误:
ORA-40478: output value too large (maximum: 4000)
您可以使用:
UPDATE departments_json
SET department_data = JSON_MERGEPATCH(
department_data,
(
SELECT JSON_OBJECT(
KEY 'employees'
VALUE JSON_ARRAYAGG( json FORMAT JSON RETURNING CLOB )
FORMAT JSON RETURNING CLOB
)
FROM (
SELECT j.json
FROM departments_json d
CROSS APPLY JSON_TABLE(
d.department_data,
'$.employees[*]'
COLUMNS (
json CLOB FORMAT JSON PATH '$'
)
) j
WHERE d.department_id = 110
UNION ALL
SELECT j.json
FROM JSON_TABLE(
'{
"employees": [
{
"name": "Chen, John",
"job": "Accountant",
"hireDate": "2005-09-28T00:00:00"
},
{
"name": "Greenberg, Nancy",
"job": "Finance Manager",
"hireDate": "2002-08-17T00:00:00"
},
{
"name": "Urman, Jose Manuel",
"job": "Accountant",
"hireDate": "2006-03-07T00:00:00"
}
]
}',
'$.employees[*]'
COLUMNS (
json CLOB FORMAT JSON PATH '$'
)
) j
)
)
RETURNING CLOB
)
WHERE department_id = 110;
输出:
\n部门_ID | DEPARTMENT_DATA \n ------------: | :------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -----\n 110 | {"部门":"会计","员工":[{"姓名":"希金斯,雪莱","工作":"会计经理","hireDate":"2002-06-07T00:00:00"} ,{"name":"Gietz, William","job":"Public Accountant","hireDate":"2002-06-07T00:00:00"},{"name":"Chen, John"," job":"会计师","hireDate":"2005-09-28T00:00:00"},{"name":"Greenberg, Nancy","job":"财务经理","hireDate":"2002 -08-17T00:00:00"},{"name":"Urman, Jose Manuel","job":"会计师","hireDate":"2006-03-07T00:00:00"}]}\n
db<> 在这里摆弄
您的代码有几处错误:
JSON_MERGEPATCH
需要环绕WITH ... SELECT
语句,因为该语句的输出应该是JSON_MERGEPATCH
的第二个参数; 和如果你解决了这个问题,那么你的代码也可以工作:
update departments_json d
set d.department_data = JSON_MERGEPATCH(
d.department_data,
( -- Start of second argument of JSON_MERGEPATCH
WITH employees ( json ) AS (
SELECT j.json
FROM departments_json d
CROSS APPLY JSON_TABLE(
d.department_data,
'$.employees[*]'
COLUMNS (
json CLOB FORMAT JSON PATH '$'
)
) j
WHERE d.department_id = 110
UNION ALL
SELECT j.json
FROM JSON_TABLE(
'{
"employees": [
{
"name": "Chen, John",
"job": "Accountant",
"hireDate": "2005-09-28T00:00:00"
},
{
"name": "Greenberg, Nancy",
"job": "Finance Manager",
"hireDate": "2002-08-17T00:00:00"
},
{
"name": "Urman, Jose Manuel",
"job": "Accountant",
"hireDate": "2006-03-07T00:00:00"
}
]
}',
'$.employees[*]'
COLUMNS (
json CLOB FORMAT JSON PATH '$'
)
) j
)
SELECT JSON_OBJECT(
KEY 'employees'
VALUE JSON_ARRAYAGG( json FORMAT JSON RETURNING CLOB )
FORMAT JSON RETURNING CLOB
)
FROM employees
) -- End of second argument of JSON_MERGEPATCH
RETURNING CLOB
)
WHERE d.department_id = 110;
db<> 在这里摆弄
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.