You are on page 1of 44

Standarde XML si implementarea

acestora in Oracle 11g

1.

Standarde XML

2.

Stocarea datelor XML


Suportul XML in Oracle 11g Manipularea datelor XML cu ajutorul XML SQL Utility. Indecsi XML

3.

4.

5.

1.Standarde XML
XML limbaj realizat pentru descrierea si interschimbul documentelor; Caracteristici: separare intre prezentare, continut si structura; avantaje: descriptibilitate, structurarea si integrarea datelor, interschimbul datelor, reutilizare, publicare; structura document: prolog si corpul documentului; consistenta: documente bine formatate, valide;

Standarde de definire a structurii documentului si tipurilor de date Standarde privind procesarea datelor XML Standarde de prezentare Standarde de manipulare a datelor XML

I.

Standarde de definire a structurii documentului si tipurilor de date:


DTD Document Type Definition
- descrie elementele, atributele, entitatile care pot fi folosite intr-un document XML, inclusive relatiile dintre ele; - scopuri: contine sintaxa pentru descrierea structurii logice a unui document (declaratiile privind elementele si atributele), compun structura logica a documentelor din entitati fizice diferite (declaratii privind entitatile) - limitari: sintaxa nu este XML -> nu pot fi folosite in transformari; creare de tipuri de date - avantaje: pot fi integrate in documente XML; au suport pentru entitati;

Ex:
<!--Census Markup Language-> <!ELEMENT census-record (address, person+)> <!ATTLIST census-record taker CDATA #REQUIRED> <!-- address information --> <!ELEMENT address (street, city, county, country, postalcode)> <!ELEMENT street (#PCDATA | unit)*> <!ELEMENT city #PCDATA> <!ELEMENT county #PCDATA> <!ELEMENT country #PCDATA> <!ELEMENT postalcode #PCDATA> <!ELEMENT unit #PCDATA> <!-- person information --> <!ELEMENT person (name, age)> <!ELEMENT name (first, last, (junior | senior)?)> <!ELEMENT age #PCDATA>

XML Schema
- defineste un vocabular XML pentru descrierea documentelor; - este bazat pe tipuri (nu taguri);

Ex:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <!-- document element --> <xs:element name="census-record"> <xs:complexType> <xs:sequence> <xs:element ref="address"/> <xs:element ref="person" maxOccurs="unbounded"/> </xs:sequence> <xs:attribute ref="taker"/> </xs:complexType> </xs:element> <xs:attribute name="taker"> <xs:simpleType> <xs:restriction base="integer"> <xs:minInclusive value="1"/> <xs:maxInclusive value="9999"/> </xs:restriction>

II. Standarde privind procesarea datelor XML

DOM Document Object Model


- asigura interfete pentru accesarea si manipularea documentelor; - construieste in memorie o structura ierarhica a documentului;

SAX Simple API for XML


- API bazat de evenimente; - Se parcurge documentul secvential;

III. Standarde de prezentare

CSS Cascading Style Sheets


- tehnologie folosita pentru definirea caracteristicilor vizuale ale elementelor;

XSL-FO Extensible Style Sheet Formatting Objects


- tehnologie similara CSS, dar integrata in XSLT; - CSS nu poate efectua sortari ale datelor, calcule

IV Standarde de manipulare a datelor XML

XPath

limbaj care permite adresarea unor portiuni dintr-un document XML, identificarea unui subset de date din interiorul unui document XML; - modelul de date utilizat este arborescent; - folosit in limbaje gazda; - evalueaza o expresie de forma:

Axa::condiie[predicat]/ Axa::condiie[predicat]/.../ Axa::condiie[predicat] Ex:


/auto/manufacturer[@name=opel]/cars[@class=compact]

XPointer permite modalitatea de adresare a portiunilor dintr-un


document XML extern; adresare intre documente;

XQuery un limbaj de extragere a datelor din documente XML

- XQuery

este definit ca o transformare de la o instanta a modelului sau de date, la alta instanta a aceluiasi model de date;

