Зберігання XML даних. Частина 2, Інші СУБД, Бази даних, статті

Частина 1

Репозиторій Oracle XML DB

Репозиторій Oracle XML DB може функціонувати як файлова система в базі даних Oracle. Будь-які дані репозиторію Oracle XML DB відображаються на ресурси, які мають колійне (pathname – складене) ім’я (або URL) і збережені в BLOB або в об’єкті XMLType. Репозиторій XML DB надає можливість вичерпного управління цими ресурсами.

Ви вже вивчили, як завантажувати XML за допомогою протоколу інтерфейсів репозиторію XML DB. У цій секції ми обговоримо інші теми: можливість версії контролювати документи і створені зв’язку, управління ресурсами. Ми також обговоримо основні PL / SQL пакети, що забезпечують цю функціональність:


Управління ресурсами

В Oracle Database 10g ви можете використовувати модуль DBMS_XDB для створення і видалення ресурсів, папок-фолдера та зв’язків ресурсів. Ви також можете використовувати цей модуль для блокування / розблокування ресурсів під час читання або поновлення XML даних:

DECLARE
res BOOLEAN;
xr REF XMLType;
x XMLType;
BEGIN
FOR po_rec IN (SELECT rownum id, ref(p) xref FROM customer p
ORDER BY rowid)
LOOP
res:=DBMS_XDB.createResource(“/public/customer”//po_rec.id//
“.xml”, po_rec.xref);
END LOOP;
END;

У цьому прикладі всі записи про клієнтів зчитуються з таблиці customer і ресурсні XML документи, створені в директорії /public репозиторію XML DB, використовують функцію DBMS_XDB.createResource(). Додатково в репозиторії XML DB можна створити папку /public/important_customer, як показано нижче:

DECLARE
retb BOOLEAN;
BEGIN
retb := DBMS_XDB.createFolder(“/public/important_customer”);
COMMIT;
END;
/

Далі, можна створити якийсь ресурс README.txt для відображення вмісту цієї папки:

DECLARE
res BOOLEAN;
BEGIN
res :=
DBMS_XDB.createResource(“/public/important_customer/README.txt”,
“This folder lists all of the US customer who are important to
our business”);
COMMIT;

END;
/


З того моменту як створений в директорії /public список клієнтів, можна створити набір зв’язків, замість створення другої копії даних:

EXEC DBMS_XDB.link(“/public/customer1.xml”,
“/public/important_customer/”,”SteveJones.xml”);

Якщо ви хочете видалити ресурс, можна використовувати функцію DBMS_XDB.DeleteResource():

DBMS_XDB.DeleteResource
(“/public/important_customer/SteveJones.xml”);
DBMS_XDB.DeleteResource (“/public/customer1.xml”);

Ви можете видалити ресурс із ресурсними на нього зв’язками. Зрозуміло, після переміщення оригінального ресурсу всі пов’язані ресурси більше з ним не пов’язані. Кожен з них замість цього буде містити копію даних.

Контроль версій

Пакети DBMS_XDB_VERSION і DBMS_XDBPL / SQL забезпечують функцію контролю версій Oracle XML DB, яка дає спосіб створення і управління різними версіями Version-Control Resource (VCR) в Oracle XML DB.

Коли XML DB ресурс вбудований в VCR, якийсь прапорець маркує його як VCR, і поточний ресурс стає вихідною версією. Ця версія фізично не зберігається в базі даних. Іншими словами, немає додаткової копії цього ресурсу, збереженої, коли він був зроблений версією. Наступні версії зберігаються в тих же таблицях. Коль скоро версія ресурсу стає системно-згенерованої, вона позбавляється складеного (pathname) імені. Але ви все ще можете отримати доступ до ресурсу через функцію, надану в пакеті DBMS_XDB_VERSION.

