Если интересно по каким граблям я прошел по парсингам, вот пример из свежей версии 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.
Если интересно по каким граблям я прошел по парсингам, вот пример из свежей версии Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production, он до сих пор не починен у оракла, вопрос задал им о причине, но пока не ответили:
Делаем "чистый" SQL, чтоб не трогать интерпретатор PL кода:
Этот запрос дает пустой курсор на выходе, хотя данные в нем есть ка видите.
Добавляем в запрос одно PL-ное ROWNUM AS r$n поле перед xt.*, у нас отрабатывает интерпретатор кода PL/SQL и вот обида - у нас заполнен курсор з-мя строками.
Ну как так, ну не должен один и тот же запрос на 2-х родных интерпретаторах языка давать разный результат от добавления или удаления полей.
Не поймите меня как Oracle-ненавистника, с версии 9i я считаю эту БД лучшей в мире (и здесь не кидайте камни, это мое личное мнение), когда они в 12-й версии сделали реальную полноценную рекурсию в запросе, захотелось снять шляпу, да же так - снимаю шляпу за такой запрос:
Но тут они явно спешат 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.