SQL/XML
Universidade Federal do Ceará
Departamento de Computação
Grupo ARIDA
Roteiro
Introdução
 XML versus Relacional
 XML + Relacional
 SQL/XML

 Funções
de Publicação
 Visões SQL/XML
Introdução
Muitas aplicações usam XML para troca
de dados com seus bancos relacionais
 Os principais bancos de dados possuem
soluções próprias para exportar XML de
dados relacionais e vice-versa, o que
impede a interoperabilidade entre esses
bancos

Introdução

É necessária uma solução para que as
aplicações possam ser executadas sobre
qualquer banco de dados relacional
XML versus Relacional

As estruturas XML e relacional são bem
diferentes:
– tabelas bidimensionais onde
não é possível definir hierarquia ou ordem
entre elas
 XML – baseado em árvores (hierarquia) onde
a ordem é significante e pode ser definida no
esquema
 Relacional
XML versus Relacional
Em páginas Web, XML é útil por ter
estrutura compatível com o formato de
exibição das páginas (HTML)
 No entanto, grande parte das aplicações
Web utilizam dados provenientes de
bancos relacionais, precisando assim
serem convertidos para XML

XML + Relacional

Dentre as principais soluções para aplicações
que necessitam extrair dados XML de bancos
relacionais, temos:
 SAX ou DOM
 Aplicação independente de banco
 Grande quantidade de código a ser gerado
 Extensões XML proprietárias
 Em geral, simples e manuteníveis
 Ferem a independência de banco
 SQL/XML
SQL/XML
SQL/XML é uma extensão do SQL
 Também denominada SQLX
 Criada com a participação de Oracle, IBM,
Microsoft, Sybase, e DataDirect
Technologies
 Permite que criar elementos XML a partir
de consultas SQL usando funções de
publicação

SQL/XML
Aprender SQL/XML se torna simples pois
são poucas as novas funções adicionadas
 Como o SQL é um padrão já maduro,
muitas ferramentas e infra-estrutura já
existem para suportá-lo, o que torna mais
fácil a implementação das novas
funcionalidades

SQL/XML

Execução transparente
 Statements
SQLX são tratados por parsers do
banco e o resultado é montado on the fly

É suportado por: Sybase ASE 12.5, IBM
DB2 8.1 e Oracle 9i R2 (módulo XMLDB)
 No
SQL Server existe a cláusula FOR XML
SQL/XML

“Gargalos” na performance: os mesmos
de quaisquer outros tipos de consulta
 Junções
caras e desnecessárias
 Indexação pobre
 Inexistência de ajustes do banco para as
consultas (query tunings)
 Normalização
Funções de Publicação

As funções de publicação XML usam
valores SQL para gerar valores XML de
acordo com os tipos definidos no XML
Schema do W3C
Funções de Publicação

XMLElement()
 transforma

XMLAttributes()
 define

valores relacionais em elementos XML
os atributos de um elemento XML
XMLForest()
 transforma
uma lista de valores relacionais em uma
lista de elementos XML

XMLConcat()
 concatena

um ou mais elementos XML
XMLAgg()
 trata
relacionamentos 1:n, ou seja, trata coleções
Exemplo: Esquema Relacional
Clientes_rel
-
ccodigo: number
cnome: varchar2
crua:varchar2
ccidade: varchar2
cestado: varchar2
ccep: varchar2
cfone1: varchar2
cfone2: varchar2
cfone3: varchar2
Pedidos_rel
FK1
-
pcodigo: number
pcliente: number
pdata: date
pdataEntrega: date
prua: varchar2
pcidade: varchar2
pestado: varchar2
pcep: varchar2
Itens_rel
FK2
-
icodigo: number
ipedido: number
iproduto: number
iquantidade: number
idesconto: float
Produtos_rel
FK3
-
pcodigo: number
pnome: varchar2
ppreco: float
ptaxa: float
FK1: Pedidos_rel[pcliente]  Clientes_rel[ccodigo]
FK2: Itens_rel[ipedido]  Pedidos_rel[pcodigo]
FK3: Itens_rel[iproduto]  Produtos_rel[pcodigo]
XMLElement()


