1. Banco de Dados XML
Diego A. Lusa,
Mateus H. Dal Forno
Universidade de Passo Fundo
Programa de P´os Gradua¸c˜ao em Computa¸c˜ao Aplicada - PPGCA
14 de novembro de 2014
1 / 37
3. XML - eXtensible Markup Language
Linguagem criada para descrever dados
´E uma linguagem de marca¸c˜ao que n˜ao apresenta um conjunto de
tags pr´e-definidas
´E extens´ıvel e muito utilizada na Web e em arquiteturas SOA
Exemplo
<?xml version="1.0" encoding="UTF-8"?>
<alunos>
<aluno>
<nome>Fulano</nome>
<sobrenome>de Tal</sobrenome>
<matricula>112233</matricula>
</aluno>
</alunos>
3 / 37
4. XML - namespaces
´E um m´etodo utilizado para evitar conflitos de nome dos elementos
no XML
Qualifica o elemento
Um nome qualificado (QName) ´e composto pelo namespace + nome
do elemento, no formado {Namespace}:nome
Utiliza-se prefixos para facilitar o uso de namespaces
Por conven¸c˜ao, um namespace ´e declarado no formado de uma URI
4 / 37
6. XML Schema
Define a estrutura de um determinado de uma arquivo XML
Consiste na defini¸c˜ao da hierarquia e dos tipos de dados que podem
ser utilizados nas instˆancias XML
Provˆe um mecanismo para valida¸c˜ao da estrutura de uma instˆancia
XML
Alternativa para o DTD (Document Type Definition)
6 / 37
8. XPath
Linguagem utilizada para localizar informa¸c˜oes em arquivos XML
Oferece um conjunto de operadores e uma sintaxe formal de consulta
Utiliza-se a hierarquia do schema definido para gerar as consultas
´E utilizada conjuntamente `a linguagem XSLT
Exemplo
/alunos/aluno[0]/nome/text()
/alunos/*:aluno[name = ’Fulano’ and age>10]/id
/alunos/doc:aluno/matricula
/catalogo/album[@artista="Yanni"]
/catalogo/album[@artista="Yanni" and @ano=2014]
8 / 37
9. XQuery
XQuery ´e o SQL para cole¸c˜oes XML
Utiliza um conjunto espec´ıfico de fun¸c˜oes e utiliza a XPath como um
dos recursos
Acrˆonimo FLOWR (pronuncia-se Flower):
for: Itera sobre uma cole¸c˜ao de dados
let: Declara vari´aveis e atribui a elas valores
where: ´E uma condi¸c˜ao aplicada a sele¸c˜ao da cole¸c˜ao
order by: Ordena a sa´ıda
return: Retorna os valores desejados
9 / 37
10. XQuery
Exemplo
for $x in doc("gastos.xml")/gastos/rio-grande-sul/passo-fundo
where $x/total>30.000 and $x/ano = 2014
order by $x/total descending
return $x/total
10 / 37
11. XSLT - EXtensible Stylesheet Language Transformations
Utilizada para transformar documentos XML entre diferentes
estruturas
Utiliza XPath para navegar entre a estrutura do documento de origem
Oferece diversas fun¸c˜oes nativamente
11 / 37
14. Caracter´ısticas b´asicas
´E um conjunto de tecnologias para banco de dados Oracle, voltadas
a:
Armazenamento de dados XML
Cria¸c˜ao de dados em formato XML
Acesso, busca, valida¸c˜ao, transforma¸c˜ao, convers˜ao e indexa¸c˜ao de
dados XML
Inclu´ıdo como parte do Oracle Database a partir da vers˜ao Oracle9i
Release 2 (9.2)
Provˆe meios para interoperar SQL e XML
14 / 37
15. XMLType
Tipo de dado SQL nativo criado para armazenar documentos XML
Pode-se utiliz´a-lo como coluna, vari´avel ou argumento em fun¸c˜oes e
procedimentos
Tamb´em ´e poss´ıvel criar uma tabela do tipo XMLType
Apenas estruturas XML bem formadas s˜ao aceitas pelo tipo XMLType
Adicionalmente, os documentos podem ser validados com um XSD
15 / 37
16. Cria¸c˜ao das tabelas e usu´ario
Exemplo
--Opcional
CREATE USER xmldb_example identified BY xmldb;
GRANT CONNECT,resource TO xmldb_example;
CREATE TABLE xml_documento (
doc_id NUMBER NOT NULL,
descricao varchar2(200) NOT NULL,
documento xmltype NOT NULL,
CONSTRAINT pk_xml_documento PRIMARY KEY(doc_id)
);
CREATE TABLE xml_documento_objeto OF xmltype;
16 / 37
19. Atualiza¸c˜ao de dados
Parˆametros do procedimento updateXML:
xmltype instance: Instˆancia XML
xpath string: Express˜ao XPath que identifica o valor a ser atualizado
value expr: Novo valor
namespace string: Declara¸c˜ao dos namespaces utilizados na XPath
Exemplo
select * from XML_DOCUMENTO_OBJETO;
-- Atualizando primeiro aluno do mestrado
update XML_DOCUMENTO_OBJETO o set o.object_value =
updateXML(o.OBJECT_VALUE,’/cs:cursos/c:curso[@tipo="mestrado"]/alunos/aluno[1]/nome/text()’,
’Aluno atualizado’,’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’);
19 / 37
20. Atualizando dados
Para inserir novos valores dentro da estrutura do XML pode-se
utilizar os procedimentos:
insertChildXML
insertChildXMLBefore
insertChildXMLAfter
appendChildXML
Dentre os argumentos do procedimento est´a a express˜ao XPath que
indica o ponto exato da inser¸c˜ao
20 / 37
21. Atualiza¸c˜ao de dados
Parˆametros do procedimento insetChildXML:
xmltype instance : Instˆancia XML
xpath string: Express˜ao XPath que identifica onde inserir o novo valor
child expr: Subexpres˜ao XPath referente ao que ser´a inserido
value expr: Fragmento de XML, do tipo XMLType, que ir´a compor o
que foi definido em child expr
namespace string: Declara¸c˜ao dos namespaces utilizados na XPath
Exemplo
--Inserindo novo aluno de mestrado
update XML_DOCUMENTO_OBJETO o set o.object_value =
insertChildXML(o.OBJECT_VALUE,’/cs:cursos/c:curso[@tipo="mestrado"]/alunos’,’aluno’,XMLType(’
<aluno>
<nome>Novo aluno inserido</nome>
<matricula>mst:12345</matricula>
</aluno>
’),
’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’);
21 / 37
22. Atualiza¸c˜ao de dados
Parˆametros do procedimento insertChildXMLbefore:
xmltype instance : Instˆancia XML
xpath string: Express˜ao XPath que identifica o elemento pai
child expr: Express˜ao XPath - Inserir antes de quem?
value expr: Fragmento de XML, do tipo XMLType, que a ser inserido
namespace string: Declara¸c˜ao dos namespaces utilizados na XPath
Exemplo
--Inserindo novo curso
update XML_DOCUMENTO_OBJETO o set o.object_value = insertChildXMLbefore(o.OBJECT_VALUE,
’/cs:cursos’,--quem eh o pai
’c:curso[@tipo="doutorado"]’,--em relacao a quem?
XMLType(’
<c:curso tipo="graduacao" xmlns:c="http://upf.br/cursos/curso">
<alunos>
<aluno/>
</alunos>
</c:curso>
),-- o que?
’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’);
22 / 37
23. Atualiza¸c˜ao de dados
Parˆametros do procedimento insertChildXMLafter:
xmltype instance : Instˆancia XML
xpath string: Express˜ao XPath que identifica o elemento pai
child expr: Express˜ao XPath - Inserir depois de quem ?
value expr: Fragmento de XML, do tipo XMLType, a ser inserido
namespace string: Declara¸c˜ao dos namespaces utilizados na XPath
Exemplo
update XML_DOCUMENTO_OBJETO o set o.object_value = insertChildXMLafter(o.OBJECT_VALUE,
’/cs:cursos’,
’c:curso[@tipo="doutorado"]’,
XMLType(’
<c:curso tipo="fundamental" xmlns:c="http://upf.br/cursos/curso">
<alunos>
<aluno/>
</alunos>
</c:curso>
’),-- o que?
’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’);
23 / 37
24. Atualiza¸c˜ao de dados
Parˆametros do procedimento appendChildXML:
xmltype instance : Instˆancia XML
xpath string: Express˜ao XPath que onde inserir o novo fragment
value expr: Fragmento de XML, do tipo XMLType, a ser inserido
namespace string: Declara¸c˜ao dos namespaces utilizados na XPath
Exemplo
--Adicionando aluno ao curso
update XML_DOCUMENTO_OBJETO o set o.object_value = appendChildXML(o.OBJECT_VALUE,
’/cs:cursos/c:curso[@tipo="fundamental"]/alunos’,--em relacao a quem?
XMLType(’
<aluno>
<nome>Fulano do fundamental</nome>
<matricula>1111</matricula>
</aluno>
’),-- o que?
’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’);
24 / 37
25. Atualiza¸c˜ao de dados
Parˆametros do procedimento deleteXML:
xmltype instance : Instˆancia XML
xpath string: Express˜ao XPath que onde indica o fragmento a ser
removido
Exemplo
--Eliminando nodo
update XML_DOCUMENTO_OBJETO o set o.object_value = deleteXML(o.OBJECT_VALUE,
’/cs:cursos/c:curso[@tipo="doutorado"]/alunos/aluno[matricula="doc34512"]’,--em relacao a quem?
’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’);
25 / 37
26. Consultas ao conte´udo XML
Parˆametros do m´etodo extract:
xpath string: Express˜ao XPath que define a consulta a ser executada
namespace string: Declara¸c˜ao dos namespaces utilizados na XPath
Tamb´em pode-se utilizar a fun¸c˜ao extract, a qual recebe como um
dos parˆametros uma instˆancia XML
Exemplo
--Recupera o nome do primeiro aluno dos cursos de mestrado
select d.descricao, d.DOCUMENTO.extract(
’/cs:cursos/c:curso[@tipo="mestrado"]/alunos/aluno[1]/nome/text()’,
’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’
).getStringVal() as valor from xml_documento d;
26 / 37
27. Consultas ao conte´udo XML
Exemplo
--Recupera o tipo de curso que possui um aluno com nome = ’Fulano’
select d.descricao, d.DOCUMENTO.extract(
’/cs:cursos/c:curso[alunos/aluno/nome ="Fulano"]/@tipo’,
’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’
).getStringVal() as valor from xml_documento d;
--Quantos alunos os cursos de doutorado tem?
select d.descricao, d.DOCUMENTO.extract(
’count(/cs:cursos/c:curso[@tipo="doutorado"]/alunos/aluno)’,
’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’
).getStringVal() as valor from xml_documento d;
--Quantos alunos os cursos de doutorado e mestrado juntos possuem?
select d.descricao, d.DOCUMENTO.extract(
’count(/cs:cursos/c:curso[@tipo="doutorado" or @tipo="mestrado"]/alunos/aluno)’,
’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’
).getStringVal() as valor from xml_documento d;
--Utilizando a tabela do tipo XMLType
select o.extract(
’/cs:cursos/c:curso[alunos/aluno/nome ="Fulano"]/@tipo’,
’xmlns:c="http://upf.br/cursos/curso" xmlns:cs="http://upf.br/cursos"’).getStringVal()
as total from XML_DOCUMENTO_OBJETO o;
27 / 37
28. Utilizando XSLT
Parˆametros do procedimento XMLSerialize:
DOCUMENT ou CONTENT: Especifica o tipo documento. Se
informado DOCUMENT, o XML informado precisa ser v´alido. Se
informado CONTENT, o conte´udo deve ser um XML v´alido, mas n˜ao
precisa apresentar apenas um elemento raiz
valor: Conte´udo XML no formato textual
Parˆametros do m´etodo transform:
xmltype instance : C´odigo da transforma¸c˜ao do tipo XMLType
28 / 37
29. Utilizando XSLT
Exemplo
--XMLSerialize cria uma string ou lob com o conteudo. Se informar document, o motor xml valida a estrutura
select XMLSerialize(
DOCUMENT o.transform(XMLType(’<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:cr="http://upf.br/cursos/curso"
xmlns:crs="http://upf.br/cursos">
<xsl:template match="/">
<html>
<body>
<table>
<tr>
<th>Nome</th>
<th>Matricula</th>
</tr>
<xsl:apply-templates />
</table>
</body>
</html>
</xsl:template>
29 / 37
31. Utilizando XQuery
Parˆametros do procedimento XQuery:
xmltype instance: Express˜ao XQuery v´alida em formato texto.
Qualquer valor inv´alido ´e criticado pelo construtor.
PASSING: Cl´ausula que informa a instˆancia XML a ser submetida `a
XQuery
RETURNING CONTENT: Indica que o resultado deve ser retornado
como uma fragmento XML.
31 / 37
32. Utilizando XQuery
Exemplo
--Utilizacao de funcoes XMLQuery
SELECT
XMLSerialize( document XMLQuery(
’declare namespace cr=’’http://upf.br/cursos/curso’’;
declare namespace crs=’’http://upf.br/cursos’’;
<html>
<body>
<table>
<tr>
<td>Nome</td>
<td>Matricula</td>
</tr>
{
for $curso in /crs:cursos/cr:curso
where $curso/@tipo eq ’’mestrado’’
return
for $aluno in $curso/alunos/aluno
return <tr>
<td>{$aluno/nome}</td>
<td>{$aluno/matricula}</td> </tr>
}</table>
</body>
</html>
’ PASSING X.DOCUMENTO RETURNING CONTENT) ) AS TO_HTML FROM XML_DOCUMENTO X;
32 / 37
33. Trabalhando com XML Schema
Parˆametros do procedimento REGISTERSCHEMA, package
DBMS XMLSCHEMA:
schemaurl: Identificador ´unico do schema, no formato de uma URL
schemadoc: XML Schema v´alido, em formato textual
A package DBMS XMLSCHEMA cont´em outros procedimentos
que n˜ao ser˜ao abordados neste momento
33 / 37
35. Trabalhando com XML Schema (continua¸c˜ao. . . )
Exemplo
CREATE TABLE alunos OF XMLType
XMLTYPE STORE AS CLOB
XMLSCHEMA "http://upf.br/schemas/alunos.xsd"
ELEMENT "alunos";
insert into alunos values(
XMLType(
’<?xml version="1.0"?>
<a:alunos xmlns:a="http://upf.br/aluno"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://upf.br/aluno
http://upf.br/schemas/alunos.xsd">
<a:aluno>
<a:nome>Nome para teste</a:nome>
<a:matricula>23325</a:matricula>
</a:aluno>
<a:aluno>
<a:nome>Nome para teste 2</a:nome>
<a:matricula>233253</a:matricula>
</a:aluno>
</a:alunos>’
)
);
35 / 37
36. Trabalhando com XML Schema (continua¸c˜ao. . . )
Exemplo
insert into alunos values(
XMLType(
’<?xml version="1.0"?>
<a:alunos xmlns:a="http://upf.br/aluno"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://upf.br/aluno
http://upf.br/schemas/alunos.xsd">
<a:aluno>
<a:nome>Nome para teste</a:nome>
<a:matricula>23325</a:matricula>
</a:aluno>
<a:aluno>
<a:nome>Nome para teste 2</a:nome>
</a:aluno>
</a:alunos>’
)
);
36 / 37
37. Verifica¸c˜oes
M´etodo isSchemaBased: Retorna 1 se uma determinada instˆancia
XML tem associada uma URI de XML Schema. O valor 0 ´e retornado
quando n˜ao h´a associa¸c˜ao
M´etodo isSchemaValid: Valida a instˆancia de XML contra o seu
XML Schema. O valor 1 indica sucesso e 0 indica falha
M´etodo isSchemaValidated: Indica se a instˆancia XML foi validada
contra um XML Schema ou n˜ao
Exemplo
--indica se o xml eh baseado no XSD
select o.isSchemaBased() from alunos o;
--indica se o xml eh valido
select o.isSchemaValid() from alunos o;
--indica se o schema foi validado
select o.isSchemaValidated() from alunos o;
37 / 37