ASIX-M4-UF2-4b-XML-BDD-Relacionals

31
Llenguatge de marques i sistemes de gestió d'informació XML en les BDD Relacionals Xavier Sala Pujolar IES Cendrassos UF 2: Àmbits d'aplicació de l'XML Part 2b

Transcript of ASIX-M4-UF2-4b-XML-BDD-Relacionals

Page 1: ASIX-M4-UF2-4b-XML-BDD-Relacionals

Llenguatge de marques i sistemes de gestió d'informació

XML en les BDD Relacionals

Xavier Sala PujolarIES Cendrassos

UF 2: Àmbits d'aplicació de l'XMLPart 2b

Page 2: ASIX-M4-UF2-4b-XML-BDD-Relacionals

Administració de Sistemes Informàtics i Xarxes

Sistemes Gestors de BDD● Tradicionalment les dades s'emmagatzemen en

Sistemes Gestors de Base de Dades● Moltes de les dades actuals estan en SGBDD

– Els SGBD fan servir SQL per accedir a les dades

SELECT nom, cognom, telefon FROM agendaWHERE nom=”Filomenu” and cognom=”Pi”;

Page 3: ASIX-M4-UF2-4b-XML-BDD-Relacionals

Administració de Sistemes Informàtics i Xarxes

Sistemes Gestors de BDD● La majoria de SGBD tenen algun tipus de

suport per emmagatzemar XML

– Suport d'XQuery i/o XPath

– Suport SQL/XML

– Extensions i tipus de dades específics

– ...

Page 4: ASIX-M4-UF2-4b-XML-BDD-Relacionals

Administració de Sistemes Informàtics i Xarxes

Oracle● Podem afegir els documents XML a una Base

de dades

● Defineix la classe de dades XMLType per emmagatzemar XML✔ A partir dels seus mètodes podem recuperar

i manipular dades del fitxer XML

● Suporta l'estàndard SQL/XML

● Pot generar XML a partir de dades de la base de dades relacional

Page 5: ASIX-M4-UF2-4b-XML-BDD-Relacionals

Administració de Sistemes Informàtics i Xarxes

SQL/XML● En l'estàndard SQL (des de SQL 2003) s'hi han

definit una sèrie d'extensions de XML

● Van ser desenvolupades per INCITS H2.3 amb la participació de Microsoft, Oracle, IBM, Sybase i DataDirect Technologies

– Tot i que Microsoft no té previst implementar-lo

SQL/XML

Page 6: ASIX-M4-UF2-4b-XML-BDD-Relacionals

Administració de Sistemes Informàtics i Xarxes

SQL/XML● En general podem resumir el que podem fer

en:– Afegir les dades XML a la Base de dades

directament● Ens permetrà afegir dades XML com a columnes

relacionals● Després podrem treballar-hi de la forma habitual

– Interrogar als documents XML de la Base de Dades

● Podrem operar amb els camps XML

– Generar XML a partir de dades relacionals● En comptes d'obtenir resultats tabulats podrem

obtenir documents XML

Page 7: ASIX-M4-UF2-4b-XML-BDD-Relacionals

Administració de Sistemes Informàtics i Xarxes

SQL/XML: XMLType● L'estàndard SQL/XML defineix un tipus de

dades XML que en Oracle s'anomena XMLType

– Aquest tipus de dades permet:● Fer servir dades XML a partir d'eines relacionals● Fer servir eines XML en camps de taules

relacionals

– Això ens permet afegir fitxers XML en camps de bases de dades relacionals i treballar-hi

CREATE TABLE exemple (ID INT NOT NULL, Valor XMLTYPE);

Page 8: ASIX-M4-UF2-4b-XML-BDD-Relacionals

Administració de Sistemes Informàtics i Xarxes

SQL/XML: XMLType● Els tipus de dades XMLType

– Es pot fer servir com un tipus de dades de la base de dades

● Es pot fer servir en consultes normalment barrejat amb altres tipus

