我有一个表“EvMetadata”,其中“Metadata”列的检查约束为“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:无效标识符”*原因:*操作:行错误:2列:3
在使用双引号声明数据库对象的特定场景下使用点表示法时,这可能是Oracle JSON查询支持的错误吗?我怀疑可能是真的原因是以下等效查询,不使用点符号,有效 .
select
JSON_VALUE(m."Metadata", '$.FileName')
from "EvMetadata" m
3 回答
您需要在列上使用“IS JSON”检查约束才能使点符号起作用:
以下是文档的摘录:
这是我用来验证它是如何工作的测试示例:
如果其他人遇到此问题,请在注释2192052.1中记录在Oracle Support中
基本上,这是一个错误,因此Dot Notation不会对使用NOT NULL约束创建的列起作用,即
如果你这样做:
你运行时会得到错误:
但如果你这样做:
点符号将起作用 .
你不需要引号,这应该工作:
select m.Metadata.FileName from EvMetadata m
请参考官方documentation的例子: