需要帮助创建 Varchar2(32767) 的 oracle 视图 Is JSON column with nested data, says column ambiguously defined

Need assistance creating oracle view of Varchar2(32767) Is JSON column with nested data, says column ambiguously defined

Objective: 创建 table

的 oracle 视图
IMP_API_RESULTS(IMP_API_RESULTS_ID Raw(16), AJ_Results_JSON Varchar2(32767) Is JSON) 

在 AJ_Results_JSON 列中包含嵌套的 JSON 数据。

环境:Oracle 云自治事务处理 (ATP) 19c + APEX 20

问题:如果不包含嵌套数据,则可以创建视图。当包含列名与非嵌套数据(特别是“id”)重复的嵌套数据时,Oracle 给出列定义不明确的错误。 视图在没有嵌套数据的情况下工作正常,但是当使用嵌套标签数据定义时,它会生成不明确的列错误:

Create or Replace View VW_API_Contacts
  As
  Select j.*
    From IMP_API_RESULTS d, 
        json_Table(d.AJ_Results_JSON,
        '$.contacts'
        columns (
          id,
          creator,
          created_at,
          prefix,
          first_name,
          middle_name,
          last_name,
          suffix,
          nickname,
          last_privacy_offering_date,
          nested path '$.contacts.tags[*]'
          columns ( id   Varchar2(10) path '$.contacts.tags.id', 
                    name Varchar2(50) path '$.contacts.tags.name')
          )
         ) j;

这是对 varchar2 的限制 见下文。

连接到: Oracle Database 19c 企业版 19.0.0.0.0 版 - 生产 版本 19.3.0.0.0

SQL> 创建 table IMP_API_RESULTS(IMP_API_RESULTS_ID Raw(16), AJ_Results_JSON Varchar2(32767) 是 JSON) ; 创建 table IMP_API_RESULTS(IMP_API_RESULTS_ID Raw(16), AJ_Results_JSON Varchar2(32767) 是 JSON) * 第 1 行的错误: ORA-00910: 指定的长度与其数据类型相比太长

根据规定,您需要为外部列和嵌套列使用不同的标识符,例如:

      columns ( tag_id Varchar2(10) path '$.contacts.tags.id', 
                name Varchar2(50) path '$.contacts.tags.name')

但是嵌套部分的路径是相对于嵌套行的,所以:

      columns ( tag_id Varchar2(10) path '$.id', 
                name Varchar2(50) path '$.name')

但是你的nested path也是错误的;这是相对于 $.contacts 的,因此不需要再次包含 contacts 元素:

Select j.*
    From IMP_API_RESULTS d, 
        json_Table(d.AJ_Results_JSON,
        '$.contacts'
        columns (
          id,
          creator,
          created_at,
          prefix,
          first_name,
          middle_name,
          last_name,
          suffix,
          nickname,
          last_privacy_offering_date,
          nested path '$.tags[*]'
          columns ( tag_id Varchar2(10) path '$.id', 
                    name Varchar2(50) path '$.name)
          )
         ) j;

db<>fiddle