Имею 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 уже исправлено.
Комментариев нет:
Отправить комментарий