Як зареєструвати схему XML в БД і як цим скористатися, Інші СУБД, Бази даних, статті

Чиновник з особливих доручень,
Який їх до місця проводив,
З дбайливим Попова піклуванням
Здав на руки черговому.

А. К. Толстой. Сон Попова


Анотація


Встановлена ​​в БД XML DB дозволяє реєструвати в базі схеми XML з описами різних типів документів XML. Зареєстрована в репозитарії схема може вживатися для даних типу XMLTYPE: як збережених в звичайних таблицях, так і доступних з похідних (синтезованих) таблиць типу XMLTYPE. У статті показано на прикладах, як можна це виконувати.


Введення


Ця стаття є продовженням раніше опублікованих статей «XML DB – новий вимір в організації даних в Oracle»І«Що дає репозитарій XML DB і як з ним працювати». Тут йдеться про реєстрацію в БД користувача схем XML, що можливо після установки XML DB (про це розповідалося раніше). Показано, як виконується реєстрація, і як зареєстровану схему XML можна використовувати при роботі з даними типу XMLTYPE.


Як зареєструвати схему XML


Розглянемо нескладну схему XML, визначення якої створимо у файлі bookCover. xsd:


<xsd:schema xmlns:xsd=”http://www.w3.org/2001/XMLSchema”>


  <xsd:element name=”cover” type=”coverType”/>


    <xsd:complexType name=”coverType”>


      <xsd:sequence>


        <xsd:element name=”title” type=”xsd:string”/>


        <xsd:element name=”author” type=”xsd:string”


                     maxOccurs=”unbounded”/>


        <xsd:element name=”publisher” type=”xsd:string”/>


        <xsd:element name=”pubdate” type=”xsd:string”/>


        <xsd:element name=”isbn” type=”xsd:string”/>


        <xsd:element name=”pages” type=”xsd:string”/>


      </xsd:sequence>


    </xsd:complexType>


</xsd:schema>


Помістимо файл bookCover. xsd в репозитарій XML DB в папку /public (Будь-яким методом: командним рядком, програмно, графічним способом, по WebDAV або FTP). Отримаємо ресурс / public / bookCover.xsd репозитарія. Зареєструємо схему, яка є змістом цього ресурсу, з допомогою користувача SCOTT.


Для можливості реєстрації схеми користувач БД має володіти привілеями


ALTER SESSION


CREATE TYPE


CREATE TABLE


CREATE PROCEDURE


CREATE TRIGGER


У версії 10 зміст ролі CONNECT було зведено лише до привілеї CREATE SESSION, тому після версії 9 користувачеві SCOTT потрібно так чи інакше видати привілей ALTER SESSION, наприклад:


CONNECT / AS SYSDBA


GRANT ALTER SESSION TO scott;


CONNECTscott/tiger


Наступна далі команда не є технологічною необхідністю і видається для можливості подальшого аналізу події:


ALTER SESSION SET EVENTS=”31098 trace name context forever”;


Реєстрація:


BEGIN


DBMS_XMLSCHEMA.REGISTERSCHEMA (


  schemaurl => “http://localhost:8080/public/bookCover.xsd


, schemadoc => XDBURITYPE ( “/public/bookCover.xsd” )


);


END;


/


Опис схеми не обов’язково заводити в репозитарії в якості ресурсу. Для реєстрації можна скористатися і зовнішнім файлом, явно вказаним документом XML або ж документом, зазначеним через зовнішній URL (підтипи URITYPE).


Перевірка:


SQL> COLUMN schema_url FORMAT A50 WORD


SQL> COLUMN local      FORMAT A5


SQL> SELECT schema_url, local FROM user_xml_schemas;


SCHEMA_URL                                         LOCAL


————————————————– —–


http://localhost:8080/public/bookCover.xsd         YES


Інтерес представляють також інші поля таблиці USER_XML_SCHEMAS, не зазначені в цьому запиті за економією місця. Наприклад, поле QUAL_SCHEMA_URL вказує на повне (реальне), а не скорочене ім’я ресурсу, створеного в результаті реєстрації схеми: в нашому випадку / sys / schemas / SCOTT / Localhost: 8080 / public / bookCover.xsd. Якби реєструючи схему ми оголосили її глобальної (що вимагає явної вказівки і наявності прав), повна адреса ресурсу був би інший: / sys / schemas / PUBLIC / localhost :8080/public/bookCover.xsd.


Видача команди ALTER SESSION вище привела до фіксації у файлі трасування сеансу деяких прихованих дій СУБД, наприклад:


CREATE OR REPLACE TYPE “SCOTT”.”author342_COLL” AS VARRAY(2147483647) OF VARCHAR2(4000 CHAR)


/


CREATE OR REPLACE TYPE “SCOTT”.”coverType341_T” AS OBJECT (“SYS_XDBPD$” “XDB”.”XDB$RAW_LIST_T”,”title” VARCHAR2(4000 CHAR),”author” “author342_COLL”,”publisher” VARCHAR2(4000 CHAR),”pubdate” VARCHAR2(4000 CHAR),”isbn” VARCHAR2(4000 CHAR),”pages” VARCHAR2(4000 CHAR))NOT FINAL INSTANTIABLE


