Страницы

Поиск по вопросам

суббота, 11 января 2020 г.

Странности поведения FOR ORDINALITY для json_table с nested path в oracle 12.1

#sql #json #oracle #plsql


Имею 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 some_table s,
     JSON_TABLE (s.clob_for_json,'$[*]' 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.hash = :l_hash


и получаю довольно странный результат для счетчика:

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)


т.е. U_LVL считает строки не своего уровня, а вообще все.

Повторяю запрос на домашней виртуалке с 12.2 - результат ожидаемый:

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)


Самое смешное, что при повторе запроса на оракловском 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)


Это как вообще понимать? Баг? Поведение ORDINALITY настраивается где-то?
    


Ответы

Ответ 1



В итоге оказался баг в json_table, если кому интересно, для исправления нужно установить патч на 12.1.0.2.0, на 12.2 уже исправлено.

Комментариев нет:

Отправить комментарий