Коли перевіряється ресурс, ні який інший користувач не може його поновити. Коли ресурс оновлюється вперше, створюється його копія. Ви можете зробити кілька змін ресурсу без зворотного ефекту. Ви завжди будете отримувати останні версії ресурсу, навіть якщо у вас є різні користувачі. Коли ресурс перезапускається, оригінальна версія, яка закінчує роботу, міститься на місце звичайного постійного зберігання.

Характеристики версій для VCR містяться в репозиторії XML DB. У цьому релізі версійність працює тільки для небазіруемих на схемах (non-schema-based) ресурсах. Таким чином, XMLType, що базується на роздільних XML-документах, і XMLType CLOB, які володіють приєднаними схемами, офіційно не підтримують використання VCR. Тим не менш, ми виявили, що до тих пір, поки ви не створите унікальні метадані, асоційовані з конкретною версією, наприклад індекси, VCR будуть працювати.

ЗАУВАЖЕННЯ

Ви не можете перемкнутися з VCR на не-VCR.

Oracle XML DB надає функції для відстеження всіх змін в VCR Oracle XML DB. Наступний код демонструє ці функції:

DECLARE
resid DBMS_XDB_VERSION.RESID_TYPE;
BEGIN
resid := DBMS_XDB_VERSION.MakeVersioned(“/public/important_customer/
SteveJones.xml”);
END;
/

Ви можете отримати ідентифікатор ресурсу VCR:

SET AUTOPRINT ON
VAR OUT CLOB
DECLARE
resid DBMS_XDB_VERSION.RESID_TYPE;
res XMLType;
BEGIN
resid := DBMS_XDB_VERSION.MakeVersioned
(“/public/important_customer/SteveJones.xml”);
— Obtain the resource
res := DBMS_XDB_VERSION.GetResourceByResId(resid);
SELECT res.getClobVal() INTO :OUT FROM dual;
END;

Для поновлення VCR вам знадобиться перевірити ресурс, виконати оновлення файлів і потім повернути їх в репозиторій XML DB:

DECLARE
resid DBMS_XDB_VERSION.RESID_TYPE;
BEGIN
DBMS_XDB_VERSION.CheckOut(“/public/important_customer/SteveJones.xml”);
resid :=
DBMS_XDB_VERSION.CheckIn(“/public/important_customer/SteveJones.xml”);
END;

Зауважимо, що ресурси не оновляться до тих пір, поки перевіряється новий файл. Якщо ви хочете завершити перевірку, ви можете “распроверіть” ресурс:

DECLARE
resid DBMS_XDB_VERSION.RESID_TYPE;
BEGIN
resid :=
DBMS_XDB_VERSION.UncheckOut
(“/public/important_customer/SteveJones.xml “);
END;

Збереження XML документів в реляційних таблицях

Реляційні таблиці зазвичай проектуються, не беручи до уваги зберігання XML. Однак у багатьох випадках ці таблиці можуть бути використані для збереження розщеплених (shredded) XML-документів і породження корисних XML-відображень за допомогою створення XMLType-уявлень, що використовують XML-опції Oracle Database 10 g, або генеруючих XML з використанням Oracle XDK.

Зберігання XML-даних в реляційних таблицях зручно, якщо вашому додатком потрібно позбутися від таких обмежень XMLType-зберігання, як обмеження на еволюцію XML-схеми або репліцірованія даних. Реляційне зберігання також широко використовується додатками, які потребують низько рівневому доступі до даних з XML-документів, поки не потрібен захист повної ієрархічної структури XML.

Oracle Database 10 g надає велику підтримку для завантаження, експортування та обробки XML-даних в реляційних таблицях. Для завантаження XML-даних ви можете використовувати утиліту XML SQL Utility (XSU), яка забезпечує обидва: Java і PL / SQL програмних інтерфейсу, а також утиліти командного рядка. Утиліта TransX Utility (Translation XML), побудована на XSU, спрощує подальше перетворення набору символів (character set) перед завантаженням даних, а XSQL Servlet надає HTTP-інтерфейси. Якщо для вашого застосування недостатньо функціональності, пропонованої даними утилітами, ви можете використовувати їх програмний API в об’єднанні з іншими бібліотеками XDK для побудови власного рішення.

