Страницы

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

пятница, 1 марта 2019 г.

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

Имею 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 настраивается где-то?


Ответ

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

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

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