1 / 75

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ção Visões SQL/XML. Introdução. Muitas aplicações usam XML para troca de dados com seus bancos relacionais

baird
Download Presentation

SQL/XML

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. Roteiro • Introdução • XML versus Relacional • XML + Relacional • SQL/XML • Funções de Publicação • Visões SQL/XML

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

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

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

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

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

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

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

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

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

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

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

  14. Exemplo: Esquema Relacional

  15. XMLElement() • Usado para criar elementos XML • XMLELEMENT ( [NAME] id [, XMLAttributes() ] [, ( instância_elemento_XML )+ ])

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

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

  18. XMLAttributes() • Define os atributos de um elemento • XMLATTRIBUTES ( expressão_valor [AS alias] [, value_expr [AS alias]*)

  19. XMLAttributes() SELECT XMLELEMENT("CLIENTE_CEARA", XMLATTRIBUTES( CLI.CCODIGO AS "CODIGO" ), XMLELEMENT("NOME", CLI.CNOME ), XMLELEMENT("CIDADE", CLI.CCIDADE ) ) FROM CLIENTES_REL CLI WHERE 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>

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

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

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

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

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

  25. 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'

  26. XMLConcat() • Gera um único fragmento XML a partir dos argumentos • XMLConcat ( instância_elemento_XML [, instância_elemento_XML ]*)

  27. XMLConcat() SELECT XMLELEMENT("PRODUTO_NOME", PROD.PNOME), XMLELEMENT("PRODUTO_PRECO", PROD.PPRECO) FROM PRODUTOS_REL PROD

  28. XMLConcat() SELECT XMLCONCAT( XMLELEMENT("PRODUTO_NOME", PROD.PNOME), XMLELEMENT("PRODUTO_PRECO", PROD.PPRECO) ) FROM PRODUTOS_REL PROD

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

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

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

  32. 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. • Escreva uma consulta que especifique quais dados em quais tabelas contêm os atributos para os elementos XML do tipo definido anteriormente.

  33. Definindo Visões SQL/XML • Definindo elementos de tipo simples • Definindo atributos • Definindo elementos de tipos complexo • Definindo elementos multivalorados

  34. Definindo elementos de tipo simples

  35. Definindo elementos de tipo simples • 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>

  36. Definindo elementos de tipo simples • 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 Nome da coluna da visão OU CREATE VIEW Clientes_v AS SELECT XMLELEMENT("cliente", XMLFOREST(C.CNOME AS "nome") ) AS cliente FROM Clientes_rel C

  37. Definindo atributos

  38. Definindo atributos • 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>

  39. Definindo atributos • 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

  40. Definindo elementos de tipo complexo

  41. Definindo elementos de tipo complexo <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> • Criação do tipo

  42. Definindo elementos de tipo complexo • 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

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

  44. Definindo elementos multivalorados (1)

  45. Definindo elementos multivalorados (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>

  46. Definindo elementos multivalorados (1) 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 • Criação da consulta que define a visão

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

  48. Definindo elementos multivalorados (2)

  49. Definindo elementos multivalorados (2) <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> • Criação do tipo

  50. Definindo elementos multivalorados (2) 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 • Criação da consulta que define a visão

More Related