Утиліта XML SQL Utility

XSU пропонує API, що базуються на Java, утиліти командного рядка і PL / SQ-пакети, які підтримують завантаження XML-даних в реляційні таблиці, включаючи таблиці, що містять стовпці XMLType. Ми в наступних розділах розглянемо, як можна використати цю функціональність.

Канонічне відображення

Перше, що вам слід зробити перед використанням XSU, це зрозуміти, чи буде використовуватися канонічне відображення XSU для відображення XML в реляційні таблиці і візуалізувати результати SQL-запитів в XML. В даному канонічному відображенні елемент <ROWSET> є кореневим елементом XML-документа, а його дочірні елементи <ROW> відображаються в стовпці даних у таблицях. Імена дочірніх елементів для кожного елемента <ROW> відображаються в імена табличних стовпців або імена об’єктів, з яких повертаються результати. Атрибути num елементів <ROW> є номерами, за якими доступна замовлена ​​інформація. Далі слід приклад відображення XML-схеми цієї структури метаданих:

><xs:schema xmlns:xs=”http://www.w3.org/2001/XMLSchema”
elementFormDefault=”qualified” attributeFormDefault=”unqualified”>
<xs:element name=”ROWSET”>
<xs:complexType>
<xs:sequence>
<xs:element name=”ROW”>
<xs:complexType>
<xs:sequence>
<xs:any/>
</xs:sequence>
<xs:attribute name=”num” type=”xs:string” use=”optional”/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

XSU надає способи зміни імен елементів <ROWSET> і <ROW>. Наприклад, таблиця CUSTOMER_TBL визначаться так:

CREATE TABLE CUSTOMER_TBL (
NAME VARCHAR2(100),
ADDRESS VARCHAR2(200),
EMAIL VARCHAR2(200),
PHONE VARCHAR2(50),
DESCRIPTION VARCHAR2(4000));

XML-документ відображається в таблицю канонічним відображенням, як показано далі:

<ROWSET>
<ROW>
<NAME>Steve Jones</NAME>
<EMAIL>Steve.Jones@example.com</EMAIL>
<ADDRESS>Someroad, Somecity, Redwood Shores, CA 94065, U.S.A</ADDRESS>
<PHONE>6505723456</PHONE>
<DESCRIPTION>Very Important US Customer</DESCRIPTION>
</ROW>
</ROWSET>

ЗАУВАЖЕННЯ

За замовчуванням всі імена таблиць, стовпців і об’єктів пишуться на верхньому регістрі. Таким чином, якщо ви хочете правильно вставити XML-документ зі змішаними регістрами, то вам необхідно специфікувати опції ignoreCase під час використання XSU.

Щоб належним чином запустити XSU утиліту з командного рядка, вам потрібно встановити наступні Java-пакети в ваш Java CLASSPATH:


ЗАУВАЖЕННЯ

Вам може знадобитися вставити пакет orai18n.jar в ваш Java CLASSPATH, коли оперуєте XML з різними наборами символів. Інакше ви можете отримати oracle.xml.sql.OracleXMLSQLException: ‘java.sql.SQLException: Non supported character set …’

XSU залежить від синтаксичного аналізатора XML, щоб побудувати DOM, а також залежить від JDBC-драйвера для підключення до бази даних Oracle і вилучення мета даних. Після того як Java CLASSPATH встановлено належним чином, ви можете запустити утиліту командного рядка XSU за допомогою java OracleXML, яка має дві опції: getXML для запитів до бази даних і putXML для додавання даних до бази даних.

ЗАУВАЖЕННЯ

Операції оновлення та видалення не включені в утиліту командного рядка XSU, але вони підтримуються Java і API PL / SQL.

