Оракул Version Я использую это:С XML внутри CLOB, в Oracle таблицу со списком путей
BANNER
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
PL/SQL Release 10.2.0.4.0 - Production
CORE 10.2.0.4.0 Production
TNS for IBM/AIX RISC System/6000: Version 10.2.0.4.0 - Productio
NLSRTL Version 10.2.0.4.0 - Production
В предыдущем вопросе, я спросил, как преобразовать CLOB в таблице, см это :
From XML to list of paths in Oracle PL/SQL environment
ответ, который я получил, был велик, и это работает для XML не слишком большой.
Но если у меня есть таблица под названием MY_TABLE_ONE с полем под названием MY_FIELD, который является CLOB с очень большим содержанием (например, 500 Кбайт), следующий оператор не выходит в течение разумного времени:
CREATE TABLE MY_TABLE_TWO
AS
WITH PARAMS AS (SELECT XMLTYPE (MY_FIELD) FROM MY_TABLE_ONE)
SELECT ELEMENT_PATH, ELEMENT_TEXT
FROM XMLTABLE (
'
for $i in $doc/descendant-or-self::*
return <element>
<element_path> {$i/string-join(ancestor-or-self::*/name(.), ''/'')} </element_path>
<element_content> {$i/text()}</element_content>
</element>
'
PASSING (SELECT * FROM PARAMS) AS "doc"
COLUMNS ELEMENT_PATH VARCHAR2 (4000) PATH '//element_path',
ELEMENT_TEXT VARCHAR2 (4000) PATH '//element_content'
);
Есть ли альтернативный способ преобразования XML, хранящегося в столбце CLOB, в таблицу Oracle со списком путей и соответствующих значений более эффективным образом?
Вышеприведенное заявление является правильным, но для его завершения требуется слишком много времени.
Большое спасибо за рассмотрение моей просьбы.
EDIT:.
Я пытался с этим итеративным решением, без успеха :-(
BEGIN
DECLARE
CURSOR S_CUR
IS
WITH PARAMS AS (SELECT XMLTYPE (MY_FIELD) FROM MY_TABLE_ONE)
SELECT ELEMENT_PATH, ELEMENT_TEXT
FROM XMLTABLE (
'
for $i in $doc/descendant-or-self::*
return <element>
<element_path> {$i/string-join(ancestor-or-self::*/name(.), ''/'')} </element_path>
<element_content> {$i/text()}</element_content>
</element>
'
PASSING (SELECT * FROM PARAMS where rownum < 101) AS "doc"
COLUMNS ELEMENT_PATH VARCHAR2 (4000) PATH '//element_path',
ELEMENT_TEXT VARCHAR2 (4000) PATH '//element_content'
);
TYPE FETCH_ARRAY IS TABLE OF S_CUR%ROWTYPE;
S_ARRAY FETCH_ARRAY;
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET DB_FILE_MULTIBLOCK_READ_COUNT=256';
EXECUTE IMMEDIATE 'TRUNCATE TABLE GOOFY99 DROP STORAGE';
OPEN S_CUR;
LOOP
FETCH S_CUR
BULK COLLECT INTO S_ARRAY
LIMIT 500;
FORALL I IN 1 .. S_ARRAY.COUNT
INSERT /*+APPEND */
INTO GOOFY99
VALUES S_ARRAY (I);
COMMIT;
EXIT WHEN S_CUR%NOTFOUND;
END LOOP;
CLOSE S_CUR;
COMMIT;
END;
END;
Не могли бы вы разместить где-нибудь проблематично большой файл XML? (Мне не нравится это говорить, но я еще не знаю синтаксиса XmlQuery, поэтому я не могу перестроить структуру XML из вашего выбора.) – nop77svk
XML содержит зарезервированные данные и теги, поэтому я должен изменить его перед публикацией в интернете ... Это не так сразу! – UltraCommit
Понял. Не торопись. – nop77svk