我在clob中有一个JSON文本:
[
{
"debitOverturn": "939.34",
"table": [
{
"debit": "",
"credit": "939.34"
},
{
"debit": "939.34",
"credit": ""
}
]
},
{
"debitOverturn": "939.34",
"table": [
{
"debit": "",
"credit": "939.34"
},
{
"debit": "939.34",
"credit": ""
}
]
}
]
尝试在oracle 12.1上查询它:
SELECT jt.u_lvl,
jt.debitOverturn,
jt.l_lvl,
jt.debit,
jt.credit
FROM test1 s,
JSON_TABLE (s.json_data,'$[*]' COLUMNS (
u_lvl FOR ORDINALITY,
debitOverturn VARCHAR2(20) PATH '$.debitOverturn',
NESTED PATH '$.table[*]'
COLUMNS (
l_lvl FOR ORDINALITY,
debit VARCHAR2(38) PATH '$.debit',
credit VARCHAR2(38) PATH '$.credit'))) AS jt
WHERE s.id = 1;
并在u_lvl列中看到一些奇怪的结果:
U_LVL DEBITOVERTURN L_LVL DEBIT CREDIT
1 939.34 1 (null) 939.34
2 939.34 2 939.34 (null)
3 939.34 1 (null) 939.34
4 939.34 2 939.34 (null)
看起来FOR ORDINALITY列会计算查询中的所有行而不是其级别的行。因此,我尝试使用Oracle 12.2在我的家庭VM服务器上重新运行任务,并获得了不同(并且更可靠)的结果:
U_LVL DEBITOVERTURN L_LVL DEBIT CREDIT
1 939.34 1 (null) 939.34
1 939.34 2 939.34 (null)
2 939.34 1 (null) 939.34
2 939.34 2 939.34 (null)
然后我尝试在Oracle Livesql服务器(livesql.oracle.com)上运行相同的查询并得到另一个结果:
U_LVL DEBITOVERTURN L_LVL DEBIT CREDIT
1 939.34 1 (null) 939.34
1 939.34 2 939.34 (null)
1 939.34 1 (null) 939.34
1 939.34 2 939.34 (null)
这是Oracle的错误吗?或主要数据库版本之间的差异?是否可以在某些深度数据库设置中调整FOR ORDINALITY行为?
答案 0 :(得分:0)
这是12.1中JSON_TABLE
函数中的已知错误。如果您无法升级到12.2,则可以使用补丁,但您必须拥有支持帐户才能获得补丁。
有关详细信息,请参阅Oracle支持网站Doc ID 2301973.1。