Наприклад, для додавання XML-даних в contact01.xml можна задіяти наступну команду:

java OracleXML putXML -conn “jdbc:oracle:thin:@localhost:1521:orclX”

-user “demo/demo” -fileName “customer1_xsu.xml” “customr_tbl”

Дані додані в таблицю CUSTOMER_TBL в схемі demo. Для запиту вмісту таблиці і повернення результатів в XML можна задіяти наступну XSU команду:

java OracleXML getXML -conn “jdbc:oracle:thin:@localhost:1521:orclX”

-user “demo/demo” “SELECT * FROM customer_tbl”

Повертається наступний XML-документ:

<?xml version = “1.0”?>
<ROWSET>
<ROW num=”1″>
<NAME>Steve Jones</NAME>
<ADDRESS>Someroad, Somecity, Redwood Shores, CA 94065, U.S.A</ADDRESS>
<EMAIL>Steve.Jones@example.com</EMAIL>
<PHONE>6505723456</PHONE>
<DESCRIPTION>Very Important US Customer</DESCRIPTION>
</ROW>
</ROWSET>

У цьому випадку дані XML-документа успішно завантажені в база даних. Однак додаються XML-документи не завжди перебувають у канонічному форматі. Як слід поводитися з такими документами? Звичайний прийом – Це використання XSLT-таблиці стилів для трансформування XML-документа в канонічний формат. З іншого боку, ви можете створити об’єктні представлення в базі даних, що відображають вхідний XML-формат.

Об’єктні подання

Якщо XML-документ не знаходиться в канонічному форматі, ви можете створити об’єктні подання або XMLType-вистави, щоб дозволити XSU відображати XML-документи в таблиці бази даних. Як показано далі, контактна інформація зберігається в наступному contact.xml XML-документі:

<Contact_List>
<Contact>
<User_id>userid</User_id>
<First_Name>Steve</First_Name>
<Last_Name>Jones</Last_Name>
<Business>
<Email>Steve.Jones@oracle.com</Email>
<Phone>(650)5769801</Phone>
<Address>
<Street1>4op11</Street1>
<Street2>500 Oracle Parkway</Street2>
<City>Redwood Shores</City>
<State>CA</State>
<Zipcode>94065</Zipcode>
<Country>USA</Country>
</Address>
</Business>
</Contact>
</Contact_List>

Схема бази даних визначається, як показано далі:

CREATE TYPE address_typ AS OBJECT(
street1 VARCHAR2(200),
street2 VARCHAR2(200),
city VARCHAR2(100),
state VARCHAR2(20),
zipcode VARCHAR2(20),
country VARCHAR2(20));
/
CREATE TABLE contact_tbl(
contactid VARCHAR2(15) PRIMARY KEY,
firstname VARCHAR2(100),
lastname VARCHAR2(200),
midname VARCHAR2(50),
business_phone VARCHAR2(20),
home_phone VARCHAR2(10),
cell_phone VARCHAR2(20),
business_addr address_typ,
business_email VARCHAR2(150));

Використовуючи канонічне відображення, XML-документ не може безпосередньо відобразиться в стовпцях таблиці, як документ, що містить декілька рівнів. Таким чином, для того, щоб вставити XML-документ, потрібно створити наступне об’єктне уявлення:

CREATE TYPE contactinfo_type AS OBJECT(
phone VARCHAR2(20),
email VARCHAR2(150),
address address_typ);
/
— Create Object View
CREATE VIEW contact_view AS
SELECT contactid AS user_id, firstname AS first_name, lastname AS
last_name,midname AS mid_name,
contactinfo_type(business_phone,business_email,
business_addr) AS business
FROM contact_tbl;

Далі ви можете запустити наступну команду для завантаження XML-файла в CUSTOMER_VIEW:

java OracleXML putXML -conn “jdbc:oracle:thin:@localhost:1521:orclX”
-user “demo/demo” -fileName “contacts.xml” “contact_view”

