XML - статьи

Пакет DBMS_XMLSTORE


DBMS_XMLSTORE - это PL/SQL-пакет, который обеспечивает добавление XML-данных в таблицы базы данных. Эта C-базированная реализация обеспечивает лучшую производительность и системную управляемость, чем Java-базированный пакет DBMS_XMLSave. Этот пакет устраняет накладные издержки в начале работы Oracle JVM такие, как транслирование имен Java-классов при каждом вызове методов. Кроме того, DBMS_XMLSTORE построен на основании анализатора SAX, а не на анализаторе DOM. Соответственно, он лучше масштабирует большие XML-документы. Вы можете заметить это в следующем сопоставлении, используя эталонную схему SH: SQL> SELECT count(1) FROM sales; COUNT(1) ---------- 1136945 SQL> CREATE TABLE test AS SELECT * FROM sales; Table created. SQL> CREATE TABLE result AS SELECT * FROM sales WHERE 0=1; Table created. SQL> SELECT count(1) FROM test; COUNT(1) ---------- 1136945 SQL> SELECT count(1) FROM result; COUNT(1) ---------- 0 SQL> SET timing ON SQL> DECLARE 2 qryCtx DBMS_XMLQuery.ctxHandle; 3 v_clob CLOB; 4 savCtx DBMS_XMLSave.ctxType; 5 v_rows NUMBER; 6 BEGIN 7 -- Query out the content 8 qryCtx := DBMS_XMLQuery.newContext('SELECT * FROM test'); 9 v_clob := DBMS_XMLQuery.getXml(qryCtx); 10 DBMS_OUTPUT.PUT_LINE('CLOB size = 'DBMS_LOB.GETLENGTH(v_clob)); 11 -- Save the content 12 savCtx := DBMS_XMLSave.newContext('RESULT'); 13 v_rows := DBMS_XMLSave.insertxml(savCtx,v_clob); 14 DBMS_XMLSave.closeContext(savCtx); 15 DBMS_OUTPUT.PUT_LINE(v_rows ' rows inserted...'); 16 END; 17 / DECLARE * ERROR at line 1: ORA-29532: Java call terminated by uncaught Java exception: java.lang.OutOfMemoryError ORA-06512: at "SYS.DBMS_XMLSAVE", line 114 ORA-06512: at line 13 Elapsed: 00:11:57.05

В предшествующем примере таблица sales эталонной схемы SH, описанная в Главе 8, используется для формирования большого XML-документа, который, когда анализируется, слишком велик для сконфигурированной памяти хранения Oracle JVM. Вы можете увеличить JAVA_POOL_SIZE, чтобы выделить больше памяти для обработки, однако, это может быть не достаточно, особенно, когда эта память выбирается из пула оперативной памяти базы данных. В Oracle Database 10g вы можете воспользоваться пакетом DBMS_XMLSTORE для разрешения этой проблемы, как показано далее: DECLARE v_clob CLOB; savCtx DBMS_XMLSTORE.ctxType; v_rows NUMBER; BEGIN -- Query out the content SELECT doc INTO v_clob FROM temp_clob; -- Save the content savCtx := DBMS_XMLSTORE.newContext('RESULT'); -- Set the update columns to improve performance DBMS_XMLSTORE.SetUpdateColumn (savCtx, 'PROD_ID'); DBMS_XMLSTORE.SetUpdateColumn (savCtx, 'CUST_ID'); DBMS_XMLSTORE.SetUpdateColumn (savCtx, 'TIME_ID'); DBMS_XMLSTORE.SetUpdateColumn (savCtx, 'CHANNEL_ID'); DBMS_XMLSTORE.SetUpdateColumn (savCtx, 'PROMO_ID'); DBMS_XMLSTORE.SetUpdateColumn (savCtx, 'QUANTITY_SOLD'); DBMS_XMLSTORE.SetUpdateColumn (savCtx, 'AMOUNT_SOLD'); -- Insert the document v_rows := DBMS_XMLSTORE.insertxml(savCtx,v_clob); DBMS_XMLSTORE.closeContext(savCtx); DBMS_OUTPUT.PUT_LINE(v_rows ' rows inserted...'); END;

Рекомендуется использовать функцию SetUpdateColoumn() из DBMS_XMLSTORE всегда, когда это подходит, как было в предыдущем примере, потому как это позволяет программе DBMS_XMLSTORE узнать список столбцов, которые должны быть обновлены для использования явного SQL-связывания с XML-данными. Предыдущий пример использует следующее SQL-выражение при подготовке к добавлению данных: INSERT INTO sales(prod_id, cust_id, ..., amount_sold) values (:1, :2, ..., :6);

Это ускоряет процесс вставки данных, устраняя накладные расходы от парсинга (parsing – синтаксический анализ) SQL-предложений в базе данных.



Содержание раздела