75
SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

Embed Size (px)

Citation preview

Page 1: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

SQL/XML

Universidade Federal do CearáDepartamento de ComputaçãoGrupo ARIDA

Page 2: 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

Page 3: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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

Page 4: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

Introdução

É necessária uma solução para que as aplicações possam ser executadas sobre qualquer banco de dados relacional

Page 5: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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

Page 6: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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

Page 7: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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

Page 8: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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

Page 9: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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

Page 10: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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

Page 11: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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

Page 12: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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

Page 13: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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

Page 14: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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]

Page 15: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

XMLElement()

Usado para criar elementos XML XMLELEMENT (

[NAME] id [, XMLAttributes() ] [, ( instância_elemento_XML )+ ])

Page 16: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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>

Page 17: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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>

Page 18: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

XMLAttributes()

Define os atributos de um elemento XMLATTRIBUTES (

expressão_valor [AS alias] [, value_expr [AS alias]*)

Page 19: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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>

Page 20: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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] ]*)

Page 21: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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>

Page 22: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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 ])

Page 23: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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>

Page 24: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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>

Page 25: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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'

Page 26: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

XMLConcat()

Gera um único fragmento XML a partir dos argumentos

XMLConcat ( instância_elemento_XML [, instância_elemento_XML ]*)

Page 27: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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>

Page 28: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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>

Page 29: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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.

Page 30: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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.

Page 31: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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.

Page 32: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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.

Page 33: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

Definindo Visões SQL/XML

Definindo elementos de tipo simples Definindo atributos Definindo elementos de tipos complexo Definindo elementos multivalorados

Page 34: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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

Page 35: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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>

Page 36: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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

Page 37: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

Definindo atributos

Clientes_ rel

- ccodigo: number - cnome: varchar2 - crua:varchar2 - ccidade: varchar2 - cestado: varchar2 - ccep: varchar2 - cfone1: varchar2 - cfone2: varchar2 - cfone3: varchar2

Page 38: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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>

Page 39: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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

Page 40: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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

Page 41: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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>

Page 42: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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

Page 43: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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

Page 44: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

Definindo elementos multivalorados (1)

Clientes_ rel

- ccodigo: number - cnome: varchar2 - crua:varchar2 - ccidade: varchar2 - cestado: varchar2 - ccep: varchar2 - cfone1: varchar2 - cfone2: varchar2 - cfone3: varchar2

Page 45: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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>

Page 46: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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

Page 47: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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

Page 48: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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

Page 49: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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>

Page 50: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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

Page 51: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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 XML2. 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.

Page 52: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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

Page 53: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

Definindo Visões em Conformidade com um esquema1. 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>

Page 54: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

Definindo Visões em Conformidade com um esquema2. 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;

Page 55: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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

Page 56: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

XPath em Visões SQL/XML

SQL/XML descreve funções para seleção de elementos XML usando XPath como linguagem de consulta

Page 57: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

Exemplo: Esquema XMLPedido

@codigodataEntrega

cliente@codigonometelefone*

enderecoEntregaruacidadeestadocep

item*@codigoquantidadeproduto

Page 58: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

Função EXTRACT ()

Retorna nós (instâncias de XMLType) que satisfazem a expressão XPath

EXTRACT( <instância de XMLType>, <consulta XPath>)

Page 59: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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:

Page 60: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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á:

Page 61: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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>)

Page 62: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

Função EXTRACTVALUE()

SELECT EXTRACTVALUE( P.PEDIDO, '/pedido/cliente/nome' )FROM Pedidos_V P;

LineuKellyValdiana

Page 63: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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!

Page 64: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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>)

Page 65: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

Função EXISTSNODE()

SELECT * FROM Pedidos_V PWHERE 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:

Page 66: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

Função EXISTSNODE()

SELECT EXTRACT(P.PEDIDO, '/pedido/cliente/nome')FROM Pedidos_V PWHERE 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>

Page 67: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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

Page 68: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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:

Page 69: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

Resultado

Page 70: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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:

Page 71: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

Resultado

Page 72: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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:

Page 73: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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

Page 74: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

Resultado

Page 75: SQL/XML Universidade Federal do Ceará Departamento de Computação Grupo ARIDA

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