У даному прикладі contact_view використовується база даних Oracle для відображення XML-даних в базові таблиці. Однак, у багатьох випадках ці типи уявлень не будуть оновлюваними, коли вони містять багаторівневі таблиці з’єднання або об’єкти типу успадкування. Далі для поводження з сукупністю даних у цих таблицях і об’єктів ви повинні створити INSTEAD-OF-TRIGGERS для уявлень.

Розподіл XML-документів на фрагменти

Коли зберігаєте XML-документ, ви іноді не хочете відображати кожен XML-елемент у стовпцях реляційної таблиці. Замість цього, ви можете захотіти зберегти деякі XML-фрагменти в XML CLOB або XMLType. Наступний приклад ілюструє підхід у використання XSLT для створення таких XML-фрагментів і вставки цих же XML-фрагментів в один стовпець XMLType-таблиці, використовуючи XSU. У прикладі додається XML-документ представлений як:

<Contact_List>
<Contact>
<User_id>jwang</User_id>
<First_Name>Jinyu</First_Name>
<Last_Name>Wang</Last_Name>
<Title>Senior Product Manager</Title>
<Description>Jinyu manages the <PRODUCT>Oracle XML Developer”s
Kit</PRODUCT> product.</Description>
</Contact>
</Contact_List>

Елемент <Description> містить змішаний контент, який ми не хочемо відображати (to map) в декілька стовпців таблиці. Таблиці contact_tbl визначається, як показано далі:

CREATE TABLE contact_tbl(
contactid VARCHAR2(15) PRIMARY KEY,
firstname VARCHAR2(100),
lastname VARCHAR2(200),
midname VARCHAR2(50),
description CLOB);

Для відображення елемента <Description> в стовпець description, використовуючи XSU, вам потрібно задіяти наступну setCDATA.xsl таблицю стилів XSL:

<xsl:stylesheet version=”1.0″
xmlns:xsl=”http://www.w3.org/1999/XSL/Transform”>
<xsl:output cdata-section-elements=”CODE”/>
<!– Identity transformation –>
<xsl:template match=”*/@*/comment()/processing-instruction()/
text()”>
<xsl:copy>
<xsl:apply-templates select=”*/@*/comment()/processing-instruction()/
text()”/>
</xsl:copy>
</xsl:template>
<xsl:template match=”Description”>
<xsl:element name=”Description”>
<xsl:copy-of select=”@*/comment()/processing-instruction()”/>
<xsl:text disable-output-escaping=”yes”><![CDATA[</xsl:text>
<xsl:apply-templates select=”*/./*/@*/./*/comment()/./*/
processing-instruction()/text()”/>
<xsl:text disable-output-escaping=”yes”>]]></xsl:text>
</xsl:element>
</xsl:template>
</xsl:stylesheet>

Це XSLT-перетворення трансформує входить XML-документ і включить всі дочірні елементи <Description> в одну секцій CDATA, так що кожна секція CDATA може бути збережена за допомогою XSU в стовпці description.

Ви можете модифікувати таблицю стилів XSL для вашого додатки, спеціфіціруя різні match-Атрибути за наступним шаблоном:

<xsl:template match=”Description”>… </ xsl:template>

XPath в match-Атрибуті специфікує кореневої елемент для збереження XML-фрагмента.

ЗАУВАЖЕННЯ

Так як XSLT вимагає, щоб DOM був вбудований в пам’ять, вам може знадобитися перед перетворенням розбиття великого документа.

Утиліта TransX Utility

Коли відбувається заповнення бази даних Oracle багатомовними даними або перетворення даних, або коли відбувається кодування, потрібна перевірка достовірності кожного XML-файла. Традиційний шлях вирішення – Це переключення установки NLS_LANG, як ніби ви переключаєтеся на завантаження файлів з різними кодовими таблицями. Параметр NLS_LANG визначає таблицю символів для завантаженого в базу даних файлу. Цей підхід схильний до помилок, тому що кодова інформація підтримується окремо від самих даних. Постійно перевстановлювати NLS_LANG – дуже нудна робота.