Modalitati de procesare a interogarilor: 1. Se parcurge documentul, se valideaza pe baza unei scheme, iar modelul PSVI (Post Schema Validation Infoset) este transformat intro instan a modelul de date XDM (XQuery/XPath Data Model); 2. Documentele XML sunt stocate intr-un format pre-validat, astfel incat arborele poate fi construit foarte rapid atunci cnd este necesar; 3. Instanta modelului de date este construita dintr-o sursa de date relationala, extragand informatiile despre tipurile de date din metadatele existente in catalogul bazei de date relationale;

Ex:
FOR $p IN distinct(document("bib.xml")//publisher) LET $a := avg(document("bib.xml")//book[publisher = $p]/price) RETURN <publisher> <name> {$p/text()} </name> <avgprice> {$a} </avgprice> </publisher>

XSLT Extensible Style Sheets Transformations standard creat


pentru transformarea datelor XML in diferite formate; - se bazeaza pe template-uri care corespund unor reguli; - procesorul XSLT citeste un stylesheet si il incarca in memorie ca o tabela de indecsi; pt fiecare nod din document va gasi cea mai potrivita regula de transformare care ii corespunde.

2. Stocarea datelor XML

Tipuri de documente XML din punct de vedere al structurii continutului: data-centric si document-centric; Evolutia modalitatilor de stocare a documentelor XML: - fisiere text; - maparea la bazele de date relationale; - baze de date XML native;

Baze de date relationale cu suport XML

mapeaza instante ale modelului de date XML la propriul model de date; stocarea documentelor se poate face in doua moduri: - stocare in campuri de tip text, CLOB sau BLOB; - maparea la modelul de date al bazei de date (arbore de obiecte pe baza schemei documentului !! Nu DOM si algoritm ORM);

DTD <!ELEMENT A (b, c)>

Modelul obiectual class A{ String b; String c;}

Schema bazei de date CREATE TABLE A( b VARCHAR(10) NOT NULL, c VARCHAR(10) NOT NULL)

Bazele de date XML native

Stocheaza informatiile respectand structura acestora si permite folosirea limbajelor de interogare XML pentru regsirea datelor; Definitie sistem de baze de date XML nativ:

Defineste un model logic pentru documente XML, pe care le stocheaza si retuneaza conform acelui model. Cerintele minime ale modelului includ elemente, atribute, PCDATA si mentinerea ordinii documentelor stocate. Unitatea fundamentala de stocare a datelor este documentul XML (corespunde notiunii de tuplu din teoria relationala); Modelul de stocare fizica a datelor nu este prestabilit. Poate fi construit pe baza de fisiere text, fiiere binare indexate i comprimate etc.

Motorul bazei de date are capacitatea de a modela, stoca si extrage documentele XML pe baza structurii lor arborescente;

Stocarea informatiilor presupune retinerea toate elementele schemei Infoset ca obiecte, relatiile dintre elemente (legaturi, pozitie in document) -> tot continutul documentului, insclusiv comentarii, spatii libere etc. Modelul de date al bazelor de date XML native se poate baza fie pe Infoset, pe DOM, XPath 1.0 sau XPath 2.0/XQuery, sau poate fi unul dezvoltat special pentru a imbunatati performanta bazei de date, plecand de la modelele enumerate anterior. Majoritatea bazelor de date XML native suporta insa modelul de date XPath 1.0 si XQuery 2.0 (XDM - este construit plecand de la modelul Infoset, insa contine noi functionalitati necesare in limbajele de interogare XPath 2.0 si XQuery 1.0).

Comparatie intre cele doua modele


BD relationale Tabela Tuplu Colectie de campuri Interogari SQL Interogarea returneaza un set de tupluri

BD XML native Colectie de documente XML Document XML Arbore cu noduri Interogari XQuery Interogarea returneaza o secventa de noduri

Avantaje / dezavantaje;

Pauza

Moduri de stocare a datelor XML in BD Oracle 11g

documente: data-centric, document-centric;

Stocarea documentelor in CLOB XMLType


doc sunt stocate ca si CLOB-uri, avand in plus un set de interfete dat de tipul XMLType; conserva cel mai bine formatul original al documentului; interogarile si actualizarile sunt foarte greoaie (DOM); interogare prin Oracle Text;
Ex:

1.

CREATE TABLE XMLCLOB of XMLType XMLTYPE store AS CLOB; SELECT dbms_metadata.get_ddl('TABLE','XMLCLOB') 2 FROM dual;

2.

DBMS_METADATA.GET_DDL('TABLE','XMLCLOB') --------------------------------------------CREATE TABLE "SYSTEM"."XMLCLOB" OF "SYS"."XMLTYPE" OIDINDEX ( PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "SYSTEM" ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "SYSTEM" XMLTYPE COLUMN "SYS_NC_ROWINFO$" STORE AS BASICFILE CLOB ( TABLESPACE "SYSTEM" ENABLE STORAGE IN ROW CHUNK 8192 PCTVERSION 10 NOCACHE LOGGING STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)

Ex:
1

CREATE TABLE product( id VARCHAR(10), name VARCHAR2(100), description XMLType); INSERT INTO product(id, name, description) VALUES('p1', 'product no. 1, XMLTYPE('<DESCRIPTION><KEYWORD>p1</KEYWORD> is the first product that will be inserted in our table.</DESCRIPTION>'));

Stocarea documentelor in Schema-based XMLType


documentele sunt stocate ca un set de obiecte SQL generate pe baza schemei documentului XML; continutul documentului e validat si stocat intr-un format pre-parsat (trebuie inregistrata schema in BD); cautarile sunt foarte rapide ( interogari XPath -> SQL);

Ex:
1.

CREATE TABLE XMLOR of XMLType XMLTYPE store AS OBJECT RELATIONAL XMLSCHEMA "http://localhost/xsd/myXMLSchema.xsd" ELEMENT "Root"; SELECT dbms_metadata.get_ddl('TABLE','XMLOR') 2 FROM dual;

2.

DBMS_METADATA.GET_DDL('TABLE','XMLOR') --------------------------------CREATE TABLE "SYSTEM"."XMLOR" OF "SYS"."XMLTYPE" XMLSCHEMA "http://localhost/myXMLSchema.xsd" ELEMENT "Root" ID 4760 PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "SYSTEM"

Ex:
1

Fiecare schema e inregistrata:

DBMS_XMLSCHEMA.registerSchema( SCHEMAURL=>'http://xmlns.oracle.com/ xml/content.xsd', SCHEMADOC=>'<?xml version="1.0" encoding="UTF8"?>


<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="DESCRIPTION"> <xs:complexType mixed="true"> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="KEYWORD" type= "xs:string maxOccurs="unbounded"/> </xs:choice> </xs:complexType> </xs:element> </xs:schema>', LOCAL=>TRUE, GENTYPES=>TRUE, GENTABLES=>TRUE);

OBJECT_NAME OBJECT_TYPE ------------------------------ ----------------------DESCRIPTION163_T TYPE TYPEKEYWORD164_COLL TYPE desc DESCRIPTION163_T : Name Null? Type ------------------- ------ -----------------------SYS_XDBPD$ XDB.XDB$RAW_LIST_T KEYWORD desc KEYWORD164_COLL: KEYWORD164_COLL
2

KEYWORD164_COLL

VARRAY(2147483647) OF VARCHAR2(4000)

CREATE TABLE product( id VARCHAR(10), name VARCHAR2(100), description XMLType) XMLType COLUMN description XMLSCHEMA http://xmlns.oracle.com/xml/content.xsd ELEMENT "DESCRIPTION"; INSERT INTO product(id, name, description) VALUES('p1', 'product no. 1', XMLTYPE('<DESCRIPTION><KEYWORD>p1</KEYWORD> is the first product that will be inserted in our table.</DESCRIPTION>').CreateSchemaBasedXML( 'http://xmlns.oracle.com/xml/content.xsd'));

* stocare numai pt document : CREATE TABLE product OF XMLType

Stocarea documentelor in tabele relationale


evita limitarile stocarii in XMLType: pb la evolutia schemei permite normalizarea datelor; cautari, actualizari rapide; nu pastreaza structura originala a documentului XML; se pot genera XMLType Views:

CREATE OR REPLACE VIEW employee_vw AS SELECT XMLELEMENT("Employee", XMLATTRIBUTES(employee_id AS empno"), XMLFOREST(first_name, last_name, job_id)) AS result FROM hr.employees;

Stocarea documentelor XML in tabele externe


presupune posibilitatea definirii de tabele in BD, in timp ce datele raman in afara acesteia; nu se pot crea tabele externe care sa contina coloane de tip XMLType, ci numai CLOB sau VARCHAR2; util pt interogari;

Ex:
1 2 3

CREATE DIRECTORY dir AS 'D:\xmldocs'; GRANT READ ON DIRECTORY dir TO UserX; CREATE TABLE customer_xt (doc CLOB)
ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER DEFAULT DIRECTORY dir ACCESS PARAMETERS ( LOCATION ('doc.xml') )

Stocarea documentelor XML in format binar


Presupune stocarea in format XML nativ a documentelor XML; Nu necesita inregistrarea schemei de date;

Ex:
1.

CREATE TABLE BINARY_XML_TABLE OF XMLType XMLTYPE STORE AS BINARY XML


<?xml version="1.0"?> <order> <customer> <name>Customer ABC</name> <ccNum>1234123412341234</ccNum> </customer> <orderLines> <item> <item_id>108</item_id> <item_name>Book 1</item_name> <quantity>1</quantity> <unitPrice>$38.00</unitPrice> </item> <item> <item_id>109</item_id> <item_name> Book 2</item_name> <quantity>1</quantity> <unitPrice>$22.00</unitPrice> </item> </orderLines> <receipt> <subtotal>$60.00</subtotal> <salesTax>$4.80</salesTax> <total>$64.80</total>

2.

3. insert into BINARY_XML_TABLE values (XMLTYPE(BFILENAME ('XML_DIR' ,'test_document.xml'),nls_charset_id('AL32UTF8')));


4. SELECT extractValue(value(b),'/order/customer/name') customer_name, extractValue(value(d),'/item/item_id') item_id, extractValue(value(d),'/item/quantity') quantity, extractValue(value(d),'/item/unitPrice') unit_price, extractValue(value(b),'/order/receipt/subtotal') subtotal, extractValue(value(b),'/order/receipt/salesTax') salesTax, extractValue(value(b),'/order/receipt/total') total from BINARY_XML_TABLE a ,TABLE(XMLSequence(Extract(object_value,'/order'))) b ,TABLE(XMLSequence(Extract(value(b),'/order/orderLines'))) c ,TABLE(XMLSequence(Extract(value(c),'/orderLines/item'))) d; 5. CUSTOMER_NAME ITEM_ID QUANTITY UNIT_PRICE SUBTOTAL SALESTAX TOTAL -------------- ------- -------- ---------- -------- -------- -----Customer ABC 108 1 $38.00 $60.00 $4.80 $64.80 Customer ABC 109 1 $22.00 $60.00 $4.80 $64.80

Manipularea datelor XML in BD Oracle 11g

Generarea datelor XML cu ajutorul functiilor standardului SQL/XML

Functii: XMLELEMENT() returneaza un element XML ca data de tip XMLType XMLATTRIBUTES() specifica atributele unui element, XMLCONCAT() si XMLAGG() returneaza un fragment XML dintr-o lista de elemente;

Ex:
SELECT XMLELEMENT("Employee", XMLATTRIBUTES(employee_id AS "empno", job_id AS "job"), XMLELEMENT("Name:",first_name||' '||last_name), 'is hired on ', hire_date) AS result FROM employees WHERE rownum=1;

=> <Employee empno="100" job="AD_PRES"> <Name>Steven King</Name>is hired on 17JUN-87</Employee>

Generarea datelor XML cu ajutorul extensiilor Oracle

Functii: SYS_XMLGEN() fata de XMLElement() adauga un prolog documentului si eventual un fisier de transformare; SYS_XMLAGG() UPDATEXML() actualizeaza un XMLType conformunui set de expresii XPath Ex:
SELECT SYS_XMLGEN( XMLELEMENT("Employee", XMLATTRIBUTES(employee_id AS "empno", job_id AS "job"), XMLELEMENT("Name",first_name||' '||last_name), 'is hired on ', hire_date), XMLFORMAT.createformat('EmployeeList','NO_SCHEMA', null,'http://www.oracle.com/','http://dburl', '<?xml-stylesheet href="htmlRend.xsl" type="text/xsl" ?>')) FROM employeesWHERE rownum <3;

<?xml version="1.0"?> <?xml-stylesheet href="htmlRend.xsl" type="text/xsl" ?> <EmployeeList><Employee empno="100" job="AD_PRES"> <Name>Steven King</Name>is hired on 17-JUN-87</Employee></EmployeeList>

Generarea datelor XML cu ajutorul XSU


Generarea datelor XML cu ajutorul tipului XMLType

Functii: existsNode(), extract(), isFragment() getClobVal(), getNumberVal(), getStringVal() isSchemaValid() isSchemaBased()


Ex:
SELECT description.extract('//KEYWORD').isFragment() FROM product;

XMLType(); createXML(); createSchemaBasedXML()

Ex: SELECT warehouse_name, XMLQuery( 'for $i in /Warehouse where $i/Area > 80000 return <Details> <Docks num="{$i/Docks}"/> <Rail>{if ($i/RailAccess = "Y") then "true" else "false"} </Rail> </Details>' PASSING warehouse_spec RETURNING CONTENT) big_warehouses FROM warehouses;

=> New Jersey <Details><Docks num=""></Docks><Rail>false</Rail></Details> Seattle, Washington <Details><Docks num="3"></Docks><Rail>true</Rail></Details> Toronto Sydney

Manipularea datelor XML cu ajutorul XML SQL Utility

XML SQL Utility (XSU) este o componenta din XDK (XML Developer's Kit - o biblioteca de module pentru manipularea datelor de tip XML) - XSU PL/SQL este destinata generarii si stocarii documentelor XML din/in baza de date; - contine DBMS_XMLQuery si DBMS_XMLSave package construite pe baza claselor Java OracleXMLQuery si OracleXMLSave;

1. Generarea de date XML cu DBMS_Query() - se realizeaza cu functia


DBMS_XMLQuery.getXML(); * creare context handle; * parametrizare cerere de regasire; (optional) * generare date XML ca obiect de tip CLOB; * inchidere context handle; - se pot seta denumiri pentru elemente si nodul radacina; - se pot asigna stylesheeturi pentru transformare (transformarea se poate realiza pe client sau pe server)

DECLARE v_ctx DBMS_XMLGen.ctxHandle; v_file Utl_File.File_Type; v_xml CLOB; v_more BOOLEAN := TRUE; -- Create context: v_ctx := DBMS_XMLGen.newContext('SELECT table_name, tablespace_name FROM user_tables WHERE rownum < 6'); -- Parametrizare interogare: DBMS_XMLGen.setRowsetTag(v_ctx, 'USER_TABLES'); DBMS_XMLGen.setRowTag(v_ctx, 'TABLE'); -- Generare document: v_xml := DBMS_XMLGen.GetXML(v_ctx); DBMS_XMLGen.closeContext(v_ctx);

2. Actualizarea datelor XML


INSERT
Stocarea documentelor XML se realizeaza cu ajutorul functiei DBMS_XMLSave.insertXML()

* creare context handle; * se poate introduce o lista de coloane in care se vor introduce date; (optional) * inchidere context handle;
insCtx := DBMS_XMLSave.newContext('scott.emp'); DBMS_XMLSave.clearUpdateColumnList(insCtx); DBMS_XMLSave.setUpdateColumn(insCtx,'EMPNO'); DBMS_XMLSave.setUpdateColumn(insCtx,'ENAME'); DBMS_XMLSave.setUpdatecolumn(insCtx,'JOB');

rows := DBMS_XMLSave.insertXML(insCtx, xmlDoc);


DBMS_XMLSave.closeContext(insCtx);

UPDATE Modificarea documentelor XML se realizeaza cu ajutorul functiei DBMS_XMLSave.updateXML() * creare context handle; * se introduce o lista de coloane care sunt chei primare intabele respectiva; * se poate introduce o lista de coloane in care se vor actualiza datele; (optional) * inchidere context handle;
updCtx := DBMS_XMLSave.newContext('scott.emp'); DBMS_XMLSave.setKeyColumn(updCtx,'EMPNO'); DBMS_XMLSave.setUpdateColumn(updCtx,'SAL'); DBMS_XMLSave.setUpdateColumn(updCtx,'JOB'); rows := DBMS_XMLSave.updateXML(updCtx,xmlDoc); DBMS_XMLSave.closeContext(updCtx);

DELETE
Stergerea documentelor XML se realizeaza cu ajutorul functiei DBMS_XMLSave.deleteXML() * creare context handle; * se poate introduce o lista de coloane dupa care se vor identifica tuplurile ce vor fi sterse; (optional) * inchidere context handle;

delCtx := DBMS_XMLSave.newContext('scott.emp'); DBMS_XMLSave.setKeyColumn(delCtx,'EMPNO'); rows := DBMS_XMLSave.deleteXML(delCtx,xmlDoc); DBMS_XMLSave.closeContext(delCtx);

Oracle XML DB Web Services

Web service destinat interogarilor SQL si Xquery; Web service pentru acces la PL/SQL
<?xml version="1.0" ?> <env:Envelope xmlns:env="http://www.w3.org/2002/06/soap-envelope "> <env:Body> <query xmlns="http://xmlns.oracle.com/orawsv"> <query_text type="SQL"> <![CDATA[SELECT * FROM employees WHERE salary = :e]]> </query_text> <bind name="e">8300</bind> </query> </env:Body> </env:Envelope>

Rezultat:

<?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2002/06/soap-envelope"> <soap:Body> <ROWSET> <ROW> <EMPLOYEE_ID>206</EMPLOYEE_ID> <FIRST_NAME>William</FIRST_NAME> <LAST_NAME>Gietz</LAST_NAME> <EMAIL>WGIETZ</EMAIL> <PHONE_NUMBER>515.123.8181</PHONE_NUMBER> <HIRE_DATE>07-JUN- 94</HIRE_DATE> <JOB_ID>AC_ACCOUNT</JOB_ID> <SALARY>8300</SALARY> <MANAGER_ID>205</MANAGER_ID > <DEPARTMENT_ID>110</DEPARTMENT_ID> </ROW> </ROWSET> </soap:Body> </soap:Envelope>

Indecsi XML

Ex:
CREATE INDEX idx ON product( decription.xmldata.name )

Indecsi B-Tree - pt date XML Type

Ex:

Indecsi bazati pe functii


CREATE INDEX idx ON product WHERE extract( decription, /desc/item ).getStringVal()=valoare1

Ex:

Indecsi CTXXPATH filtru pentru fct. Extract() si existsNode()


CREATE INDEX idx ON product( decription ) INDEXTYPE IS CTXSYS.CTXXPATH

Bibliografie
Steve Muench Building Oracle XML Applications, Addison-Wesley Press, 2000; Steven Holzner Inside XML, New Readers Publishing, 2002; Chitra Sharma Oracle 11g XML Reference, Oracle Press, 2008; Akmal Chaudhri XML Data Management, Addison-Wesley Press, 2003.

You might also like