Escolar Documentos
Profissional Documentos
Cultura Documentos
SQL/XML
1.1 Introdução
XML se estabeleceu como o formato padrão para a publicação, integração e
troca de dados na Web. Esse sucesso se deve a sua capacidade de represen-
tar informações através de uma estrutura hierárquica simples e auto-descritiva.
Essa estrutura também facilita a exibição dos dados em páginas Web, devido à
similaridade que existe entre XML e a estrutura em HTML usada para repre-
sentar os dados. Outro fator importante para a popularização do XML é que as
mensagens trocadas entre aplicações Web seguem especificações bem definidas,
as quais geralmente possuem natureza hierárquica e podem facilmente ser im-
plementadas usando XML.
Entretanto, a imensa maioria dos dados de negócio, incluindo dados de apli-
cações Web, continua sendo armazenada em SGBDs relacionais. Essa tendência
tende a se manter dada a segurança, escalabilidade, desempenho e quantidade
de ferramentas associadas aos SGBDs relacionais [1]. Atualmente, em muitos
cenários, a mesma informação é armazenada e consultada em SGBDs relacionais,
mas exibida e compartilhada no formato XML. Em geral, essas representações
são completamente distintas devido às diferenças entre os modelos.
Consequentemente, publicar dados relacionais no formato XML é um prob-
lema de extrema relevância e não trivial. Enquanto o modelo relacional é
baseado em tabelas bidimensionais, as quais não possuem hierarquia ou or-
dem, o XML é baseado em árvores, nas quais a ordem é significante. Diante
disso, muitas soluções foram propostas no sentido de minimizar o problema
[2, 3, 4, 5, 6, 7, 8, 9]. Em comum, todas definem uma linguagem usada para es-
pecificar como os dados relacionais serão convertidos em dados XML, e propõem
uma implementação que executa a conversão especificada pela linguagem.
Neste capítulo, estamos interessados no padrão SQL/XML, uma extensão
do SQL que provê suporte a XML no contexto de um SGBD relacional. O
1
CAPÍTULO 1. SQL/XML 2
1.2 Histórico
A partir do final de 1982, o comitê técnico H2 da organização INCITS1 começou
a padronizar uma versão do modelo de dados relacional tendo como base a
linguagem SEQUEL doada pela IBM. A linguagem foi renomeada para SQL
e, em 1986, a versão básica da linguagem foi adotada como um padrão pelo
Instituto Nacional Americano de Padrões (ANSI)2 . Desde então, a linguagem foi
revista e melhorada. Em 1992, o comitê apresentou a mais importante revisão
da linguagem até então, e a esta foi dado o nome de SQL-92. O SQL-92 foi
desenvolvido para ser o padrão para SGBDs relacionais e serviu como base para
1 http://www.incits.org
2 http://www.ansi.org
CAPÍTULO 1. SQL/XML 3
Foundation (SQL/Foundation)
6 http://www.odbms.org
7 http://jtc1sc32.org
8 http://www.w3.org/TR/xquery
CAPÍTULO 1. SQL/XML 4
(1233)
(<pedido codigo="2405"/>)
(<?xml version="1.0"?><clientes><cliente nome="Pedro Afonso"/>
<cliente nome="Paula Parente"/></clientes>)
(<cliente><nome>Pedro Afonso</nome></cliente>, "São Paulo")
(1233, <pedido codigo="2405"/>, <?xml version="1.0"?><clientes>
<cliente nome="Pedro Afonso"/><cliente nome="Paula Parente"/>
</clientes>, "São Paulo", <cliente><nome>Pedro Afonso</nome>)
XML(DOCUMENT(UNTYPED)) XML(CONTENT(UNTYPED))
XML(SEQUENCE)
XML(DOCUMENT(ANY)) XML(CONTENT(ANY))
XML(DOCUMENT(XMLSCHEMA)) XML(CONTENT(XMLSCHEMA))
do banco. Além disso, muitas delas são restritas e não permitem gerar estruturas
XML complexas [17].
Uma última abordagem é o uso de funções de publicação SQL/XML. Assim
como as extensões XML proprietárias, as funções de publicação têm a vantagem
de poderem ser embutidas em consultas SQL para a geração automática do dado
XML. E, como fazem parte do padrão SQL, a tendência é que os principais
SGBDs assimilem essas funções e as adaptem às suas ferramentas. Além disso,
as funções SQL/XML são muito poderosas e permitem a criação de qualquer
estrutura XML que o usuário deseje.
SELECT
XMLELEMENT(NAME "artigo",
XMLATTRIBUTES(AR.ID AS "codigo", AR.DATA),
XMLELEMENT(NAME "titulo", AR.TITULO),
XMLELEMENT(NAME "resumo", AR.RESUMO)) AS "ARTIGOS 2002"
CAPÍTULO 1. SQL/XML 7
ARTIGOS
ID TITULO RESUMO DATA STATUS ANO_PUB LOCAL
Um Mediador para o Processamento de Este artigo descreve uma ferramenta EM_
301 01-08-07
Consultas sobre Bases XML Distribuídas que implementa uma arquitetura para … PRODUCAO
Distributed XML Repositories: Top-downXML is increasingly used not only for
347 2003
Design and Transparent Query data exchange but also to represent ...
Distributed Query Evaluation on Semistructured data is modeled as a ACM
352 2002
Semistructured Data rooted, labeled graph. The … TODS
Mediators in the Architecture of Future
For single databases, primary Morgan
353 1992
Information Systems hindrances for end-user access are the Kaufman
This paper proposes an approach to EM_
355 Automatic Generation of SQL/XML Views 22-02-06
generate XML views of relational ... PRODUCAO
AUTORES AUTORIAS
ID NOME INSTITUICAO EMAIL … ARTIGO AUTOR
117 Guilherme Figueiredo COPPE/UFRJ g.coelho@cos.ufrj.br 301 117
132 Vanessa Braganholo IM/UFRJ braganholo@dcc.ufrj.br 301 132
133 Marta Mattoso COPPE/UFRJ marta@cos.ufrj.br 301 133
145 Jan-Marco Bremer University of California bremer@cs.ucdavis.edu 347 145
168 Michel Gertz University of California gertz@cs.ucdavis.edu 347 168
170 Dan Suciu University of Washington suciu@cs.washington.edu 352 170
192 Gio Wiederhold Stanford University wiederhold@cs.stanford.edu 353 192
195 Vânia Vidal UFC vvidal@lia.ufc.br 355 195
196 Marco Antonio Casanova PUC-Rio casanova@inf.puc-rio.br 355 196
197 Fernando Lemos UFC fernandocl@lia.ufc.br 355 197
REFERENCIAS REVISOES
ARTIGO REFERENCIA ARTIGO REVISOR DATA_REVISAO VERSAO TEXTO
301 322 <secao titulo ="Introdução" numero="s1">
301 347 301 117 22-09-2009 0.8 <paragrafo>O processamento distribuído de…
301 352 <paragrafo>Técnicas de fragmentação de bases…
301 353 <secao titulo="Mediador" numero="s2.1">
301 132 15-09-2009 0.6 <paragrafo>O Mediador é o principal …
<paragrafo>O diagrama da Figura 2 segue a …
<secao titulo="Mediador" numero="s2.1">
301 133 03-11-2009 1.0 <paragrafo>O Mediador é o principal …
<paragrafo>O diagrama da Figura 2 segue …
<secao titulo="Introduction" numero="s1">
355 195 22-02-2006 0.1 <paragrafo>XML has emerged as the standard …
<paragrafo>The exported view may be either …
FROM ARTIGOS AR
WHERE EXTRACT(YEAR FROM AR.DATA) >= 2002
Resultado:
ARTIGOS 2002
-----------------------------------------------------------------
<artigo codigo="301" data="2007-08-01"><titulo>Um Mediador para
o Processamento de Consultas sobre Bases XML Distribuídas</titulo
><resumo>Este artigo descreve uma ferramenta que implementa uma a
rquitetura para o processamento de consultas...</resumo></artigo>
<artigo codigo="355" data="2006-02-22"><titulo>Automatic Generat
ion of SQL/XML Views</titulo><resumo>This paper proposes an appro
ach to generate XML views of relational ...</resumo></artigo>
(2 linhas)
SELECT
XMLELEMENT(NAME "autor",
XMLATTRIBUTES(AU.ID AS "codigo"),
XMLELEMENT(NAME "nome", AU.NOME),
XMLELEMENT(NAME "email", AU.EMAIL),
XMLELEMENT(NAME "cidade", AU.CIDADE)
) AS "AUTORES"
FROM AUTORES AU
WHERE AU.INSTITUICAO = ’UFC’ OR AU.INSTITUICAO = ’COPPE/UFRJ’
Resultado:
AUTORES
-----------------------------------------------------------------
<autor codigo="117"><nome>Guilherme Figueiredo</nome><email>g.co
CAPÍTULO 1. SQL/XML 9
elho@cos.ufrj.br</email><cidade/></autor>
<autor codigo="133"><nome>Marta Mattoso</nome><email>marta@cos.u
frj.br</email><cidade/></autor>
<autor codigo="195"><nome>Vânia Vidal</nome><email>vvidal@lia.uf
c.br</email><cidade/></autor>
<autor codigo="197"><nome>Fernando Lemos</nome><email>fernandocl
@lia.ufc.br</email><cidade/></autor>
(4 linhas)
O Exemplo 2 ilustra a criação de um elemento XML que representa os au-
tores. Neste caso, a função XMLELEMENT que gera o elemento autor possui
cinco argumentos:
• o nome do elemento a ser gerado;
• uma chamada à função XMLATTRIBUTES para criar o atributo codigo;
• uma chamada à função XMLELEMENT que gera o subelemento nome;
• uma chamada à função XMLELEMENT que gera o subelemento email;
• uma chamada à função XMLELEMENT que gera o subelemento cidade.
SELECT
AU.INSTITUICAO,
XMLAGG(
XMLELEMENT(NAME "autor", AU.NOME)
) AS "AUTORES"
FROM AUTORES AU
GROUP BY AU.INSTITUICAO
Resultado:
INSTITUICAO | AUTORES
--------------------------+--------------------------------------
PUC-Rio | <autor>Marco Antonio Casanova</autor>
UFC | <autor>Vânia Vidal</autor><autor>Fern
ando Lemos</autor>
COPPE/UFRJ | <autor>Guilherme Figueiredo</autor><a
utor>Marta Mattoso</autor>
University of Washington | <autor>Dan Suciu</autor>
Stanford University | <autor>Gio Wiederhold</autor>
University of California | <autor>Jan-Marco Bremer</autor><autor
>Michel Gertz</autor>
IM/UFRJ | <autor>Vanessa Braganholo</autor>
(7 linhas)
CAPÍTULO 1. SQL/XML 11
A função tem como entrada somente um parâmetro, o qual deve ser uma
expressão que retorne uma única instância XML. No Exemplo 4, a consulta
agrupa os artigos por instituição e, para cada agrupamento, a função XMLAGG
executa a expressão XMLELEMENT(NAME "autor", AU.NOME) sobre cada tupla do
agrupamento. A expressão retorna uma instância XML contendo um elemento
XML representando o autor. Em seguida, as instâncias XML são agrupadas em
um agregado XML que é retornado pela função XMLAGG. Quando nenhum
agrupamento é definido pela consulta, a função considera o resultado da consulta
como um agrupamento.
Example 5. Consulta SQL/XML:
Resultado:
AUTORES
-----------------------------------------------------------------
<autor><nome>Guilherme Figueiredo</nome><e-mail>g.coelho@cos.ufr
j.br</e-mail><artigo status="EM_PRODUCAO"><titulo>Um Mediador par
a o Processamento de Consultas sobre Bases XML Distribuídas</titu
lo></artigo></autor>
<autor><nome>Marta Mattoso</nome><e-mail>marta@cos.ufrj.br</e-ma
il><artigo status="EM_PRODUCAO"><titulo>Um Mediador para o Proces
samento de Consultas sobre Bases XML Distribuídas</titulo></artig
o></autor>
<autor><nome>Vânia Vidal</nome><e-mail>vvidal@lia.ufc.br</e-mail
><artigo status="EM_PRODUCAO"><titulo>Automatic Generation of SQL
/XML Views</titulo></artigo></autor>
<autor><nome>Fernando Lemos</nome><e-mail>fernandocl@lia.ufc.br<
/e-mail><artigo status="EM_PRODUCAO"><titulo>Automatic Generation
of SQL/XML Views</titulo></artigo></autor>
(4 linhas)
Resultado:
autor | AUTORES
-------+---------------------------------------------------------
117 | <nome_autor>Guilherme Figueiredo</nome_autor><e-mail>g.c
oelho@cos.ufrj.br</e-mail>
133 | <nome_autor>Marta Mattoso</nome_autor><e-mail>marta@cos.
ufrj.br</e-mail>
195 | <nome_autor>Vânia Vidal</nome_autor><e-mail>vvidal@lia.u
fc.br</e-mail>
197 | <nome_autor>Fernando Lemos</nome_autor><e-mail>fernandoc
l@lia.ufc.br</e-mail>
(4 linhas)
SELECT XMLCONCAT(
XMLCOMMENT(’Autores da Universidade da Califórnia’),
XMLAGG(
XMLELEMENT(NAME "autor", AU.NOME)
) ) AS "AUTORES"
FROM AUTORES AU
WHERE AU.INSTITUICAO = ’University of California’
Resultado:
CAPÍTULO 1. SQL/XML 13
AUTORES
-----------------------------------------------------------------
<!--Autores da Universidade da Califórnia--><autor>Jan-Marco Bre
mer</autor><autor>Michel Gertz</autor>
(1 linha)
SELECT
XMLCONCAT(
XMLPI(NAME "xml-stylesheet",
’href="headlines.css" type="text/css"’),
XMLAGG(
XMLELEMENT(NAME "autor", AU.NOME)
) ) AS "AUTORES"
FROM AUTORES AU
Resultado:
AUTORES
-----------------------------------------------------------------
<?xml-stylesheet href="headlines.css" type="text/css"?><autor>Gu
ilherme Figueiredo</autor><autor>Vanessa Braganholo</autor><autor
>Marta Mattoso</autor><autor>Jan-Marco Bremer</autor><autor>Miche
l Gertz</autor><autor>Dan Suciu</autor><autor>Gio Wiederhold</aut
or><autor>Vânia Vidal</autor><autor>Marco Antonio Casanova</autor
><autor>Fernando Lemos</autor>
(1 linhas)
<ARTIGOS>
<id>301</id>
<titulo>Um Mediador para o Processamento de Consul...</titulo>
<resumo>Este artigo descreve uma ferramenta que im...</resumo>
<data>2007-08-01</data>
<status>EM_PRODUCAO</status>
</ARTIGOS>
<ARTIGOS>
<id>347</id>
<titulo>Distributed XML Repositories: Top-down Des...</titulo>
<resumo>XML is increasingly used not only for data...</resumo>
<ano_pub>2003</ano_pub>
</ARTIGOS>
...
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:simpleType name="INTEGER">...
<xsd:simpleType name="VARCHAR">...
<xsd:simpleType name="UDT.artigos.pg_catalog.text">...
<xsd:simpleType name="DATE">...
<xsd:simpleType name="CHAR">...
<xsd:complexType name="RowType.artigos.public.artigos">
<xsd:sequence>
<xsd:element name="id" type="INTEGER" minOccurs="0"/>
<xsd:element name="titulo" type="VARCHAR" minOccurs="0"/>
<xsd:element name="resumo"
type="UDT.artigos.pg_catalog.text" minOccurs="0"/>
<xsd:element name="data" type="DATE" minOccurs="0"/>
<xsd:element name="status" type="VARCHAR" minOccurs="0"/>
<xsd:element name="ano_pub" type="CHAR" minOccurs="0"/>
<xsd:element name="local" type="VARCHAR" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="artigos"
type="RowType.artigos.public.artigos"/>
</xsd:schema>
Figura 1.4.4: Esquema XML gerado a partir da tabela ARTIGOS usando a forma
de um único elemento XML.
<ARTIGOS>
<row>
<id>301</id>
<titulo>Um Mediador para o Processamento de Con...</titulo>
<resumo>Este artigo descreve uma ferramenta que...</resumo>
<data>2007-08-01</data>
<status>EM_PRODUCAO</status>
</row>
<row>
<id>347</id>
<titulo>Distributed XML Repositories: Top-down Des...</titulo>
<resumo>XML is increasingly used not only for data...</resumo>
<ano_pub>2003</ano_pub>
</row>
...
</ARTIGOS>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:simpleType name="INTEGER">...
<xsd:simpleType name="VARCHAR">...
<xsd:simpleType name="UDT.artigos.pg_catalog.text">...
<xsd:simpleType name="DATE">...
<xsd:simpleType name="CHAR">...
<xsd:complexType name="RowType.artigos.public.artigos">
<xsd:sequence>
<xsd:element name="id" type="INTEGER" minOccurs="0"/>
<xsd:element name="titulo" type="VARCHAR" minOccurs="0"/>
<xsd:element name="resumo"
type="UDT.artigos.pg_catalog.text" minOccurs="0"/>
<xsd:element name="data" type="DATE" minOccurs="0"/>
<xsd:element name="status" type="VARCHAR" minOccurs="0"/>
<xsd:element name="ano_pub" type="CHAR" minOccurs="0"/>
<xsd:element name="local" type="VARCHAR" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="TableType.artigos.public.artigos">
<xsd:sequence>
<xsd:element name="row" type="RowType.artigos.public.artigos"
minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="artigos"
type="TableType.artigos.public.artigos"/>
</xsd:schema>
Figura 1.4.6: Esquema XML gerado a partir da tabela ARTIGOS usando a forma
de uma sequência de elementos XML.
CAPÍTULO 1. SQL/XML 17
TArtigo
@data
autor* (TAutor)
nome
instituicao
endereco (TEndereco)
rua
cidade
pais
email
titulo
resumo
referencia* (TReferencia)
@id
titulo
autor*
ano
local
<artigo data="2007-01-08">
<autor>
<nome>Guilherme Figueiredo</nome>
<instituicao>COPPE/UFRJ</instituicao>
<endereco>
<email>g.coelho@cos.ufrj.br</email>
</endereco>
</autor>
<autor>
<nome>Vanessa Braganholo</nome>
<instituicao>IM/UFRJ</instituicao>
<endereco>
<email>braganholo@dcc.ufrj.br</email>
</endereco>
</autor>
<autor>
<nome>Marta Mattoso</nome>
<instituicao>COPPE/UFRJ</instituicao>
<endereco>
<email>marta@cos.ufrj.br</email>
</endereco>
</autor>
<titulo>Um Mediador para o Processamento de Consu ...</titulo>
<resumo>Este artigo descreve uma ferramenta que i ...</resumo>
<referencia id="322">
<titulo>On Distributing XML Repositories</titulo>
<autor>Jan-Marco Bremer</autor>
<autor>Michel Gertz</autor>
<ano>2003</ano>
<local>WebDB</local>
</referencia>
<referencia id="347">
<titulo>Distributed XML Repositories: Top-down ...</titulo>
<autor>Jan-Marco Bremer</autor>
<autor>Michel Gertz</autor>
<ano>2003</ano>
<local/>
</referencia>
...
</artigo>
TArtigo ARTIGOS AR
@data TArtigo/data º ARTIGOS/DATA ID
CONTEXTO SUBCONSULTA
CASO CONTEXTO XML
RELACIONAL SQL/XML
ATRIBUTO
1 a r.a AS "e"
DEFAULT
2 /a (SELECT r'.a FROM R, …, R' WHERE RR') AS "e"
3 a XMLFOREST(r.a AS "e")
OCORRÊNCIA
XMLFOREST( (SELECT r'.a FROM R, …, R' WHERE R⋈R')
4 ÚNICA /a
AS "e")
SELECT XMLAGG( XMLFOREST(r'.a AS "e") )
5 TIPO /a FROM R, …, R'
ATÔMICO WHERE R⋈R
OCORRÊNCIA
6 {a1, ..., an} XMLFOREST( r.a1 AS "e", ..., r.an AS "e")
MÚLTIPLA
ELEMENTO
1
CREATE VIEW Artigos_XML
SELECT XMLELEMENT("artigo",
)
FROM ARTIGOS AR
3
(SELECT XMLAGG( XMLELEMENT(NAME "autor",
4
2
CREATE VIEW Artigos_XML XMLFOREST(NAME "nome", AU.NOME), caso 3 XMLELEMENT(NAME "endereco",
SELECT XMLELEMENT("artigo", XMLFOREST(AU.RUA AS "rua") caso 3
XMLFOREST(NAME "instituicao", AU.INSTITUICAO), caso 3
XMLATTRIBUTES(AR.DATA as "data"), caso 1
XMLELEMENT(NAME "endereco", caso 10 XMLFOREST(AU.CIDADE AS "cidade") caso 3
(SELECT XMLAGG( caso 9 )
XMLELEMENT(NAME "autor", XMLFOREST(AU.PAIS AS "pais") caso 3
)) ))
FROM AUTORES AU, AUTORIAS AT FROM AUTORES AU, AUTORIAS AT XMLFOREST(AU.EMAIL AS "email") caso 3
WHERE AT.ARTIGO = AR.ID AND AT.AUTOR = AU.ID), WHERE AT.ARTIGO = AR.ID AND AT.AUTOR = AU.ID),
)
XMLFOREST(NAME "titulo", AR.TITULO), caso 3
5
(SELECT XMLAGG( XMLELEMENT(NAME "referencia",
XMLFOREST(NAME "resumo", AR.RESUMO), caso 3
XMLATTRIBUTES(AR2.ID), caso 1
(SELECT XMLAGG( caso 9
XMLELEMENT(NAME "referencia", XMLFOREST(NAME "titulo", AR2.TITULO), caso 3
))
(SELECT XMLAGG( caso 5
FROM REFERENCIAS RF, ARTIGOS AR2
XMLELEMENT(NAME "autor", AU.NOME) )
WHERE RF.ARTIGO = AR.ID AND
FROM AUTORIAS AT, AUTORES AU
RF.REFERENCIA = AR2.ID)
WHERE AT.ARTIGO = AR2.ID AND AT.AUTOR = AU.ID),
)
FROM ARTIGOS AR XMLFOREST(NAME "ano", AR2.ANO_PUB), caso 3
))
FROM REFERENCIAS RF, ARTIGOS AR2
WHERE RF.ARTIGO = AR.ID AND
RF.REFERENCIA = AR2.ID)
XVBA
GUI Gerador de
esquema da Mapeamentos
Gerador de
visão
Consulta
SQL/XML
esquema
usuário relacional
mapeamentos
Ferramenta de Gerenciador do
Publicação de Visões Catálogo
Designer
Catálogo
(Esquema da Visão e
Templates de Consulta)
Serviço Web de
Acesso a Dados
Ferramenta de Gerenciador de
Consulta de Visões Requisições
Cliente
Tradutor de Consulta
Applicação
RelP Framework
SGBDR
reference
FROM AUTORES AU, AUTORIAS AT
@data
WHERE AT.ARTIGO = AR.ID AND AT.AUTOR = AU.ID)
XMLATTRIBUTES( AR.DATA AS "data" )
nome
autor
XMLFOREST(AU.NOME AS "nome")
(SELECT XMLAGG( XMLELEMENT("autor",
XMLFOREST(AU.NOME AS "nome"), instituicao
XMLELEMENT("endereco", XMLFOREST(AU.INSTITUICAO AS "instituicao")
XMLFOREST(AU.RUA AS "rua", AU.CIDADE AS "cidade",
AU.PAIS AS "pais", AU.EMAIL AS "email") ) ) endereco
FROM AUTORES AU, AUTORIAS AT
WHERE AT.ARTIGO = AR.ID AND AT.AUTOR = AU.ID) XMLELEMENT("endereco",
XMLFOREST(AU.RUA AS "rua", AU.CIDADE AS "cidade",
nome AU.PAIS AS "pais", AU.EMAIL AS "email") )
(SELECT XMLAGG( XMLELEMENT("nome", AU.NOME) )
FROM AUTORES AU, AUTORIAS AT rua
WHERE AT.ARTIGO = AR.ID AND AT.AUTOR = AU.ID) XMLFOREST(C.STREET AS "Street")
reference
endereco cidade
(SELECT XMLAGG( XMLELEMENT("endereco", ... ) )
FROM AUTORES AU, AUTORIAS AT
pais
WHERE AT.ARTIGO = AR.ID AND AT.AUTOR = AU.ID) email
rua
(SELECT XMLAGG( XMLFOREST(AU.RUA AS "rua") ) Template de TEndereco
reference
resumo cidade
referencia pais
(SELECT XMLAGG( XMLFOREST("referencia", email
XMLATTRIBUTES( AR2.ID AD "id" ), XMLFOREST( AR2.TITULO AS "titulo" ),
(SELECT XMLAGG( XMLELEMENT( "nome" AS AU.NAME ) )
FROM AUTORES AU, AUTORIAS AT Template de TReferencia
WHERE AT.ARTIGO = AR.ID AND AT.AUTOR = AU.ID), referencia*
XMLFOREST(AR2.ANO AS "ano"), XMLFOREST(AR2.LOCAL AS "local") )
FROM REFERENCIAS RE, ARTIGOS AR2 (SELECT XMLAGG( XMLELEMENT("referencia", %content%)
reference
WHERE RE.ARTIGO = AR.ID AND RE.REFERENCIA = AR2.ID ) FROM REFERENCIAS RE, ARTIGOS AR2
WHERE RE.ARTIGO = AR.ID AND RE.REFERENCIA = AR2.ID )
@id
@id
(SELECT XMLAGG( XMLFOREST("referencia",
XMLATTRIBUTES( AR2.ID AD "id" ) ) XMLATTRIBUTES(AR2.ID AS "id")
FROM REFERENCIAS RE, ARTIGOS AR2
WHERE RE.ARTIGO = AR.ID AND RE.REFERENCIA = AR2.ID ) titulo
XMLFOREST(AR2.TITULO AS "titulo")
titulo
autor autor
ano ano
local local
artigo*
>
visto, este cenário é bem comum em aplicações que armazenam seus dados em
bancos relacionais, mas realizam a troca de informações com outras aplicações
usando o formato XML. Em geral, o projetista da aplicação publica os dados
relacionais relevantes no formato XML de modo a definir uma camada lógica
sobre a qual outros desenvolvedores podem definir facilmente consultas XML
particulares.
No sentido inverso, considera-se o cenário no qual o usuário precisa repre-
sentar esses dados no formato relacional com o intuito de armazená-los, por
exemplo. Deste modo, os dados XML precisam ser convertidos em um formato
tabular para serem manipulados mais facilmente no momento de sua consoli-
dação na base relacional.
Pensando em preencher essa lacuna, o padrão SQL/XML definiu duas funções:
XMLQUERY, para a recuperação de dados XML através de consultas XML
(XQuery e XPath); e XMLTABLE, para a geração de estruturas tabulares a
partir de dados XML. A seguir, descrevemos os detalhes essas funções e apre-
sentamos alguns exemplos.
SELECT XMLQUERY(
’for $ar in $xml/artigo
return
<artigo titulo="{$ar/titulo}">{ $ar/@data }</artigo>’
PASSING AR.XML AS "xml"
RETURNING CONTENT
NULL ON EMPTY ) AS "ARTIGOS"
FROM ARTIGOS_XML AR
Resultado:
ARTIGOS
-----------------------------------------------------------------
<artigo titulo="Um Mediador para o Processamento de Consultas so
bre Bases XML Distribuídas" data="2007-08-01"/>
<artigo titulo="Automatic Generation of SQL/XML Views" data="200
6-02-22"/>
(2 linhas)
SELECT XMLQUERY(
’for $ar in ora:view("artigos")/ROW
return
<artigo titulo="{$ar/TITULO}"
data="{$ar/DATA/text() }"/>’
RETURNING CONTENT
NULL ON EMPTY ) AS "ARTIGOS"
FROM ARTIGOS_XML AR
Resultado:
ARTIGOS
-----------------------------------------------------------------
<artigo titulo="Um Mediador para o Processamento de Consultas so
bre Bases XML Distribuídas" data="2007-08-01"/>
<artigo titulo="Automatic Generation of SQL/XML Views" data="200
6-02-22"/>
(2 linhas)
INSTITUICOES_XML
XML
<instituicao id="120">
<nome>PUC-Rio</nome>
<autor>
<nome>Marco Antonio Casanova</nome>
<email>casanova@inf.puc-rio.br</email>
</autor>
</instituicao>
<instituicao id="135">
<nome>UFC</nome>
<autor>
<nome>Vânia Vidal</nome>
<email>vvidal@lia.ufc.br</email>
</autor>
<autor>
<nome>Fernando Lemos</nome>
<email>fernandocl@lia.ufc.br</email>
</autor>
</instituicao>
<instituicao id="137">
<nome>COPPE/UFRJ</nome>
<autor>
<nome>Guilherme Figueiredo</nome>
<email>g.coelho@cos.ufrj.br</email>
</autor>
<autor>
<nome>Marta Mattoso</nome>
<email>marta@cos.ufrj.br</email>
</autor>
</instituicao>
<instituicao id="157">
<nome>IM/UFRJ</nome>
<autor>
<nome>Vanessa Braganholo</nome>
<email>braganholo@dcc.ufrj.br</email>
</autor>
</instituicao>
return $au’
PASSING IT.AUTORES_XML AS "xml"
COLUMNS
"NOME" VARCHAR2(150) PATH ’nome’,
"EMAIL" VARCHAR2(150) PATH ’email’) AU
Resultado:
DATA | TITULO | RESUMO
-----------------------------------------------------------------
PUC-Rio | Marco Antonio Casanova | casanova@inf.puc-rio.br
UFC | Vânia Vidal | vvidal@lia.ufc.br
UFC | Fernando Lemos | fernandocl@lia.ufc.br
COPPE/UFRJ | Guilherme Figueiredo | g.coelho@cos.ufrj.br
COPPE/UFRJ | Marta Mattoso | marta@cos.ufrj.br
IM/UFRJ | Vanessa Braganholo | braganholo@dcc.ufrj.br
(6 linhas)
A consulta XQuery do Exemplo 11 constrói duas tabelas relacionais tem-
porárias (IT e AU). A tabela IT é gerada a partir dos elementos instituição da
tabela INSTITUICOES_XML e possui três colunas (ID, NOME e AUTORES), as quais
são definidas pela cláusula COLUMNS. A coluna ID, por exemplo, contém os val-
ores do atributo id do elemento instituicao, enquanto a coluna AUTORES_XML
contém os elementos XML autor do elemento instituicao. A tabela AU é ger-
ada a partir dos autores da instituição em questão e possui duas colunas (NOME
e EMAIL).
1.7 Conclusões
Neste capítulo, discutimos o padrão SQL/XML, uma extensão do SQL que provê
suporte a XML no contexto de um SGBD relacional. Primeiro, introduzimos
um breve histórico sobre o surgimento do padrão SQL/XML. Em seguida, ap-
resentamos o tipo de dados XML, o qual permite gerenciar e manipular dados
XML de forma nativa em SGBDs relacionais. Em outro momento, discutimos
as funções de publicação do padrão SQL/XML, as quais contituem a parte do
padrão que provê a publicação de dados relacionais em um formato XML. Vi-
mos que tais funções são usadas diretamente na consulta SQL e que permitem
criar qualquer estrutura XML a partir do esquema relacional. Apresentamos
também o mapeamento definido pelo padrão para transformar tabelas rela-
cionais em um documento XML canônico. Em seguida, discutimos o uso de
visões SQL/XML. Neste caso, foi apresentada uma metodologia para a criação
de visões SQL/XML em bancos de dados que possuem tal mecanismo de visão.
Também abordamos um framework que permite a criação de visões SQL/XML
em bancos relacionais que não possuem mecanismo de visão SQL/XML. Por
fim, apresentamos a função XMLQUERY, a qual permite, através de consultas
XQuery, recuperar fragmentos de dados XML armazenados em SGBDs rela-
cionais. Também apresentamos a função XMLTABLE, a qual permite gerar
estruturas tabulares a partir de dados XML.
CAPÍTULO 1. SQL/XML 36
Exercícios
Considere o esquema relacional AVIACAO mostrado abaixo:
VOOS (VCODIGO: INTEGER, ORIGEM:STRING, DESTINO:STRING, PREÇO:REAL)
<schema>
<element name="aviao" type="TAviao"/>
<complexType name="TAviao">
<sequence>
<element name="modelo" type="string"/>
<element name="fabricante" type="string"/>
<element name="autonomia" type="int"/>
<element name="voo" type="TVoo" maxOccurs="unbounded"/>
<element name="pilotoCertificado" type="TPilotoCertificado"
maxOccurs="unbounded"/>
</sequence>
<attribute name="codigo" type="int"/>
</complexType>
<complexType name="TVoo">
<sequence>
<element name="origem" type="string"/>
<element name="destino" type="short"/>
</sequence>
<attribute name="codigo" type="int"/>
</complexType>
<complexType name="TPilotoCertificado">
<sequence>
<element name="nome" type="string"/>
<element name="salario" type="float"/>
</sequence>
</complexType>
</schema>
Exercise 12. Suponha a visão AVIOES cujos elementos são instâncias do es-
quema XML acima. Escreva a consulta SQL/XML que define a visão AVIOES
sobre o esquema relacional AVIACAO.
CAPÍTULO 1. SQL/XML 38
Exercise 13. Escreva as consultas a seguir (i) em XQuery sobre a visão AVIOES
e (ii) em SQL/XML sobre o esquema relacional AVIACAO.
39
REFERÊNCIAS BIBLIOGRÁFICAS 40