我有一张桌子" EvMetadata"列#34;元数据"检查约束为" IS JSON"。请注意,表及其列是按设计使用DOUBLE QUOTES创建的。
在SQL工作之后,我没有指定任何由Oracle完成的JSON工作。
select
m."Metadata"
from "EvMetadata" m
如下所示,元数据列只显示其恰好是JSON数据的内容。
但是,如果我按照以下方式发出json查询,我会收到错误。
select
m."Metadata"."FileName"
from "EvMetadata" m
我刚刚添加了" FileName"使用点符号。如您所见," FileName"是一个有效的json字段。那么为什么会出错?
错误是
ORA-00904:" M"。"元数据"。" FileName":无效标识符00904. 00000 - "%s:无效标识符&# 34; *原因:*操作:行错误:2列:3
在使用双引号声明数据库对象的特定场景下,使用点符号时,这可能是Oracle的JSON查询支持的错误吗?我怀疑可能是真的原因是以下等效查询,不使用点符号,可以工作。
select
JSON_VALUE(m."Metadata", '$.FileName')
from "EvMetadata" m
答案 0 :(得分:5)
您需要在列上使用“IS JSON”检查约束才能使点符号起作用:
以下是文档的摘录:
每个json_key必须是有效的SQL标识符,并且该列必须具有is json检查约束,以确保它包含格式正确的JSON数据。如果不遵守这些规则中的任何一个,则在查询编译时会引发错误。 (必须存在检查约束以避免引发错误;但是,它不需要处于活动状态。如果停用约束,则不会引发此错误。)
这是我用来验证它是如何工作的测试示例:
summary
答案 1 :(得分:2)
如果其他人遇到此问题,请在注释2192052.1
中记录在Oracle Support中基本上,这是一个错误,因为Dot Notation不会对使用NOT NULL约束创建的列起作用,即
如果你这样做:
CREATE TABLE foo.bar (id NUMBER NOT NULL, json_doc CLOB NOT NULL CHECK (json_doc IS JSON));
运行时会出现错误:
SELECT a.json_doc.elementName FROM foo.bar a;
但如果你这样做:
CREATE TABLE foo.bar (id NUMBER NOT NULL, json_doc CLOB CHECK (json_doc IS JSON));
ALTER TABLE bar MODIFY (json_doc NOT NULL);
点符号将起作用。
答案 2 :(得分:-1)
你不需要引号,这应该有效:
ContentResolver
请参阅官方documentation的示例:
select m.Metadata.FileName from EvMetadata m
SELECT po.po_document.PONumber FROM j_purchaseorder po;