При використанні TransX Utility, передбаченої XDK, кодова інформація міститься разом з даними в XML-документі в зумовленому форматі. Таким чином, багатомовні дані можуть бути перемешена без перемикання настройки NLS_LANG. TransX Utility підтримує коректний набір символів на всьому протязі процесу транслювання даних і успішно завантажує його в базу даних. Ми не будемо детально розглядати використання TransX Utility. Але ми розглянемо деякі приклади, щоб ви змогли побачити її функціональні можливості.

Пакет 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 10 g ви можете скористатися пакетом 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-пропозицій в базі даних.

Використання зовнішніх таблиць

З’явився в Oracle9 i механізм зовнішніх таблиць пропонує можливість визначення таблиці в базі даних, а зберігання табличних даних окремо від неї, поза базою даних. До Oracle Database 10 g зовнішні таблиці могли бути використані тільки як таблиці для читання. Іншими словами, якщо ви створюєте зовнішню таблицю для XML-файлів, ці файли можуть бути запитані, а таблиця може бути з’єднана з іншими таблицями. Тим не менш, ніякі DML операції: INSERT, UPDATE і DELETE не дозволені в зовнішніх таблицях.

ЗАУВАЖЕННЯ

В Oracle Database 10g можна записувати дані в зовнішні таблиці, використовуючи драйвер ORACLE_DATAPUMP замість використовуваного за замовчуванням ORACLE_DRIVER.

В Oracle Database 10 g можна визначити у зовнішній таблиці стовпці VARCHAR2 і CLOB для збереження XML-документів. У наступному прикладі показано, як створюється зовнішня таблиця зі стовпцем CLOB для зберігання XML-документів. По-перше, вам потрібно створити DIRECTORY для читання фалів даних:

CREATE DIRECTORY data_file_dir AS
“D:xmlbookExamplesChapter9srcxml”;
GRANT READ, WRITE ON DIRECTORY data_file_dir TO demo;

Потім треба використовувати DIRECTORY для визначення зовнішньої таблиці:

CREATE TABLE customer_xt (doc CLOB)
ORGANIZATION EXTERNAL
(
TYPE ORACLE_LOADER
DEFAULT DIRECTORY data_file_dir
ACCESS PARAMETERS
(
FIELDS (lobfn CHAR TERMINATED BY “,”)
COLUMN TRANSFORMS (doc FROM lobfile (lobfn))
)
LOCATION (“xml.dat”)
)
REJECT LIMIT UNLIMITED;

Далі файл xml.dat

customer1.xml
customer2.xml

Якщо таблиця визначена, то можна побачити наступне:

SQL> DESC customer_xt;
Name Null? Type
—————————————– ——– ————-
DOC CLOB

Потім можна запросити XML-документ, як показано далі:

SELECT XMLType(doc).extract(“/Customer/EMAIL”)

FROM customer_xt;

Тим не менш, запит вимагає час роботи на створення XMLType і XPath оцінки, цей підхід корисний, коли програми потребують лише кількох запитів до XML-даними і не хочуть перевантажувати XML-дані в базу даних. В Oracle Database 10 g ви не можете створити зовнішню таблицю, яка містить зумовлені типи XMLType-стовпців.

Еволюція схем

XML-схем розвиваються, коли з’являється нові вимоги для XML-даних. Ваші можливості відображати ці зміни в базі даних багато в чому залежить від пам’яті зберігання.