Usado para criar elementos XML
XMLELEMENT (
[NAME] id
[, XMLAttributes() ]
[, ( instância_elemento_XML )+ ]
)
XMLElement()
SELECT
XMLELEMENT(NAME "NOME_CLIENTE",
CLI.CNOME
)
FROM CLIENTES_REL CLI
WHERE CLI.CESTADO = 'CE'
<NOME_CLIENTE>Lineu</NOME_CLIENTE>
<NOME_CLIENTE>Valdiana</NOME_CLIENTE>
XMLElement()
SELECT XMLELEMENT("CLIENTE_CEARA",
XMLELEMENT("NOME",
CLI.CNOME
),
XMLELEMENT("CIDADE",
CLI.CCIDADE
)
)
FROM CLIENTES_REL CLI
WHERE CLI.CESTADO = 'CE'
<CLIENTE_CEARA>
<NOME>Lineu</NOME>
<CIDADE>Fortaleza</CIDADE>
</CLIENTE_CEARA>
<CLIENTE_CEARA>
<NOME>Valdiana</NOME>
<CIDADE>Fortaleza</CIDADE>
</CLIENTE_CEARA>
XMLAttributes()


Define os atributos de um elemento
XMLATTRIBUTES (
expressão_valor [AS alias]
[, value_expr [AS alias]*
)
XMLAttributes()
SELECT XMLELEMENT("CLIENTE_CEARA",
XMLATTRIBUTES(
CLI.CCODIGO AS "CODIGO"
),
XMLELEMENT("NOME",
CLI.CNOME
),
XMLELEMENT("CIDADE",
CLI.CCIDADE
)
<CLIENTE_CEARA CODIDO="1">
)
<NOME>Lineu</NOME>
<CIDADE>Fortaleza</CIDADE>
FROM CLIENTES_REL CLI
</CLIENTE_CEARA>
WHERE CLI.CESTADO = 'CE'
<CLIENTE_CEARA CODIDO="3">
<NOME>Valdiana</NOME>
<CIDADE>Fortaleza</CIDADE>
</CLIENTE_CEARA>
XMLForest()


Gera uma lista de elementos XML a partir de
uma lista de expressões de valor e seus aliases
opcionais. Valores nulos não geram elementos
XML.
XMLFOREST (
expressão_valor [AS alias]
[, expressão_valor [AS alias] ]*
)
XMLForest()
SELECT XMLFOREST(
CLI.CNOME AS "NOME",
CLI.CCIDADE AS "CIDADE",
CLI.CEP AS "CEP"
)
FROM CLIENTES_REL CLI
WHERE CLI.CESTADO = 'CE'
<NOME>Lineu</NOME>
<CIDADE>Fortaleza</CIDADE>
<CEP>60356-030</CEP>
<NOME>Valdiana</NOME>
<CIDADE>Fortaleza</CIDADE>
<CEP>60486-025</CEP>
XMLAgg()


Gera uma lista de elementos XML a partir de um
agrupamento (GROUP BY). Se nenhum
GROUP BY for especificado, é retornado um
agregado XML para todas as cláusulas da
consulta.
XMLAGG (
instância_elemento_XML
[ ORDER BY lista_atributos ]
)
XMLAgg()
SELECT XMLELEMENT("CLIENTES",
XMLATTRIBUTES(CLI.CCIDADE AS "CIDADE")
XMLAGG(
XMLELEMENT("CLIENTE",
CLI.CNOME )
)
)
FROM CLIENTES_REL CLI
GROUP BY CLI.CCIDADE;
<CLIENTES CIDADE="FORTALEZA">
<CLIENTE>Lineu</CLIENTE>
<CLIENTE>Valdiana</CLIENTE>
</CLIENTES>
<CLIENTES CIDADE="SOBRAL">
<CLIENTE>Marta</CLIENTE>
<CLIENTE>Joana</CLIENTE>
</CLIENTES>
XMLAgg()
SELECT XMLELEMENT("CLIENTES",
XMLAGG(
XMLELEMENT("CLIENTE",
CLI.CNOME )
)
)
FROM CLIENTES_REL CLI;
<CLIENTES>
<CLIENTE>Lineu</CLIENTE>
<CLIENTE>Valdiana</CLIENTE>
<CLIENTE>Marta</CLIENTE>
<CLIENTE>Joana</CLIENTE>
</CLIENTES>
XMLAgg()
<PEDIDO_CEARA CODIGO="3">
<ITENS>
<ITEM>Mouse</ITEM>
<ITEM>Monitor</ITEM>
<ITEM>Modem</ITEM>
</ITENS>
</PEDIDO_CEARA>
SELECT XMLELEMENT("PEDIDO_CEARA",
XMLATTRIBUTES(
PED.PCODIGO AS CODIGO
),
XMLELEMENT("ITENS",
(SELECT XMLAGG(
XMLELEMENT("ITEM",
PROD.PDESCRICAO
)
)
FROM ITENS_REL IT, PRODUTOS_REL PROD
WHERE IT.IPEDIDO = PED.PCODIGO AND
IT.IPRODUTO = PROD.PCODIGO)
)
)
FROM PEDIDOS_REL PED
WHERE PED.PESTADO = 'CE'
XMLConcat()
Gera um único fragmento XML a partir dos
argumentos
 XMLConcat (
instância_elemento_XML
[, instância_elemento_XML ]*
)

XMLConcat()
SELECT
XMLELEMENT("PRODUTO_NOME", PROD.PNOME),
XMLELEMENT("PRODUTO_PRECO", PROD.PPRECO)
FROM PRODUTOS_REL PROD
XMLELEMENT("PRODUTO_NOME", PROD.PNOME)
XMLELEMENT("PRODUTO_PRECO", PROD.PPRECO)
<PRODUTO_NOME>Monitor</PRODUTO_NOME>
<PRODUTO_PRECO>589,50</PRODUTO_PRECO>
<PRODUTO_NOME>Mouse</PRODUTO_NOME>
<PRODUTO_PRECO>50,25</PRODUTO_PRECO>
<PRODUTO_NOME>Teclado</PRODUTO_NOME>
<PRODUTO_PRECO>165,88</PRODUTO_PRECO>
XMLConcat()
SELECT XMLCONCAT(
XMLELEMENT("PRODUTO_NOME", PROD.PNOME),
XMLELEMENT("PRODUTO_PRECO", PROD.PPRECO)
)
FROM PRODUTOS_REL PROD
XMLCONCAT(XMLELEMENT("PRODUTO_NOME", PROD.PNOME),
XMLELEMENT("PRODUTO_PRECO", PROD.PPRECO))
<PRODUTO_NOME>Monitor</PRODUTO_NOME>
<PRODUTO_PRECO>589,50</PRODUTO_PRECO>
<PRODUTO_NOME>Mouse</PRODUTO_NOME>
<PRODUTO_PRECO>50,25</PRODUTO_PRECO>
<PRODUTO_NOME>Teclado</PRODUTO_NOME>
<PRODUTO_PRECO>165,88</PRODUTO_PRECO>
Visões SQL/XML
Oracle estende o mecanismo de Visão
para suportar Visão SQL/XML.
 Uma Visão SQL/XML é uma visão com
instâncias do tipo XMLType.
 Estas instâncias podem existir fisicamente
no banco de dados (em tabelas XML) e
podem ser “sintetizados” a partir de dados
no formato relacional ou de objetos.

Vantagens de Visões SQL/XML




XML vem se tornando o padrão para a troca de dados
na Web.
Dados XML podem ser mapeados na estrutura das
linguagens OO e assim aplicações podem manipulá-los
como estruturas nativas.
Visões XML provêem a flexibilidade de ver o mesmo
dado relacional, OO ou XML de mais de uma maneira.
Assim o projetista pode ter mais de uma representação
para diferentes aplicações sem ter que mudar os dados
no banco.
Como os objetos da visão são processados no SGBD,
não no cliente, isto pode resultar em menos tráfico na
rede.
Definindo Visões de Objetos

Existem dois tipos de visões SQL/XML:
 Não
em conformidade com um esquema:
estas visões não estão em conformidade com
um esquema particular
 Em conformidade com um esquema: estas
visões estão em conformidade com um
esquema, provendo uma tipagem mais forte
que do outro tipo de visão.
Definindo Visões SQL/XML

Qualquer que seja o tipo de visão utilizado, os
seguintes passos devem ser seguidos:
Defina o nome e o tipo XML dos elementos da visão.
2. Escreva uma consulta que especifique quais dados
em quais tabelas contêm os atributos para os
elementos XML do tipo definido anteriormente.
1.
Definindo Visões SQL/XML
Definindo elementos de tipo simples
 Definindo atributos
 Definindo elementos de tipos complexo
 Definindo elementos multivalorados

Definindo elementos de tipo simples
Clientes_rel
-
ccodigo: number
cnome: varchar2
crua:varchar2
ccidade: varchar2
cestado: varchar2
ccep: varchar2
cfone1: varchar2
cfone2: varchar2
cfone3: varchar2
Pedidos_
FK1
-
pcodigo: num
pcliente: num
pdata: date
pdataEntreg
prua: varcha
pcidade: var
pestado: var
pcep: varcha
Definindo elementos de tipo simples
1.
Criação do tipo
<schema xmlns:xs="...">
<element name="cliente" type="TCliente"/>
<complexType name="TCliente">
<sequence>
<element name="nome" type="xs:string"/>
</sequence>
</complexType>
</schema>
Definindo elementos de tipo simples
2.
Criação da consulta que define a visão
CREATE VIEW Clientes_v AS
SELECT XMLELEMENT("cliente",
XMLELEMENT("nome", C.CNOME)
) AS cliente
FROM Clientes_rel C
OU
CREATE VIEW Clientes_v AS
SELECT XMLELEMENT("cliente",
XMLFOREST(C.CNOME AS "nome")
) AS cliente
FROM Clientes_rel C
Nome da coluna da visão
Definindo atributos
Clientes_rel
-
ccodigo: number
cnome: varchar2
crua:varchar2
ccidade: varchar2
cestado: varchar2
ccep: varchar2
cfone1: varchar2
cfone2: varchar2
cfone3: varchar2
Pedidos_
FK1
-
pcodigo: num
pcliente: num
pdata: date
pdataEntreg
prua: varcha
pcidade: var
pestado: var
pcep: varcha
Definindo atributos
1.
Criação do tipo
<xs:schema xmlns:xs="...">
<xs:element name="cliente" type="TCliente"/>
<xs:complexType name="TCliente">
<xs:sequence>
<xs:element name="nome" type="xs:string"/>
</xs:sequence>
<xs:attribute name="codigo" type="xs:integer"/>
</xs:complexType>
</xs:schema>
Definindo atributos
2.
Criação da consulta que define a visão
CREATE VIEW Clientes_v AS
SELECT XMLELEMENT("cliente",
XMLATTRIBUTES(C.CCODIGO AS "codigo"),
XMLFOREST(C.CNOME AS "nome")
) AS cliente
FROM Clientes_rel C
Definindo elementos de tipo complexo
Clientes_rel
-
ccodigo: number
cnome: varchar2
crua:varchar2
ccidade: varchar2
cestado: varchar2
ccep: varchar2
cfone1: varchar2
cfone2: varchar2
cfone3: varchar2
Pedidos_
FK1
-
pcodigo: num
pcliente: num
pdata: date
pdataEntreg
prua: varcha
pcidade: var
pestado: var
pcep: varcha
Definindo elementos de tipo complexo
1.
Criação do tipo
<schema xmlns:xs="..." >
<element name="cliente" type="TCliente"/>
<complexType name="TCliente">
<sequence>
<element name="nome" type="xs:string"/>
<element name="endereco" type="TEndereco"/>
</sequence>
</complexType>
<complexType name="TEndereco">
<sequence>
<element name="rua" type="xs:string"/>
<element name="cidade" type="xs:string"/>
<element name="estado" type="xs:string"/>
<element name="cep" type="xs:string"/>
</sequence>
</complexType>
</schema>
Definindo elementos de tipo complexo
2.
Criação da consulta que define a visão
CREATE VIEW Clientes_v AS
SELECT XMLELEMENT("cliente",
XMLATTRIBUTES(C.CCODIGO AS "codigo"),
XMLFOREST(C.CNOME AS "nome"),
XMLELEMENT("endereco",
XMLELEMENT("rua", C.CRUA),
XMLELEMENT("cidade", C.CESTADO),
XMLFOREST(C.CESTADO AS "estado"),
XMLFOREST(C.CCEP AS "cep")
)
) AS cliente
FROM Clientes_rel C
OU
CREATE VIEW Clientes_v AS
SELECT XMLELEMENT("cliente",
XMLATTRIBUTES(C.CCODIGO AS "codigo"),
XMLFOREST(C.CNOME AS "nome"),
XMLELEMENT("endereco",
XMLFOREST(C.CRUA AS "rua",
C.CESTADO AS "cidade",
C.CESTADO AS "estado",
C.CCEP AS "cep")
)
) AS cliente
FROM Clientes_rel C
Definindo elementos multivalorados (1)
Clientes_rel
-
ccodigo: number
cnome: varchar2
crua:varchar2
ccidade: varchar2
cestado: varchar2
ccep: varchar2
cfone1: varchar2
cfone2: varchar2
cfone3: varchar2
Pedidos_
FK1
-
pcodigo: num
pcliente: num
pdata: date
pdataEntreg
prua: varcha
pcidade: var
pestado: var
pcep: varcha
Definindo elementos multivalorados (1)
1.
Criação do tipo
<xs:schema xmlns:xs="...">
<xs:element name="cliente" type="TCliente"/>
<xs:complexType name="TCliente">
<xs:sequence>
<xs:element name="nome" type="xs:string"/>
<xs:element name="endereco" type="TEndereco"/>
<xs:element name="telefone" type="xs:string"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="codigo" type="xs:integer"/>
</xs:complexType>
<xs:complexType name="TEndereco">...</xs:complexType>
</xs:schema>
Definindo elementos multivalorados (1)
2.
Criação da consulta que define a visão
CREATE VIEW Clientes_v AS
SELECT XMLELEMENT("cliente",
XMLATTRIBUTES(C.CCODIGO AS "codigo"),
XMLFOREST(C.CNOME AS "nome"),
XMLELEMENT("endereco",
XMLELEMENT("rua", C.CRUA),
XMLELEMENT("cidade", C.CESTADO),
XMLFOREST(C.CESTADO AS "estado"),
XMLFOREST(C.CCEP AS "cep")
),
XMLELEMENT("telefone", C.CFONE1),
XMLELEMENT("telefone", C.CFONE2),
XMLELEMENT("telefone", C.CFONE3)
) AS cliente
FROM Clientes_rel C
OU
CREATE VIEW Clientes_v AS
SELECT XMLELEMENT("cliente",
XMLATTRIBUTES(C.CCODIGO AS "codigo"),
XMLFOREST(C.CNOME AS "nome"),
XMLELEMENT("endereco",
XMLELEMENT("rua", C.CRUA),
XMLELEMENT("cidade", C.CESTADO),
XMLFOREST(C.CESTADO AS "estado"),
XMLFOREST(C.CCEP AS "cep")
),
XMLFOREST(C.CFONE1 AS "telefone",
C.CFONE2 AS "telefone",
C.CFONE3 AS "telefone")
) AS cliente
FROM Clientes_rel C
Definindo elementos multivalorados (2)
Clientes_rel
-
ccodigo: number
cnome: varchar2
crua:varchar2
ccidade: varchar2
cestado: varchar2
ccep: varchar2
cfone1: varchar2
cfone2: varchar2
cfone3: varchar2
Pedidos_rel
FK1
-
pcodigo: number
pcliente: number
pdata: date
pdataEntrega: date
prua: varchar2
pcidade: varchar2
pestado: varchar2
pcep: varchar2
FK2
Definindo elementos multivalorados (2)
1.
Criação do tipo
<xs:schema xmlns:xs="...">
<xs:element name="cliente" type="TCliente"/>
<xs:complexType name="TCliente">
<xs:sequence>
<xs:element name="nome" type="xs:string"/>
<xs:element name="endereco" type="TEndereco"/>
<xs:element name="telefone" type="xs:string" .../>
<xs:element name="pedido" type="TPedido"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="codigo" type="xs:integer"/>
</xs:complexType>
<xs:complexType name="TEndereco">...</xs:complexType>
<xs:complexType name="TPedido">
<xs:sequence>
<xs:element name="dataEntrega" type="xs:date"/>
</xs:sequence>
<xs:attribute name="codigo" type="xs:integer"/>
</xs:complexType>
</xs:schema>
Definindo elementos multivalorados (2)
2.
Criação da consulta que define a visão
CREATE VIEW Clientes_v AS
SELECT XMLELEMENT("cliente",
XMLATTRIBUTES(C.CCODIGO AS "codigo"),
XMLFOREST(C.CNOME AS "nome"),
XMLELEMENT("endereco", ... ),
XMLFOREST(C.CFONE1 AS "telefone", ...),
(SELECT XMLAGG( XMLELEMENT("pedido",
XMLATTRIBUTES(P.PCODIGO AS "codigo"),
XMLELEMENT("dataEntrega", P.PDATAENTREGA)
))
FROM Pedidos_rel P
WHERE P.PCLIENTE = C.CCODIGO)
) AS cliente
FROM Clientes_rel C
Definindo Visões em Conformidade
com um esquema

Os passos para definir uma visão que segue
um esquema são:
1.
2.
3.
Defina o esquema XML a ser seguido por cada
elemento da visão XML
Registre o esquema.
Escreva uma consulta que especifique quais dados
em quais tabelas contêm os atributos para os
elementos XML do tipo definido anteriormente.
Definindo Visões em Conformidade
com um esquema
Clientes_rel
-
ccodigo: number
cnome: varchar2
crua:varchar2
ccidade: varchar2
cestado: varchar2
ccep: varchar2
cfone1: varchar2
cfone2: varchar2
cfone3: varchar2
Pedidos_rel
FK1
-
pcodigo: number
pcliente: number
pdata: date
pdataEntrega: date
prua: varchar2
pcidade: varchar2
pestado: varchar2
pcep: varchar2
FK2
Definindo Visões em Conformidade com um
esquema
1.
Criação do esquema
<xs:schema xmlns:xs="...">
<xs:element name="cliente" type="TCliente"/>
<xs:complexType name="TCliente">
<xs:sequence>
<xs:element name="nome" type="xs:string"/>
<xs:element name="endereco" type="TEndereco"/>
<xs:element name="telefone" type="xs:string" .../>
<xs:element name="pedido" type="TPedido"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="codigo" type="xs:integer"/>
</xs:complexType>
<xs:complexType name="TEndereco">...</xs:complexType>
<xs:complexType name="TPedido">...</xs:complexType>
</xs:schema>
Definindo Visões em Conformidade com um
esquema
2.
Registro do esquema
BEGIN
DBMS_XMLSCHEMA.registerSchema('http://www.oracle.com/emp_simple.xsd',
'<schema xmlns=http://www.w3.org/2001/XMLSchema
targetNamespace=http://www.oracle.com/emp_simple.xsd
xmlns:xdb=http://xmlns.oracle.com/xdb
elementFormDefault="qualified">
<xs:element name="cliente" type="TCliente"/>
<xs:complexType name="TCliente">...</xs:complexType>
<xs:complexType name="TEndereco">...</xs:complexType>
<xs:complexType name="TPedido">...</xs:complexType>
</schema>',
TRUE, TRUE, FALSE);
END;
Definindo Visões em Conformidade com um
esquema
3.
Criação da consulta que define a visão
CREATE VIEW Clientes_v OF XMLType
XMLSCHEMA http://www.servidor.com/cliente.xsd
ELEMENT "cliente"
WITH OBJECT ID (extract(OBJECT_VALUE,
'/Cliente/codigo/text()').getnumberval())
AS
SELECT XMLELEMENT("cliente",
XMLATTRIBUTES(
'http://www.servidor.com/cliente.xsd' AS "xmlns",
'http://www.w3.org/2001/XMLSchema-instance' AS "xmlns:xsi",
'http://www.servidor.com/cliente.xsd' AS "xsi:schemaLocation",
C.CCODIGO AS "codigo"),
XMLFOREST(C.CNOME AS "nome"), XMLELEMENT("endereco", ... ),
XMLFOREST(C.CFONE1 AS "telefone", ...),
(SELECT XMLAGG( XMLELEMENT("pedido",...))
FROM Pedidos_rel P WHERE P.PCLIENTE = C.CCODIGO)
)
FROM Clientes_rel C
XPath em Visões SQL/XML

SQL/XML descreve funções para seleção
de elementos XML usando XPath como
linguagem de consulta
Exemplo: Esquema XML
Pedido
@codigo
dataEntrega
enderecoEntrega
rua
cidade
estado
cep
cliente
@codigo
nome
telefone*
item*
@codigo
quantidade
produto
Função EXTRACT ()

Retorna nós (instâncias de XMLType) que
satisfazem a expressão XPath

EXTRACT(
<instância de XMLType>,
<consulta XPath>
)
Função EXTRACT()
Obter o nome dos clientes que efetuaram pedidos:
SELECT EXTRACT(
P.PEDIDO,
'/pedido/cliente/nome'
)
FROM Pedidos_V P;
<nome>Lineu</nome>
<nome>Kelly</nome>
<nome>Valdiana</nome>
Função EXTRACT()
Obter o nome dos clientes que efetuaram pedidos
para o Ceará:
SELECT EXTRACT(
P.PEDIDO,
'/pedido[enderecoEntrega/estado="CE"]
/cliente/nome'
)
FROM Pedidos_V P;
<nome>Lineu</nome>
<nome>Valdiana</nome>
Função EXTRACTVALUE()

Retorna o valor de atributos ou do nó TEXT de
elementos que satisfazem a expressão XPath

Os elementos que satisfazem a expressão
devem ter somente o elemento TEXT como filho

EXTRACTVALUE(
<instância de XMLType>,
<consulta XPath>
)
Função EXTRACTVALUE()
SELECT EXTRACTVALUE(
P.PEDIDO,
'/pedido/cliente/nome'
)
FROM Pedidos_V P;
Lineu
Kelly
Valdiana
Função EXTRACTVALUE()
SELECT EXTRACTVALUE(
P.PEDIDO,
'/pedido/cliente'
)
FROM Pedidos_V P;
ERRO! O elemento cliente tem outros nós
filhos além do TEXT!
Função EXISTSNODE()

Aplica uma expressão XPath a um documento
XML e retorna verdadeiro (1) ou falso (0)
dependendo da existência ou não de algum nó
que satisfaça a XPath

EXISTSNODE(
<instância de XMLType>,
<consulta XPath>
)
Função EXISTSNODE()
Obter os pedidos que contenham Mouse como item:
SELECT * FROM Pedidos_V P
WHERE EXISTSNODE(
P.PEDIDO,
'/pedido/item/produto = "Mouse"'
) = 1;
<pedido codigo="1">
<dataEntrega>...</dataEntrega><enderecoEntrega>...</enderecoEntrega>
<cliente codigo="1">... </cliente>
<item codigo="1">
<quantidade>1</quantidade>
<produto>Mouse</produto>
</item>
<item codigo="2">...</item><item codigo="3">...</item>
</pedido>
Função EXISTSNODE()
Obter os clientes que compraram Mouse:
SELECT EXTRACT(P.PEDIDO, '/pedido/cliente/nome')
FROM Pedidos_V P
WHERE EXISTSNODE(
P.PEDIDO,
'/pedido/item/produto = "Mouse"'
) = 1;
<cliente codigo="1">
<cliente codigo="3">
<nome>Lineu</nome>
<nome>Valdiana</nome>
<telefone>853234649</telefone>
<telefone>853234226</telefone>
<telefone>853216748</telefone> </cliente>
<telefone>859631215</telefone>
</cliente>
XSQL Pages com SQL/XML
A tag <xsql:include-xml> permite que
dados XML sejam incluídos na resposta
ao chamado de uma página XSQL
 LEMBRETE: O resultado de uma página
XSQL deve ser um documento XML bem
formado

Exemplo
Página XSQL que retorna uma documento XML com
o nome dos clientes da tabela CLIENTES_REL:
<xsql:include-xml connection="sqlx"
xmlns:xsql="urn:oracle-xsql">
SELECT XMLELEMENT("clientes",
XMLAGG( XMLELEMENT("cliente", C.CNOME))
).getClobVal()
FROM CLIENTES_REL C
</xsql:include-xml>
Resultado
Exemplo com parâmetros
Página XSQL que retorna uma documento XML com
um cliente dado o código do cliente:
<xsql:include-xml connection="sqlx"
xmlns:xsql="urn:oracle-xsql">
SELECT XMLELEMENT("cliente",
XMLELEMENT("cliente", C.CNOME)
).getClobVal()
FROM CLIENTES_REL C
WHERE C.CCODIGO = {@codigo}
</xsql:include-xml>
Resultado
Exemplo com funções de consulta
Para cada pedido com numero de itens maior ou
igual a 2, retorne o cliente do pedido:
<xsql:include-xml connection="sqlx"
xmlns:xsql="urn:oracle-xsql">
SELECT XMLELEMENT("clientes",
XMLAGG(EXTRACT(P.PEDIDO, '/pedido/cliente'))
).getClobVal()
FROM Pedidos_V P
WHERE EXISTSNODE( P.PEDIDO,
'count(/pedido/item) >= 2') = 1
</xsql:include-xml>
Exemplo com funções de consulta
OU
<clientes connection="sqlx"
xmlns:xsql="urn:oracle-xsql">
<xsql:include-xml>
SELECT EXTRACT(P.PEDIDO, '/pedido/cliente').getClobVal()
FROM Pedidos_V P
WHERE EXISTSNODE( P.PEDIDO,
'count(/pedido/item) = 2') = 1
</xsql:include-xml>
</clientes>
Resultado
Referências

Oracle XML DB Reference
 http://download-
west.oracle.com/docs/cd/B14117_01/appdev.101/b10
790/xdb13gen.htm#i1025386

The Joy of SQLX
 http://www.vsj.co.uk/databases/display.asp?id=322

J. E. Funderburk, S. Malaika, B. Reinwald, XML
programming with SQL/XML and XQuery
Download

SQLX 2 - Universidade Federal do Ceará