在Oracle 12.1中使用嵌套路径的json_table查询的ORDINALITY列行为很奇怪

时间:2018-01-18 09:01:31

标签: sql json oracle plsql

我在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行为?

1 个答案:

答案 0 :(得分:0)

这是12.1中JSON_TABLE函数中的已知错误。如果您无法升级到12.2,则可以使用补丁,但您必须拥有支持帐户才能获得补丁。

有关详细信息,请参阅Oracle支持网站Doc ID 2301973.1