Professional Documents
Culture Documents
1.
Standarde XML
2.
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.
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>
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:
- 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>
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;
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);
Schema bazei de date CREATE TABLE A( b VARCHAR(10) NOT NULL, c VARCHAR(10) NOT NULL)
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).
BD XML native Colectie de documente XML Document XML Arbore cu noduri Interogari XQuery Interogarea returneaza o secventa de noduri
Avantaje / dezavantaje;
Pauza
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>'));
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
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'));
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;
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') )
Ex:
1.
2.
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
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;
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>
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
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;
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);
* 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');
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;
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 )
Ex:
Ex:
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.