Download - SQL/XML
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çãoVisõ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:Relacional – 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
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 transparenteStatements 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 consultaJunçõ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 valores relacionais em elementos XML
XMLAttributes() define 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
- pcodigo: number - pcliente: number - pdata: date - pdataEntrega: date - prua: varchar2 - pcidade: varchar2 - pestado: varchar2 - pcep: varchar2
I tens_ rel
- icodigo: number - ipedido: number - iproduto: number - iquantidade: number - idesconto: float
Produtos_ rel
- pcodigo: number - pnome: varchar2 - ppreco: float - ptaxa: float
FK1 FK2 FK3
FK1: Pedidos_rel[pcliente] Clientes_rel[ccodigo] FK2: I tens_rel[ipedido] Pedidos_rel[pcodigo] FK3: I tens_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 CLIWHERE 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 CLIWHERE 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 ) )FROM CLIENTES_REL CLIWHERE CLI.CESTADO = 'CE'
<CLIENTE_CEARA CODIDO="1"><NOME>Lineu</NOME><CIDADE>Fortaleza</CIDADE>
</CLIENTE_CEARA>
<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 CLIWHERE 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 CLIGROUP 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 PEDWHERE 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:1. 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.
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
Definindo elementos de tipo simples1. 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 simples2. Criação da consulta que define a visão
OU
Nome da coluna da visão
CREATE VIEW Clientes_v ASSELECT XMLELEMENT("cliente", XMLELEMENT("nome", C.CNOME)) AS clienteFROM Clientes_rel C
CREATE VIEW Clientes_v ASSELECT XMLELEMENT("cliente", XMLFOREST(C.CNOME AS "nome")) AS clienteFROM Clientes_rel C
Definindo atributos
Clientes_ rel
- ccodigo: number - cnome: varchar2 - crua:varchar2 - ccidade: varchar2 - cestado: varchar2 - ccep: varchar2 - cfone1: varchar2 - cfone2: varchar2 - cfone3: varchar2
Definindo atributos1. 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 atributos2. Criação da consulta que define a visão
CREATE VIEW Clientes_v ASSELECT XMLELEMENT("cliente", XMLATTRIBUTES(C.CCODIGO AS "codigo"), XMLFOREST(C.CNOME AS "nome")) AS clienteFROM 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
Definindo elementos de tipo complexo1. 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 complexo2. Criação da consulta que define a visão
CREATE VIEW Clientes_v ASSELECT 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 clienteFROM Clientes_rel C
OU
CREATE VIEW Clientes_v ASSELECT 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 clienteFROM 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
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 ASSELECT 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 clienteFROM Clientes_rel C
OU
CREATE VIEW Clientes_v ASSELECT 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 clienteFROM 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
- pcodigo: number - pcliente: number - pdata: date - pdataEntrega: date - prua: varchar2 - pcidade: varchar2 - pestado: varchar2 - pcep: varchar2
FK1
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 ASSELECT 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 clienteFROM 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. Defina o esquema XML a ser seguido por cada
elemento da visão XML
2. Registre o esquema.
3. 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
- pcodigo: number - pcliente: number - pdata: date - pdataEntrega: date - prua: varchar2 - pcidade: varchar2 - pestado: varchar2 - pcep: varchar2
FK1
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 esquema3. Criação da consulta que define a visão
CREATE VIEW Clientes_v OF XMLTypeXMLSCHEMA http://www.servidor.com/cliente.xsdELEMENT "cliente"WITH OBJECT ID (extract(OBJECT_VALUE, '/Cliente/codigo/text()').getnumberval())ASSELECT 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 XMLPedido
@codigodataEntrega
cliente@codigonometelefone*
enderecoEntregaruacidadeestadocep
item*@codigoquantidadeproduto
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()
SELECT EXTRACT(
P.PEDIDO,
'/pedido/cliente/nome'
)
FROM Pedidos_V P;
<nome>Lineu</nome><nome>Kelly</nome><nome>Valdiana</nome>
Obter o nome dos clientes que efetuaram pedidos:
Função EXTRACT()
<nome>Lineu</nome><nome>Valdiana</nome>
SELECT EXTRACT(
P.PEDIDO,
'/pedido[enderecoEntrega/estado="CE"]
/cliente/nome'
)
FROM Pedidos_V P;
Obter o nome dos clientes que efetuaram pedidos para o Ceará:
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;
LineuKellyValdiana
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()
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>
Obter os pedidos que contenham Mouse como item:
Função EXISTSNODE()
SELECT EXTRACT(P.PEDIDO, '/pedido/cliente/nome')
FROM Pedidos_V P
WHERE EXISTSNODE(
P.PEDIDO,
'/pedido/item/produto = "Mouse"'
) = 1;
Obter os clientes que compraram Mouse:
<cliente codigo="1"> <nome>Lineu</nome> <telefone>853234649</telefone> <telefone>853216748</telefone> <telefone>859631215</telefone></cliente>
<cliente codigo="3"> <nome>Valdiana</nome> <telefone>853234226</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
<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>
Página XSQL que retorna uma documento XML com o nome dos clientes da tabela CLIENTES_REL:
Resultado
Exemplo com parâmetros
<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>
Página XSQL que retorna uma documento XML com um cliente dado o código do cliente:
Resultado
Exemplo com funções de consulta
<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>
Para cada pedido com numero de itens maior ou igual a 2, retorne o cliente do pedido:
Exemplo com funções de consulta
<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>
OU
Resultado
Referências
Oracle XML DB Reference http://download-west.oracle.com/docs/cd/B14117_01/
appdev.101/b10790/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