需要帮助创建 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;
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;