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