/


CREATE TABLE “SCOTT”.”cover343_TAB” OF SYS.XMLTYPE  XMLSCHEMA “http://localhost:8080/public/bookCover.xsd” ID “6927F846BBDA487F84B9BCCEC191A059” ELEMENT “cover” ID 2664  TYPE “SCOTT”.”coverType341_T”


/


Результат цих дій, а також створену заодно триггерную процедуру “cover343_TAB $ xd” (в нашому випадку), можна спостерігати в таблиці USER_OBJECTS. (Вправа. Дізнатися з таблиці USER_OBJECTS перелік з’явилися після реєстрації схеми XML об’єктів). Зверніть увагу, що відомості про таблиці “cover343_TAB” не відображені в USER_TABLES, хоча представлені в інших системних таблицях, наприклад, в USER_TAB_COLUMNS і USER_TAB_COLS.


Ці супутні об’єкти будуть технічно використовуватися для організації зберігання даних XMLTYPE, уточнених зареєстрованої схемою. Для можливо повторюваного елемента author зберігання організовано у вигляді масиву VARRAY.


Якщо ми захочемо зняти схему з реєстрації, та ще видалити ці супутні об’єкти, потрібно при виклику відповідної процедури вказати особливе значення спеціальному параметру:


BEGIN


DBMS_XMLSCHEMA.DELETESCHEMA (


  schemaurl     => “http://localhost:8080/public/bookCover.xsd”


, delete_option => DBMS_XMLSCHEMA.DELETE_CASCADE


);


END;


/


Для стислості (але на шкоду ясності коду) можна відразу вказати цифрове значення, наприклад в SQL * Plus:


