我在将JSON_QUERY结果的虚拟列创建到表中的JSON字段时遇到问题。有趣的是,我能够创建几个这样的列,但是其中一个很麻烦,使Oracle实例无法使用。
JSON保存在名为PRODUCT的表中名为DESCRIPTION的列中,并包含一个如下所示的JSON对象:
{
"id": 1,
"name": "foo",
"codes": ["A","B","C"],
"packages": [
{
"number": "1234",
"size": "small"
},
{
"number": "5678",
"size": "medium"
}
]
}
可以毫无问题地查询信息。 E.g。
SELECT JSON_QUERY(DESCRIPTION, '$.codes') FROM PRODUCT
返回[[A“,”B“,”C“]和命令
ALTER TABLE PRODUCT ADD (CODES VARCHAR2(500) GENERATED ALWAYS AS (JSON_QUERY(DESCRIPTION, '$.codes' RETURNING VARCHAR2(500))));
创建一个包含正确内容的列。
但是现在我的问题是:如果我对包号尝试相同的事情,那么创建虚拟列会破坏Oracle实例 - 不要在你关心的实例上尝试这个。
查询数据完全正常:
SELECT JSON_QUERY(DESCRIPTION, '$.packages[*].number' WITH WRAPPER) FROM PRODUCT;
给了我[“1234”,“5678”]。但是试图创建一个虚拟列:
ALTER TABLE PRODUCT ADD (PACKAGE_NUMBERS VARCHAR2(500) GENERATED ALWAYS AS (JSON_QUERY(DESCRIPTION, '$.packages[*].number' WITH WRAPPER RETURNING VARCHAR2(500))));
返回我没有错误,一切看起来都很好,但是在这个命令之后我发送给数据库的每个SQL命令都回答:
Error: ORA-00907: missing right parenthesis
SQLState: 42000
ErrorCode: 907
我唯一可以做的就是抛弃实例并从头开始。
任何人都知道我做错了什么?