Oracle XML DB - Conceitos iniciais
-
Upload
diego-lusa -
Category
Technology
-
view
224 -
download
3
Transcript of Oracle XML DB - Conceitos iniciais
Banco de Dados XML
Diego A. Lusa,Mateus H. Dal Forno
Universidade de Passo FundoPrograma de Pos Graduacao em Computacao Aplicada - PPGCA
14 de novembro de 2014
1 / 37
Sumario
1. Conceitos Basicos
2. Oracle XML DB
2 / 37
XML - eXtensible Markup Language
I Linguagem criada para descrever dados
I E uma linguagem de marcacao que nao apresenta um conjunto detags pre-definidas
I 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
XML - namespaces
I E um metodo utilizado para evitar conflitos de nome dos elementosno XML
I Qualifica o elemento
I Um nome qualificado (QName) e composto pelo namespace + nomedo elemento, no formado {Namespace}:nome
I Utiliza-se prefixos para facilitar o uso de namespaces
I Por convencao, um namespace e declarado no formado de uma URI
4 / 37
XML - namespaces
Exemplo<?xml version="1.0" encoding="UTF-8"?>
<alunos xmlns="http://upf.br/alunos">
<mstr:aluno xmlns:mstr="http://upf.br/mestrado">
<nome>Fulano</nome>
</mstr:aluno>
<grd:aluno xmlns:gdr="http://upf.br/graduacao">
<nombre>Fulano</nombre>
</grd:aluno>
<doc:aluno xmlns:doc="http://upf.br/doutorado">
<name>Fulano</name>
</doc:aluno>
</alunos>
5 / 37
XML Schema
I Define a estrutura de um determinado de uma arquivo XML
I Consiste na definicao da hierarquia e dos tipos de dados que podemser utilizados nas instancias XML
I Prove um mecanismo para validacao da estrutura de uma instanciaXML
I Alternativa para o DTD (Document Type Definition)
6 / 37
XML Schema
Exemplo<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:mstr="http://upf.br/mestrado" targetNamespace="http://upf.br/mestrado"
attributeFormDefault="qualified">
<xsd:complexType name="aluno">
<xsd:sequence>
<xsd:element name="nome" minOccurs="1" maxOccurs="1" />
<xsd:element name="sobrenome" minOccurs="0" maxOccurs="1" />
<xsd:element name="matricula" minOccurs="0" maxOccurs="1" />
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
7 / 37
XPath
I Linguagem utilizada para localizar informacoes em arquivos XML
I Oferece um conjunto de operadores e uma sintaxe formal de consulta
I Utiliza-se a hierarquia do schema definido para gerar as consultas
I 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
XQuery
I XQuery e o SQL para colecoes XML
I Utiliza um conjunto especıfico de funcoes e utiliza a XPath como umdos recursos
I Acronimo FLOWR (pronuncia-se Flower):
for: Itera sobre uma colecao de dadoslet: Declara variaveis e atribui a elas valoreswhere: E uma condicao aplicada a selecao da colecaoorder by: Ordena a saıdareturn: Retorna os valores desejados
9 / 37
XQuery
Exemplofor $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
XSLT - EXtensible Stylesheet Language Transformations
I Utilizada para transformar documentos XML entre diferentesestruturas
I Utiliza XPath para navegar entre a estrutura do documento de origem
I Oferece diversas funcoes nativamente
11 / 37
XSLT - EXtensible Stylesheet Language Transformations
Exemplo<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>Convidados</h2>
<ul>
<xsl:for-each select="eventos/evento[@nome=’ERBD’]/convidados/convidado">
<li><xsl:value-of select="nome"/></li>
</xsl:for-each>
</ul>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
12 / 37
Oracle XML DB
13 / 37
Caracterısticas basicas
I E um conjunto de tecnologias para banco de dados Oracle, voltadasa:
Armazenamento de dados XMLCriacao de dados em formato XMLAcesso, busca, validacao, transformacao, conversao e indexacao dedados XML
I Incluıdo como parte do Oracle Database a partir da versao Oracle9iRelease 2 (9.2)
I Prove meios para interoperar SQL e XML
14 / 37
XMLType
I Tipo de dado SQL nativo criado para armazenar documentos XML
I Pode-se utiliza-lo como coluna, variavel ou argumento em funcoes eprocedimentos
I Tambem e possıvel criar uma tabela do tipo XMLType
I Apenas estruturas XML bem formadas sao aceitas pelo tipo XMLType
I Adicionalmente, os documentos podem ser validados com um XSD
15 / 37
Criacao das tabelas e usuario
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
Insercao de dados
Exemploinsert into xml_documento values (
1, ‘Turma 2013’, XMLTYPE(
’<?xml version="1.0"?>
<crs:cursos xmlns:crs="http://upf.br/cursos">
<cr:curso tipo="mestrado" xmlns:cr="http://upf.br/cursos/curso">
<alunos>
<aluno>
<nome>Fulano</nome>
<matricula>12345</matricula>
</aluno>
<aluno>
<nome>Ciclano</nome>
<matricula>34512</matricula>
</aluno>
</alunos>
</cr:curso>
<cr:curso tipo="doutorado" xmlns:cr="http://upf.br/cursos/curso">
<alunos>
<aluno>
<nome>Fulano 2</nome>
<matricula>doc12345</matricula>
</aluno>
<aluno>
<nome>Ciclano 2</nome>
<matricula>doc34512</matricula>
</aluno>
</alunos>
</cr:curso>
</crs:cursos>’)
); 17 / 37
Insercao de dados
Exemploinsert into xml_documento_objeto values (XMLTYPE(
’<?xml version="1.0"?>
<crs:cursos xmlns:crs="http://upf.br/cursos">
<cr:curso tipo="mestrado" xmlns:cr="http://upf.br/cursos/curso">
<alunos>
<aluno>
<nome>Fulano</nome>
<matricula>12345</matricula>
</aluno>
<aluno>
<nome>Ciclano</nome>
<matricula>34512</matricula>
</aluno>
</alunos>
</cr:curso>
<cr:curso tipo="doutorado" xmlns:cr="http://upf.br/cursos/curso">
<alunos>
<aluno>
<nome>Fulano 2</nome>
<matricula>doc12345</matricula>
</aluno>
<aluno>
<nome>Ciclano 2</nome>
<matricula>doc34512</matricula>
</aluno>
</alunos>
</cr:curso>
</crs:cursos>’));
18 / 37
Atualizacao de dados
I Parametros do procedimento updateXML:
xmltype instance: Instancia XMLxpath string: Expressao XPath que identifica o valor a ser atualizadovalue expr: Novo valornamespace string: Declaracao dos namespaces utilizados na XPath
Exemploselect * 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
Atualizando dados
I Para inserir novos valores dentro da estrutura do XML pode-seutilizar os procedimentos:
insertChildXMLinsertChildXMLBeforeinsertChildXMLAfterappendChildXML
I Dentre os argumentos do procedimento esta a expressao XPath queindica o ponto exato da insercao
20 / 37
Atualizacao de dados
I Parametros do procedimento insetChildXML:
xmltype instance : Instancia XMLxpath string: Expressao XPath que identifica onde inserir o novo valorchild expr: Subexpresao XPath referente ao que sera inseridovalue expr: Fragmento de XML, do tipo XMLType, que ira compor oque foi definido em child exprnamespace string: Declaracao 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
Atualizacao de dados
I Parametros do procedimento insertChildXMLbefore:
xmltype instance : Instancia XMLxpath string: Expressao XPath que identifica o elemento paichild expr: Expressao XPath - Inserir antes de quem?value expr: Fragmento de XML, do tipo XMLType, que a ser inseridonamespace string: Declaracao 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
Atualizacao de dados
I Parametros do procedimento insertChildXMLafter:xmltype instance : Instancia XMLxpath string: Expressao XPath que identifica o elemento paichild expr: Expressao XPath - Inserir depois de quem ?value expr: Fragmento de XML, do tipo XMLType, a ser inseridonamespace string: Declaracao dos namespaces utilizados na XPath
Exemploupdate 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
Atualizacao de dados
I Parametros do procedimento appendChildXML:
xmltype instance : Instancia XMLxpath string: Expressao XPath que onde inserir o novo fragmentvalue expr: Fragmento de XML, do tipo XMLType, a ser inseridonamespace string: Declaracao 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
Atualizacao de dados
I Parametros do procedimento deleteXML:
xmltype instance : Instancia XMLxpath string: Expressao XPath que onde indica o fragmento a serremovido
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
Consultas ao conteudo XML
I Parametros do metodo extract:xpath string: Expressao XPath que define a consulta a ser executadanamespace string: Declaracao dos namespaces utilizados na XPath
I Tambem pode-se utilizar a funcao extract, a qual recebe como umdos parametros uma instancia 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
Consultas ao conteudo 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
Utilizando XSLT
I Parametros do procedimento XMLSerialize:
DOCUMENT ou CONTENT: Especifica o tipo documento. Seinformado DOCUMENT, o XML informado precisa ser valido. Seinformado CONTENT, o conteudo deve ser um XML valido, mas naoprecisa apresentar apenas um elemento raizvalor: Conteudo XML no formato textual
I Parametros do metodo transform:
xmltype instance : Codigo da transformacao do tipo XMLType
28 / 37
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
Utilizando XSLT (continuacao. . . )
Exemplo<xsl:template match="/crs:cursos/cr:curso[@tipo=’’mestrado’’]">
<xsl:for-each select="alunos/aluno">
<tr>
<td>
<xsl:value-of select="nome"/>
</td>
<td>
<xsl:value-of select="matricula"/>
</td>
</tr>
</xsl:for-each>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>’))) as to_html from XML_DOCUMENTO_OBJETO o;
30 / 37
Utilizando XQuery
I Parametros do procedimento XQuery:
xmltype instance: Expressao XQuery valida em formato texto.Qualquer valor invalido e criticado pelo construtor.PASSING: Clausula que informa a instancia XML a ser submetida aXQueryRETURNING CONTENT: Indica que o resultado deve ser retornadocomo uma fragmento XML.
31 / 37
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
Trabalhando com XML Schema
I Parametros do procedimento REGISTERSCHEMA, packageDBMS XMLSCHEMA:
schemaurl: Identificador unico do schema, no formato de uma URLschemadoc: XML Schema valido, em formato textual
I A package DBMS XMLSCHEMA contem outros procedimentosque nao serao abordados neste momento
33 / 37
Trabalhando com XML Schema
ExemploBEGIN
DBMS_XMLSCHEMA.REGISTERSCHEMA(
schemaurl=>’http://upf.br/schemas/alunos.xsd’,
schemadoc=> ’<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:al="http://upf.br/aluno"
targetNamespace="http://upf.br/aluno" elementFormDefault="qualified">
<xsd:element name=’’alunos’’>
<xsd:complexType>
<xsd:sequence>
<xsd:element name="aluno" type="al:TAluno" minOccurs="1" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="TAluno">
<xsd:sequence>
<xsd:element name="nome" minOccurs="1" maxOccurs="1"/>
<xsd:element name="matricula" minOccurs="1" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>’);
END;
34 / 37
Trabalhando com XML Schema (continuacao. . . )
ExemploCREATE 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
Trabalhando com XML Schema (continuacao. . . )
Exemploinsert 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
Verificacoes
I Metodo isSchemaBased: Retorna 1 se uma determinada instanciaXML tem associada uma URI de XML Schema. O valor 0 e retornadoquando nao ha associacao
I Metodo isSchemaValid: Valida a instancia de XML contra o seuXML Schema. O valor 1 indica sucesso e 0 indica falha
I Metodo isSchemaValidated: Indica se a instancia XML foi validadacontra um XML Schema ou nao
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