EXECUTE DBMS_XMLSCHEMA –


        .DELETESCHEMA ( “http://localhost:8080/public/bookCover.xsd”, 3 )


Використання зареєстрованої схеми


Перевірка дії схеми


Метод CREATESCHEMABASEDXML типу XMLTYPE дозволяє влаштувати перевірку відповідності документа XML схемі.


Заради стислості записи наступних прикладів ім’я зареєстрованої схеми занесемо в змінну SQL * Plus:


VARIABLE bookschema VARCHAR2 ( 100 )


EXECUTE :bookschema := “http://localhost:8080/public/bookCover.xsd”


Наступні запити пропрацюють без помилок:


SELECT


 XMLTYPE ( “<cover></cover>” ).CREATESCHEMABASEDXML ( :bookschema )


FROM dual


;


SELECT


 XMLTYPE ( “<cover><author>Einstein</author></cover>” )


 .CREATESCHEMABASEDXML ( :bookschema )


FROM dual


;


SELECT


 XMLTYPE (


 “


 <cover>


  <title>Java Programming with Oracle JDBC</title>


  <author>Donald Bales</author>


  <publisher>OReilly and Associates</publisher>


  <pubdate>December 2001</pubdate>


  <isbn>0-596-00088-x</isbn>


  <pages>496</pages>


 </cover>


 ” ).CREATESCHEMABASEDXML ( :bookschema )


FROM dual


;


Наступні запити пропрацюють з помилками зважаючи протиріч документа схемою:


SELECT


 XMLTYPE ( “<c/>” ).CREATESCHEMABASEDXML ( :bookschema )


FROM dual


;


SELECT


 XMLTYPE ( “<cover><a>Einstein</a></cover>” )


 .CREATESCHEMABASEDXML ( :bookschema )


FROM dual


;


SELECT


 XMLTYPE ( “<cover><title>A</title><title>B</title></cover>” )


 .CREATESCHEMABASEDXML ( :bookschema )


FROM dual


;


Використання для додаткового типізації XMLTYPE в базових таблицях


Просто вказаний XMLTYPE вимагає лише, щоб поміщається в БД документ був правильно оформлений. Зареєстрована в XML DB схема XML дозволяє вказати для розміщуються в конкретні поля документів XML-образні обмеження цілісності, дозволяючи зберігати тільки «правильні» (valid) з них.


Створимо таблицю об’єктів XMLTYPE, уточнену посиланням на зареєстровану схему:


CREATE TABLE xtbooks OF XMLTYPE


XMLSCHEMAhttp://localhost:8080/public/bookCover.xsd


ELEMENT “cover”


;


Перевірка занесення даних:


INSERT INTO xtbooks VALUES (


XMLTYPE ( “<cover><author>Einstein</author></cover>” )


);


INSERT INTO xtbooks VALUES (


 XMLTYPE ( “


 <cover>


  <title>Java Programming with Oracle JDBC</title>


  <author>Donald Bales</author>


  <publisher>OReilly and Associates</publisher>


  <pubdate>December 2001</pubdate>


  <isbn>0-596-00088-x</isbn>


  <pages>496</pages>


 </cover>


 ” )


);


COMMIT;


Вправа. Перевірте реакцію СУБД на спробу вставити в таблицю XTBOOKS правильно оформлений документ XML, що не відповідає опису схеми.


Аналогічно накладаються додаткові обмеження на дані стовпця XMLTYPE у звичайній таблиці:


CREATE TABLE tbooks  (


  id          NUMBER ( 9 )


, description XMLTYPE


)


XMLTYPE description STORE AS OBJECT RELATIONAL


XMLSCHEMA “http://localhost:8080/public/bookCover.xsd”


ELEMENT “cover”


;


У наведених прикладах дані в БД фактично будуть зберігатися «об’єктно-реляційно», тобто будучи розподілені по різним структурам БД, в тому числі по захованим стовпцях таблиць. Однак типізуючи таблицю або стовпець типу XMLTYPE схемою, можна зажадати фактичного зберігання документа у вигляді об’єкта CLOB, подібно тому, як це відбувається при відсутності типізації схемою.


Приклад:


CREATE TABLE xtbooksclob OF XMLTYPE


XMLTYPE STORE AS CLOB


XMLSCHEMA “http://localhost:8080/public/bookCover.xsd”


ELEMENT “cover”


;


Вправа. Перевірити виникнення нових об’єктів БД та їх структури за результатами закладу таблиць XTBOOKS, TBOOKS і XTBOOKSCLOB. Скористатися для цього таблицями USER_OBJECTS, USER_TAB_COLS, USER_TYPES, USER_TRIGGERS, USER_LOBS.


Використання для додаткового типізації XMLTYPE в похідних таблицях (views)


При відсутності XML DB не заборонено створювати похідну таблицю (view), видає дані у вигляді таблиці документів XML (типу XMLTYPE) на основі даних зі звичайних таблиць. Розглянемо, як за наявності XML DB можна додатково уточнити таку похідну таблицю схемою XML.


У цьому прикладі реєструється схема, не взята з ресурсу репозитарія, як раніше, а явно виписана у вигляді тексту XML:


BEGIN


DBMS_XMLSCHEMA.REGISTERSCHEMA (


  schemaurl => “http://localhost:8080/public/employee.xsd”


, schemadoc =>


  “<xs:schema xmlns:xs=”http://www.w3.org/2001/XMLSchema”>


     <xs:element name=”employee”>


       <xs:complexType>


         <xs:sequence>    


           <xs:element name=”ename” type=”xs:string”/>


           <xs:element name=”job” type=”xs:string”/>


           <xs:element name=”sal” type=”xs:integer”/>


         </xs:sequence>


         <xs:attribute name=”empno” type=”xs:integer”/>


       </xs:complexType>


     </xs:element>


   </xs:schema>


  “


);


END;


/


Приклад створення похідної таблиці:


CREATE OR REPLACE VIEW empxml_schema_view OF XMLTYPE


XMLSCHEMA “http://localhost:8080/public/employee.xsd”


ELEMENT “employee”


WITH OBJECT ID


 ( EXTRACT ( SYS_NC_ROWINFO$, “/employee/@empno” ).GETNUMBERVAL ( ) )


AS


SELECT


  XMLELEMENT (


    “employee”


  , XMLATTRIBUTES ( e.empno AS “empno” )


  , XMLFOREST ( e.ename AS “ename”, e.job AS “job”, e.sal AS “sal” )


  )


FROM emp e


;


Наявність даних, що суперечать схемою, не перешкоджає вилученню даних результату при зверненні до створеної похідної таблиці. Проте ж є метод, здатний виконати перевірку відповідності схемою:


SELECT VALUE ( v ).ISSCHEMAVALID ( ) FROM empxml_schema_view v;


Вправа. Створити похідну таблицю EMLXML_VIEW по аналогії з EMLXML_SCHEMA_VIEW, не уточненої схемою (для цього буде потрібно видалити з визначення вище два рядки, виділені жирним шрифтом). Виконати наступні перевірки:


SELECT VALUE ( v ).ISSCHEMAVALID ( ) FROM empxml_view v;


SELECT


  VALUE ( v )


  .ISSCHEMAVALID ( “http://localhost:8080/public/employee.xsd” )


FROM empxml_view v


;


Вправа. Внести в схему http://localhost:8080/public/employee.xsd користувача SCOTT зміна (зняти з реєстрації і зареєструвати виправлений текст). Замінити в схемі існуюче опис зарплати:


           <xs:element name=”sal” type=”xs:integer”/>


на наступне:


           <xs:element name=”sal”>


             <xs:simpleType>


               <xs:restriction base=”xs:integer”>


                 <xs:maxInclusive value=”1500″/>


                 <xs:minInclusive value=”1000″/>


               </xs:restriction>


             </xs:simpleType>


           </xs:element>


Перевірити поведінка останніх трьох згадуваних вище запитів.


Останній приклад показує використання трохи більше складних обмежень цілісності на структуру і дані документів XML (мінімальне і максимальне значення зарплат).

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


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

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

Ваш отзыв

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

*

*