带有点表示法和双引号的Oracle 12c JSON查询问题

时间:2015-07-22 18:17:56

标签: json oracle syntax oracle12c

我有一张桌子" EvMetadata"列#34;元数据"检查约束为" IS JSON"。请注意,表及其列是按设计使用DOUBLE QUOTES创建的。

在SQL工作之后,我没有指定任何由Oracle完成的JSON工作。

select 
  m."Metadata"
from "EvMetadata" m

如下所示,元数据列只显示其恰好是JSON数据的内容。

Showing content of "Metadata" column which is 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

3 个答案:

答案 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;