Якщо використовуються реляційні таблиці, то можна змінити структуру таблиці і оновити XML-представлення для відображення нового відображення з XML в реляційні таблиці. Якщо використовуються CLOB XMLType, то нові XML-дані можуть бути вставлені безпосередньо, так як ця пам’ять дозволяє вам погоджено зберігати XML в різних XML-схемах. Однак для XML Schema, базуються на XMLType, еволюція їх схем – це дуже дорогий процес, тому що він вимагає оновлення об’єктно-реляційної структури XMLType. В Oracle Database 10 g цей тип розвитку обмежений для кожного виконуваного імпорту / експорту даних та використання функції CopyEvolution() з пакету DBMS_XMLSCHEMA.

Найкраща практика

Якщо потрібно приймати XML-дані і зберігати їх в базі даних, то перше, що потрібно врахувати, – це чи потребує ваш додаток заготовки XML-структури в базі даних. Як ми вже бачили у Розділі 8, вам потрібно зважити все “за і проти” можливостей зберігання XML і проаналізувати, яким чином зберігання вплине на вилучення та оновлення XML-даних. На додаток, вам іноді потрібно вибирати особливу модель XML-зберігання для здійснення підтримки отримання XML в поєднанні з розробкою XML-схеми.

Після вибору для вашого застосування правильної моделі XML-зберігання в наступній секції представлені деякі вказівки, що потрібно знати, коли XML зберігаються в Oracle Database 10 g.

Обробка визначень типів документів

Хоча DTD не використовуються для визначення структури пам’яті зберігання для XMLType, Oracle XML DB дозволяє все DTD-визначення та об’єкти, визначені або згадані у вставленому XML-документі. Це виконується в процесі вставки XMLType, коли аналізуються (parsed) усі прийшли XML-документи. В цьому процесі вирішуються всі об’єкти, включаючи зовнішні та внутрішні, визначені в DTD. Це означає, що всі об’єкти переміщуються разом зі своїми реальними значеннями і, отже, всі первісні

(Оригінальні) об’єктові посилання втрачаються.

Якщо ви захочете залишити ці посилання, вам слід зберегти XML в CLOB, замість CLOB XMLType. Потім ви можете всякий раз створити тимчасовий XMLType з цього CLOB, коли вам знадобиться вирішити всі об’єкти і використовувати контент XML.

Створення XML Schema що базуються XMLTypes


Ви можете створювати XML Schema що базуються XMLTypes, використовуючи функції конструювання XMLType або XMLType.CreateXML() функцію. Однак, коли ви використовуєте ці функції для створення XML Schema що базуються XMLTypes, XML-документ повинен містити XML-атрибути SchemaLocation. Іноді XML-документ не містить таких атрибутів. Як же ви зможете створити XML Schema що базуються XMLType без зміни оригінального XML-документа?

В Главе8 було показано, що можна використовувати функцію XMLType.CreateSchemaBasedXML і специфікувати URL XML схеми, як показано нижче:

INSERT INTO product(id, name, description)
VALUES(“xdk”, “XML Developer”s Kit”,
XMLTYPE(“<DESCRIPTION><KEYWORD>xdk</KEYWORD> is a set of
standards-based utilities that helps to build
<KEYWORD>XML</KEYWORD> applications. It contains XDK Java
Components, XDK C Components and XDK C++ Components.
</DESCRIPTION>”).CreateSchemaBasedXML(“http://xmlns.oracle.com/
xml/content.xsd”));

URL http://xmlns.oracle.com/xml/content.xsd є зареєстрованим URL XML схеми і буде використовуватися для збереження продуктового DESCRIPTION.

Специфікування простору імен

Якщо збережений XML-документ має простору імен (namespaces), то все XML-запити до цього документа повинні бути визначені для простору імен, так як <Namespace:Element> – Це не одне і те ж що <Element> в XML. Обидві функції XMLType.existNode() і XMLType.extract() дозволяють користувачеві специфікувати простір імен в другому параметрі, як показано нижче:

MEMBER FUNCTION existsNode(xpath in varchar2, nsmap in varchar2)
RETURN number deterministic
MEMBER FUNCTION extract(xpath IN varchar2, nsmap IN varchar2)
RETURN XMLType deterministic

