Banco de Dados
Tópicos
• Histórico
• Exemplo
• Funções de Publicação
– XMLElement() – XMLAttributes() – XMLForest() – XMLAgg() – XMLConcat()Histórico
• SQL/XML (ou SQLX):
– parte do padrão SQL:2003
– permite criar elementos XML a partir de consultas usando funções de publicação
– comandos SQL/XML
• tratados diretamente pelo SGBD
Histórico
• SQL/XML (ou SQLX):
– criada com a participação de:
• Oracle, IBM, Microsoft, Sybase, DataDirect Technologies
– suportada por:
• Sybase ASE 12.5, IBM DB2 8.1, Oracle 9i R2 • SQL Server: via a cláusula FOR XML
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 Itens_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: Itens_rel[ipedido] ⊂ Pedidos_rel[pcodigo] FK3: Itens_rel[iproduto] ⊂ Produtos_rel[pcodigo]Exemplo
Esquema XML <<Tipo XML>> Tpedido - codigo: integer - data: date - dataEntrega: date <<Tipo XML>> Tcliente - codigo: integer - nome: string- telefone: set of string
<<Tipo XML>> Tendereco - rua: string - cidade: string - estado: string - cep: string <<Tipo XML>> Titem - codigo: integer - quantidade: integer - produto: string enderecoEntrega cliente itens 1 1..* 1
Funções de Publicação
• Funções de publicação XML
– usam valores SQL para gerar valores XML
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()
XMLElement()
• Gera um elemento XML
– usa um valor retornado pela consulta
– permite especificar o nome do elemento
XMLELEMENT (
[NAME] id
[, XMLAttributes() ]
[, ( instância_elemento_XML )+ ]
)
XMLElement()
SELECT CLI.CNOME
FROM CLIENTES_REL CLI
WHERE CLI.CESTADO = 'CE'
CNOME
---Lineu Valdiana
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()
• Gera atributos de elementos XML
– usa valores retornados pela consulta – adota o nome da coluna como default
para o nome do atributo
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 CLI WHERE CLI.CESTADO = 'CE'
<CLIENTE_CEARA CODIGO="1"> <NOME>Lineu</NOME>
<CIDADE>Fortaleza</CIDADE> </CLIENTE_CEARA>
<CLIENTE_CEARA CODIGO="3"> <NOME>Valdiana</NOME>
<CIDADE>Fortaleza</CIDADE> </CLIENTE_CEARA>
XMLForest()
• Gera uma lista de elementos XML:
– usa valores retornados pela consulta
– adota os nomes das colunas com default dos nomes dos elementos
– valores nulos não geram elementos XML
XMLFOREST (
expressao_valor [AS alias]
[, expressao_valor [AS alias] ]*
)
XMLForest()
SELECT XMLELEMENT("CLIENTE_CEARA", XMLFOREST( CLI.CNOME AS NOME, CLI.CCIDADE AS CIDADE ) )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>
XMLAgg()
• Gera um único valor contendo uma floresta XML
– combina uma coleção de tuplas, cada uma contendo um único valor XML
XMLAGG (
instancia_elemento_XML
[ ORDER BY lista_atributos ]
)
XMLAgg()
SELECT XMLELEMENT("CLIENTES_CE", XMLAGG( XMLELEMENT("ITEM", CLI.CNOME ) ) )FROM CLIENTES_REL CLI
WHERE CLI.CESTADO = 'CE' <CLIENTES_CE>
<ITEM>Lineu</ITEM> <ITEM>Valdiana</ITEM> </CLIENTES_CE>
<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
XMLConcat()
• Gera um único valor contendo uma floresta XML
– combina uma lista de valores XML
XMLConcat (
instância_elemento_XML
[, instância_elemento_XML ]*
)
XMLConcat()
SELECT XMLELEMENT("PEDIDO_CEARA", XMLATTRIBUTES( PED.PCODIGO AS CODIGO ), XMLCONCAT( (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'
<PEDIDO_CEARA CODIGO="3"> <ITEM>Mouse</ITEM> <ITEM>Monitor</ITEM> <ITEM>Modem</ITEM> </PEDIDO_CEARA>
Referências
• Oracle XML DB Reference http://download-west.oracle.com/docs/cd/B14117_01/appdev.101/b10790/xd b13gen.htm#i1025386 • The Joy of SQLX http://www.vsj.co.uk/databases/display.asp?id=322• J. E. Funderburk, S. Malaika, B. Reinwald,