All streams
Search
Write a publication
Pull to refresh
4
0
Вадим @innerjoin

Программист

Send message

Если интересно по каким граблям я прошел по парсингам, вот пример из свежей версии Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production, он до сих пор не починен у оракла, вопрос задал им о причине, но пока не ответили:

Делаем "чистый" SQL, чтоб не трогать интерпретатор PL кода:

WITH i AS (SELECT xt.* FROM xmltable ('/ROWSET/*' passing xmltype(TO_CLOB('<ROWSET>
  <ROW><TESTFIELD>{"name":"test1","content":"test1"}</TESTFIELD></ROW><ROW><TESTFIELD>{"name":"test2","content":"test2"}</TESTFIELD></ROW><ROW><TESTFIELD>{"name":"test3","content":"test3"}</TESTFIELD></ROW>
</ROWSET>')) COLUMNS testfield CLOB PATH 'TESTFIELD') xt
)
SELECT * FROM i, JSON_TABLE(i.testfield, '$' COLUMNS (tname VARCHAR2(255) PATH '$.name', tcontent CLOB PATH '$.content')) jt

Этот запрос дает пустой курсор на выходе, хотя данные в нем есть ка видите.

Добавляем в запрос одно PL-ное ROWNUM AS r$n поле перед xt.*, у нас отрабатывает интерпретатор кода PL/SQL и вот обида - у нас заполнен курсор з-мя строками.

WITH i AS (SELECT ROWNUM AS r$n, xt.* FROM xmltable ('/ROWSET/*' passing xmltype(TO_CLOB('<ROWSET>
  <ROW><TESTFIELD>{"name":"test1","content":"test1"}</TESTFIELD></ROW><ROW><TESTFIELD>{"name":"test2","content":"test2"}</TESTFIELD></ROW><ROW><TESTFIELD>{"name":"test3","content":"test3"}</TESTFIELD></ROW>
</ROWSET>')) COLUMNS testfield CLOB PATH 'TESTFIELD') xt
)
SELECT * FROM i, JSON_TABLE(i.testfield, '$' COLUMNS (tname VARCHAR2(255) PATH '$.name', tcontent CLOB PATH '$.content')) jt

Ну как так, ну не должен один и тот же запрос на 2-х родных интерпретаторах языка давать разный результат от добавления или удаления полей.

Не поймите меня как Oracle-ненавистника, с версии 9i я считаю эту БД лучшей в мире (и здесь не кидайте камни, это мое личное мнение), когда они в 12-й версии сделали реальную полноценную рекурсию в запросе, захотелось снять шляпу, да же так - снимаю шляпу за такой запрос:

WITH t(y,k) AS ( SELECT 1 AS l, 2 AS k FROM DUAL UNION ALL SELECT y+1, k*2 FROM t WHERE y<= 30 ) SELECT * FROM t

Но тут они явно спешат c JSON_TABLE и это - как солнце облаком на чистом небосклоне закрыло :)

На 12.1.0.2 потребовалось привлекать админов DBA, иначе Oracle выдавал ошибку на CLOB`е - ORA-40484: недопустимый тип данных для столбца JSON_TABLE, но оптимизация запроса все равно не работала и запросы вели себя как описал выше.

У нас уже пропатчили до Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 и проблема медленного запроса исчезла.

Из за деревьев не видно леса. Для понимания смысла вложенного в статью - максимальная универсальность в создании модулей взаимодействия между различными процессами, правильно подойти к этому вопросу - и на выходе инструмент, позволяющий штамповать процессы деятельности предприятия в real-time.

Information

Rating
Does not participate
Location
Сергиев Посад, Москва и Московская обл., Россия
Works in
Date of birth
Registered
Activity