В цьому випадку Xpath вимагає використання повністю кваліфікованих (qualified) XML імен, які містять ім’я елемента і його простір імен. Наприклад, ви можете вставити XML-документ з двома декларованими просторами імен в XMLTypes, як показано нижче:

CREATE TABLE temp (doc XMLType);
DECLARE
v_temp XMLType;
BEGIN
v_temp:= XMLType.createXML(“<foo xmlns=”http://www.example.com”
xmlns:xsd=”http://www.w3c.org/2001/XMLSchema”>
<foo_type xsd:type=”date”>03-11-1998</foo_type>
</foo>”);
INSERT INTO temp VALUES(v_temp);
END;

Щоб запросити цей документ, ви можете визначити простір імен і його префікс у другому параметрі функції XMLType.extract() і кваліфікувати XPath, використовуючи префікс, як показано в наступному SQL-запиті:

SELECT a.doc.extract(“/a:foo/a:foo_type”,
“xmlns:a=”http://www.example.com””)
FROM temp a;

Результатом буде:

<foo_type xmlns=”http://www.example.com”
xmlns:xsd=”http://www.w3c.org/2001/
XMLSchema” xsd:type=”date”>03-11-1998</foo_type>

ЗАУВАЖЕННЯ

Якщо ви не використовуєте кваліфіковане ім’я простору імен в XPath після наданих просторів імен, ви отримаєте [повідомлення] ORA-31013: Invalid XPath expression error.

Якщо у вас є декілька просторів імен, то можна скласти з них список, використовуючи другий параметр функцій XMLType.existNode() і XMLType.extract() і розділити їх пробілами, як показано в наступному прикладі:

SELECT a.doc.extract(“/a:foo/a:lastupdate/@b:type”,
“xmlns:a=”http://www.example.com”
xmlns:b=”http://www.w3c.org/2001/XMLSchema””) AS result
FROM temp a;
RESULT
————————————————–
date

ВИСНОВКИ

У цьому розділі розглядалися різноманітні опції XML-пам’яті і відповідні їм стратегії завантаження в Oracle Database 10 g. Таблиця 9-1 показує взаємодію між XML-пам’яттю зберігання і функціональністю запропонованих XML-утиліт для завантаження даних. Ви можете вибрати одну з цих утиліт або використовувати SQL-або PL/SQL- інтерфейси для завантаження XML-документів в базу даних Oracle.













































Утиліти  Функціо-нальность  Реляцінное сховище з XMLType уявленнями  Таблиці XMLType   XMLType стовпці 
SQL*Loader Утиліта командного рядка Обмежена підтримка Та Та
XML SQL Utility Утиліта командного рядка і програмний Java-і PL / SQL-інтерфейс Та Та Та
TransX Utility Утиліта командного рядка і програмний Java-інтерфейс Та Та Та
XSQL Servlet Утиліта командного рядка і програмний Java-і HTTP-інтерфейси, підготовлені у вбудованих обробниках Та Та Та
HTTP/WebDAV HTTP / WebDAV директорії Немає Так, але таблиця вимагає створення таблиці за замовчуванням, до того як XML-схема буде зареєстрована Немає
FTP Interfaces FTP-інтерфейси Немає Так, але таблиця вимагає створення таблиці за замовчуванням, до того як схема буде зареєстрована Немає

Таблиця 9-1. Зберігання XML-даних і утиліти завантаження даних

Глава 9 з книги “Oracle Database 10g XML & SQL: Design, Build, & Manage XML Applications in Java, C, C++, & PL/SQL” by Mark Scardina Ben ChangJinyu Wang, Вид. Osborne, ISBN: 0072229527, 2004, 600 стор

Оригінальний текст глави 9 викладений у відкритому доступі за адресою www.oracle.com/technology/books/pdfs/ch9_oracle10g_xml.pdf

Переклад: Oracle Magazine RE

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*