● Només poden contenir XML ben format (no s'hi poden posar fragments)

– Es pot entrar:● XML basat en un esquema● XML sense esquema

– Es pot fer servir en PL/SQL, procediments emmagatzemats, variables, retornar valors, etc...

Page 9: ASIX-M4-UF2-4b-XML-BDD-Relacionals

Administració de Sistemes Informàtics i Xarxes

SQL/XML: XMLType● El XMLType es pot emmagatzemar a la Base

de Dades de dues formes:– CLOB: Es guarda el document directament tal

com és ● no permet modificacions internes● No cal que el document sigui ben format

– Estructuradament: Es converteix internament en taules però manté l'arbre DOM

CREATE TABLE exemple (ID INT NOT NULL, Valor XMLType); XMLSCHEMA "http://iescendrassos.net/persona.xsd" ELEMENT "persona";

CREATE TABLE exemple (ID INT NOT NULL, Valor XMLType) XMLType Valor STORE AS CLOB;

Page 10: ASIX-M4-UF2-4b-XML-BDD-Relacionals

Administració de Sistemes Informàtics i Xarxes

SQL/XML: XMLType● Per tant en Oracle es permet que els camps

XML puguin ser controlats a través d'XSD o de DTD

● L'esquema s'ha de registrar prèviament i s'ha d'associar l'esquema a la taula

– Hi ha funcions per validar els documents: XMLIsValid(), schemavalidate()

Page 11: ASIX-M4-UF2-4b-XML-BDD-Relacionals

Administració de Sistemes Informàtics i Xarxes

SQL/XML Registrar esquema● Per poder fer servir un esquema cal registrar-lo

amb registerSchema

– Les connexions als esquemes es fan a través de:● http://localhost:8080● ftp://localhost:2100

CREATE OR REPLACE DIRECTORY xsd_dir AS 'c:\';/BEGINDBMS_XMLSCHEMA.registerSchema(SCHEMAURL=>'persona.xsd',SCHEMADOC=> bfilename('xsd_dir','persona.xsd'),CSID=>nls_charset_id('AL32UTF8'));END;/

Page 12: ASIX-M4-UF2-4b-XML-BDD-Relacionals

Administració de Sistemes Informàtics i Xarxes

SQL/XML Esquema● Un cop registrat l'esquema el podem fer servir

per crear taules:

● I al afegir-hi dades comprovarà que realment segueixin l'esquema

– En cas de no seguir l'esquema l'insert o l'update fallaran

Error SQL: ORA-30937: No hay ninguna definición de esquema para 'alumne' (espacio de nombres '') en el principal '/'

CREATE TABLE exemple (ID INT NOT NULL, Valor XMLType) xmltype column Valor XMLSCHEMA "persona.xsd" ELEMENT "persona";

Page 13: ASIX-M4-UF2-4b-XML-BDD-Relacionals

Administració de Sistemes Informàtics i Xarxes

SQL/XML: XMLType● Podem treballar amb dades d'aquest tipus amb

la forma habitual:

● Es poden carregar fitxers amb bfilename:

INSERT INTO gent VALUES (1, XMLType(' <persona> <nom>Federicu</nom> <cognom>Pi</cognom> </persona>'));

CREATE DIRECTORY XMLDIR AS 'C:\XML\';INSERT INTO exemple VALUES(1,XMLType(bfilename('XMLDIR','alumnes.xml'), nls_charset_id('AL32UTF8')));

Page 14: ASIX-M4-UF2-4b-XML-BDD-Relacionals

Administració de Sistemes Informàtics i Xarxes

SQL/XML: XMLType● Tenim varies formes d'extreure dades de dintre

dels camps XML– existsnode()

● Comprova si la expressió XPath retorna algun valor i si ho fa retorna 1

● Sinó retorna 0

– extract()● És similar a l'anterior però retorna un grup de

nodes, atributs o valors

– extractvalue()● Retorna un valor escalar resultat d'avaluar

l'expressió Xpath

Page 15: ASIX-M4-UF2-4b-XML-BDD-Relacionals

Administració de Sistemes Informàtics i Xarxes

SQL/XML: XMLType● Això ens permet obtenir-ne els valors a través

d'expressions Xpath

● Que es pot fer servir en qualsevol lloc. Per exemple en les condicions

SELECT a.Valor.extract('//nom') “noms” FROM exemple a;

DELETE FROM exemple WHERE Valor.extract('//nom/text()').getStringVal() = 'Federicu';

Page 16: ASIX-M4-UF2-4b-XML-BDD-Relacionals

Administració de Sistemes Informàtics i Xarxes

SQL/XML: XMLType● També es proporcionen funcions per actualitzar

dades de dins dels camps XML

updatexml Reemplaça nodes XML

insertChildXML Insereix un element XML com a fill del node especificat

insertXMLBefore Insert XML nodes of any kind immediately before a given node (other than an attribute node)

appendChildXML Insert XML nodes of any kind as the last child nodes of a given element node

deleteXML Delete XML nodes of any kind

Page 17: ASIX-M4-UF2-4b-XML-BDD-Relacionals

Administració de Sistemes Informàtics i Xarxes

SQL/XML: XMLType● Per tant podem modificar valors amb la

comanda updateXML – especificant quin valor volem canviar en XPath i

el nou valor:

– Això ens modificaria el nom de l'alumne que té de cognom “Pi” en el cas en que n'hi hagi algun

UPDATE exemple SET Valor = updateXML(Valor,'//alumne/nom/text()','Filomenu') WHERE existsNode(Valor,'//alumne[cognom=”Pi”])=1;

Page 18: ASIX-M4-UF2-4b-XML-BDD-Relacionals

Administració de Sistemes Informàtics i Xarxes

SQL/XML: XMLType● El mateix fent servir la funció insertChildXML

UPDATE exemple SET Valor = insertChildXML(Valor, '/alumnes','alumne' XMLType('<alumne> <nom>Pere</nom> <cognom>Boix</cognom> </alumne>) WHERE existsNode(Valor,'//alumne[position()=2]) = 1;

Page 19: ASIX-M4-UF2-4b-XML-BDD-Relacionals

Administració de Sistemes Informàtics i Xarxes

SQL/XML: Generar XML● La idea consisteix en afegir a les comandes

SELECT el que cal per fer que surtin els resultats en XML en comptes de en taules

SELECT ....<persones> <nom>Pere</nom> <nom>Joan</nom> <nom>Frederic</nom></persones>

Page 20: ASIX-M4-UF2-4b-XML-BDD-Relacionals

Administració de Sistemes Informàtics i Xarxes

SQL/XML● Les funcions que ofereix són:

xmlelement() Crea un element i en permet especificar el nom

xmlattributes() Crea un atribut a partir de les columnes fent servir el nom de la columna com a nom d'atribut

xmlroot() Crea l'arrel d'un document XML

xmlcomment() Crea un comentari XML

xmlpi() Crea una instrucció de procés

xmlparse() Processa una cadena com si fos un XML i en torna la estructura corresponent

xmlforest() Crea elements XML a partir de les columnes fent servir el nom de la columna com etiqueta

xmlconcat() Barreja valors XML individuals per crear un arbre

xmlagg() Combina una col·lecció de files, cada una amb un sol valor, per crear un valor que conté un arbre

Page 21: ASIX-M4-UF2-4b-XML-BDD-Relacionals

Administració de Sistemes Informàtics i Xarxes

SQL/XML:Generarnom cognom

Filomenu Pi

Federicu Garcia

Alumne

<alumne> <nom>Filomenu</nom> <cognom>Pi</cognom></alumne><alumne> <nom>Federicu</nom> <cognom>Garcia</cognom></alumne>

SELECT xmlelement('alumne', xmlforest(a.nom, a.cognom)) FROM Alumne a;

Page 22: ASIX-M4-UF2-4b-XML-BDD-Relacionals

Administració de Sistemes Informàtics i Xarxes

SQL/XML● També poden generar resultats amb

XMLConcat

SELECT xmlconcat( xmlelement('nom',al.nom), xmlelement('cognom',al.cognom)) FROM alumnes al

<nom>Filomenu</nom><cognom>Pi</cognom><nom>Federicu</nom><cognom>Garcia</cognom>

Page 23: ASIX-M4-UF2-4b-XML-BDD-Relacionals

Administració de Sistemes Informàtics i Xarxes

SQL/XML:Generar● Combinant podem definir atributs

SELECT xmlelement('alumne', xmlattributes(c.descripcio as classe), xmlforest(a.nom, a.cognom)) FROM Alumne a, Classe cWHERE c.id = a.classe;

<alumne classe=”1r”> <nom>Filomenu</nom> <cognom>Pi</cognom></alumne><alumne classe=”1r”> <nom>Federicu</nom> <cognom>Garcia</cognom></alumne>

Page 24: ASIX-M4-UF2-4b-XML-BDD-Relacionals

Administració de Sistemes Informàtics i Xarxes

SQL/XML:Generar● O fer-hi jerarquies:

SELECT xmlelement("curs", xmlattributes(c.id), (SELECT xmlagg(xmlelement("alumne", xmlforest(a.nom, a.cognom))) from alumne a where a.curs = c.id) ) from classe c;

<curs id=”1”> <alumne> <nom>Filomenu</nom> <cognom>Garcia</cognom> </alumne> ...

Page 25: ASIX-M4-UF2-4b-XML-BDD-Relacionals

Administració de Sistemes Informàtics i Xarxes

Oracle● Oracle també proporciona formes “no

estàndard” de generar XML

● A través dels objectes XMLFormat podem controlar la visualització, etc...

SELECT SYS_XMLGEN(nom) FROM Alumne a;

<?xml version=”1.0” ?><nom>Federicu</nom><nom>Filomenu</nom>

Page 26: ASIX-M4-UF2-4b-XML-BDD-Relacionals

Administració de Sistemes Informàtics i Xarxes

Microsoft SQL Server

● Defineix la classe de dades XML per emmagatzemar XML✔ A partir dels seus mètodes podem recuperar

i manipular dades del fitxer XML✔ Pot incloure XSD per validar els documents

● Integra OPENXML però no suporta SQL/XML

● Afegeix 'FOR' XML per generar resultats en XML

Page 27: ASIX-M4-UF2-4b-XML-BDD-Relacionals

Administració de Sistemes Informàtics i Xarxes

Microsoft SQL Server● El tipus de dades XML de SQL Server permet

emmagatzemar tant documents com fragments de documents XML

● Pot ser:– Tipat: Associat a un fitxer d'esquema

– No Tipat: No associat a un fitxer d'esquema

CREATE XML SCHEMA COLLECTION nom AS N'<?xml version=”1.0”?><xs:schema ... ...CREATE TABLE a (ID INT, B XML(nom));

Page 28: ASIX-M4-UF2-4b-XML-BDD-Relacionals

Administració de Sistemes Informàtics i Xarxes

Microsoft SQL Server● Podem inserir XML en una taula fàcilment amb

el tipus XML:CREATE TABLE alumnes (index INT, dades XML)

DECLARE @xmldata xmlSET @xmldata = '<persona> <nom>Xavier</nom> <cognom>Sala</cognom></persona>'INSERT INTO alumnes VALUES(1,@xmldata)

Page 29: ASIX-M4-UF2-4b-XML-BDD-Relacionals

Administració de Sistemes Informàtics i Xarxes

Microsoft SQL Server

SELECT dades.query('//nom') FROM alumne

SELECT dades.value('//persona','varchar(255)') FROM taula

SELECT dades.exists('/gent/persona/nom') FROM taula

● SQL Server ofereix unes extensions que permeten treballar amb camps XML.

● Fa diferències entre els que tenen XSD (on s'optimitza internament) o els que no

Page 30: ASIX-M4-UF2-4b-XML-BDD-Relacionals

Administració de Sistemes Informàtics i Xarxes

Microsoft SQL Server● També podem modificar dades individuals dins

dels XML amb insert, replace i delete

UPDATE taulaSET MyXML.MODIFY('insert<persona> <nom>Filomenu</nom> <cognom>Garcia</nom></persona>after (/persona)[1]')

Page 31: ASIX-M4-UF2-4b-XML-BDD-Relacionals

Administració de Sistemes Informàtics i Xarxes

Microsoft SQL Server● Podem exportar dades relacionals a XML de

diferents formes. La més senzilla és RAW

SELECT c.nom, c.cognomFROM alumne.nom AS cFOR XML RAW('alumne'), ROOT('alumnes');

nom cognom

Filomenu Pi

Federicu Garcia

Alumne

<alumnes> <alumne nom=”Filomenu” cognom=”Pi” /> <alumne nom=”Federicu” cognom=”Garcia” /></alumnes>