SGBDOO - Padrão ODMG Componentes: – Modelo de objetos – Linguagem de especificação dos objetos ODL - Object Definition Language – Linguagem de Consulta UFPA Informática OQL - Object Query Language Declarativa, não procedural para consulta e atualização da base de dados Baseada no SQL – Ligações (bindings) com LPOO C++, Smalltalk e Java 3. Padrão ODMG 1 SGBDOO - Padrão ODMG Arquitetura Declarações ODL Aplicação em LPOO Processador ODL metadados Compilador Runtime SGBDOO Binário da Aplicação UFPA Informática Linker BD Aplicação Executável 3. Padrão ODMG 2 Modelo de Objetos ODMG Tipos Primitivas básicas: – Objeto: possui identificador único – Literal: não possui identificador – Tanto objetos quanto literais podem ser categorizados por um tipo Estado de Objeto UFPA Informática – Definido pelo conjunto de propriedades: atributos e relacionamentos 3. Padrão ODMG 3 Modelo de Objetos ODMG Tipos Tipo: dois aspectos – uma especificação externa - definição abstrata de operações que podem ser chamadas propriedades de cada objeto exceções que podem ser sinalizadas – uma ou mais implementações UFPA Informática cada uma define como as operações estão implementadas e outros detalhes internos especificação implementação C++ implementação Java 3. Padrão ODMG 4 Modelo de Objetos ODMG Tipos Tipos de Especificações – Definição de Interface define apenas comportamento e não possui instâncias ex.: interface Empregado {...}; – Definição de literal UFPA Informática define apenas estado e possui instâncias inclui a definição do tipo struct e dos tipos primitivos boolean, char, short, long, float, double, octet, string, any ex.: struct Complexo {float re; float mi}; interface classe literal operações estado (comportamento) (propriedades) 3. Padrão ODMG 5 Modelo de Objetos ODMG Tipos Tipos de Especificações (cont.) – Definição de Classe UFPA Informática define comportamento e estado possui instâncias ex.: class Pessoa {...}; Tipos de Implementação – Representação da especificação em uma linguagem específica de programação – Definição de um método para cada operação abstrata definida na especificação 3. Padrão ODMG 6 Modelo de Objetos ODMG Tipos - Herança Empregado Herança IS-A (é um) – Exemplos: interface Empregado {...}; interface Professor: Empregado {...}; class Professor_Titular: Professor {...}; Professor Professor Titular UFPA Informática – Pode haver herança múltipla – Apenas a interface é herdada (comportamento) classes podem herdar de interfaces interfaces podem herdar de interfaces 3. Padrão ODMG 7 Modelo de Objetos ODMG Tipos - Herança Herança de Estado (extends) – Semelhante a herança em LPOO – Não admite herança múltipla – Somente entre classes: UFPA Informática class Pessoa { attribute string nome; attribute Date dataNasc}; herança extends (estado + comportamento) class EmpregadoPess extends Pessoa : Empregado { attribute Date dataContr; herança IS-A attribute Currency sal;...}; (de comportamento) 3. Padrão ODMG 8 Modelo de Objetos ODMG Tipos Extensão de um tipo (extent) – conjunto de todas as instâncias do tipo que existem no BD – equivalente ao conceito de tabela no modelo relacional – lista mantida automaticamente pelo BD Chave UFPA Informática – apesar do modelo OO não conter o conceito de chave, ele é útil em SGBD – Chave = um ou mais atributos cujos valores identificam uma instância dentro de uma extensão 3. Padrão ODMG 9 Modelo de Objetos ODMG Tipos Métodos do objeto – – – – new( ): usado para criação de objetos same_as( ): verifica se dois objetos tem o mesmo identificador copy( ): faz uma cópia do objeto em questão delete( ): remove o objeto da memória e do BD Nome de Objeto UFPA Informática – identificador fornecido pelo usuário – serve para dar nomes a objetos “raiz” 3. Padrão ODMG 10 Modelo de Objetos ODMG Tipos Objetos persistentes e transientes – objetos de mesmo tipo podem ser persistentes ou transientes – podem ser manipulados com as mesmas operações Coleções: – Set <t> (conjunto) sem ordenação e sem duplicatas – Bag <t> (“sacola”) UFPA Informática sem ordenação e admite duplicatas – List <t> (lista ordenada) com ordenação e admite duplicatas 3. Padrão ODMG 11 3.1 Modelo de Objetos ODMG Tipos Coleções: – Array <t> (arranjo) com ordenação e admite duplicatas localiza elementos por posição – Dictionary <t,v> (lista indexada) com ordenação e admite duplicatas localização por chave associada a cada elemento Tipos estruturados (structured_object) UFPA Informática – Date, Interval, Time, TimeStamp 3. Padrão ODMG 12 Modelo de Objetos ODMG Tipos Literal – atomic literal boolean, char, short, long, float, double, octet, string, any enum (enumeração) – attribute enum sexo (masculino, feminino) – collection literal UFPA Informática sem OID set, bag, list, array, dictionary tipo Table (tabela) – equivalente a uma tabela no modelo relacional – mesmo que uma coleção de struct 3. Padrão ODMG 13 Modelo de Objetos ODMG Tipos Literal – structured literal Pré-definidos: date, interval, time, timestamp Definidos pelo usuário: struct endereço{ string rua; string no; string complemento} – null literal exemplo: nullable_float, nullable_set,... UFPA Informática 3. Padrão ODMG 14 Linguagem de Definição - ODL Estado e Comportamento de tipos Estado – Atributo valor pertence a um tipo não tem propriedade nem participa de relacionamentos não pode ser especializado UFPA Informática atributo literal atômico interface Pessoa{ attribute short idade; attribute string nome; attribute enum sexo (masculino, feminino); attribute address home_address; attribute set <Phone_no> phones; attribute Department dept atributo objeto (referência a um OID) }; 3. Padrão ODMG 15 Linguagem de Definição - ODL Estado e Comportamento de tipos Estado – Relacionamento UFPA Informática somente relacionamentos binários: 1:1, 1:n, m:n definido sobre dois tipos cada tipo participante tem que possuir OID (literais não participam) relacionamento não é um objeto relacionamento é definido implicitamente por caminhos de travessia entre objetos integridade referencial é mantida automaticamente pelo SGBD 3. Padrão ODMG 16 Linguagem de Definição - ODL Estado e Comportamento de tipos Estado UFPA Informática interface Professor { ... relationship Set<Curso> ministra inverse Curso :: ehministrado_por; ...}; interface Curso { ... relationship Professor eh_ministrado_por inverse Professor::ministra; ...}; para muitos (set) para um 3. Padrão ODMG 17 Linguagem de Definição - ODL Estado e Comportamento de tipos Atributo Referência UFPA Informática – referência a um objeto (relacionamento unidirecional) – não é relacionamento ODMG interface Pessoa{ attribute short idade; attribute string nome; attribute enum sexo (masculino, feminino); attribute address home_address; attribute set <Phone_no> phones; attribute Department dept }; atributo objeto (referência a um objeto - OID) 3. Padrão ODMG 18 Linguagem de Definição - ODL Estado e Comportamento de tipos Operações – Além de atributos e relacionamentos, o restante da especificação do tipo contém um conjunto de assinaturas de operação – Assinatura de operação: UFPA Informática nome da operação nome e tipo de cada argumento tipo de valor retornado exceções que podem ser sinalizadas pela operação 3. Padrão ODMG 19 Linguagem de Definição - ODL Exemplo ODL - Universidade Salário Estudante Empregado <<extends>> Monitor IF_Estudante UFPA Informática préreq <<extends>> Professor auxilia matrícula Disciplina partes Parte ministra 3. Padrão ODMG 20 Linguagem de Definição - ODL Exemplo ODL - Universidade class Disciplina (extent disciplinas) { attribute string nome; attribute string numero; UFPA Informática relationship list<Parte> asPartes inverse Parte:: aDiscip; relationship set<Disciplina> temPreReq inverse Disciplina:: ePreReq; relationship set<Disciplina> ePreReq inverse Disciplina:: temPreReq; relationship set<IF_Estudante> osEstud inverse ID_Estudante::asDiscip; boolean oferecer (in unsigned short semestre) raises (ja_oferec); boolean cancelar (in unsigned short semestre) raises (nao_oferec); }; 3. Padrão ODMG 21 Linguagem de Definição - ODL Exemplo ODL - Universidade UFPA Informática class Parte (extent partes) { attribute string numero; relationship Monitor oMonitor inverse Monitor:: asPartes; relationship Professor oProf inverse Professor:: asPartes; relationship Disciplina aDiscip inverse Disciplina:: asPartes; }; 3. Padrão ODMG 22 Linguagem de Definição - ODL Exemplo ODL - Universidade class Salario { attribute float base; attribute float hora_extra; attribute float bonus; UFPA Informática }; 3. Padrão ODMG 23 Linguagem de Definição - ODL Exemplo ODL - Universidade UFPA Informática class Empregado (extent empregados) { attribute string nome; attribute short id; relationship Salario oSalario; void contratar(); void demitir() raises (não_existe_emp); }; 3. Padrão ODMG 24 Linguagem de Definição - ODL Exemplo ODL - Universidade UFPA Informática class Professor (extent professores) { attribute enum Nivel(titular, adjunto, assistente) nivel; relationship set<Parte> asPartes inverse Parte :: oProf; void promocao() raises (inelegivel_promo); }; 3. Padrão ODMG 25 Linguagem de Definição - ODL UFPA Informática Exemplo ODL - Universidade interface IF_Estudante { struct Endereco { string casa; string numero;} attribute Endereco end_dorm; attribute string nome; attribute string id; relationship set<Disciplina> asDiscip; inverse Disciplina :: osEstud; boolean inscreve_disc(in Disciplina discip) raises (sem_pre_req, sem_vagas); void cancela_disc(in Disciplina discip) raises (não_inscrito); ); 3. Padrão ODMG 26 3.2 Linguagem de Definição - ODL UFPA Informática Exemplo ODL - Universidade class Monitor extends Empregado : IF_Estudante { attribute Endereco end_dorm; attribute string nome; attribute string id; relationship set<Disciplina> asDiscip; inverse Disciplina :: osEstud; relationship set<Parte> asPartes; estado é redefinido, inverse Parte :: oMonitor; já que IF_Estudante é ); uma interface (não class Estudante : IF_Estudante especifica estado) (extent estudantes) { attribute Endereco end_dorm; attribute string nome; attribute string id; relationship set<Disciplina> asDiscip; inverse Disciplina :: osEstud; 3. Padrão ODMG 27 }; 3.2 Linguagem de Definição - ODL Exemplo ODL - BD Genealogia class Pessoa (extent pessoas) { attribute string nome; attribute struct Address {unsigned short numero, string rua, Cidade cidade} endereco; UFPA Informática relationship Pessoa conjuge inverse Pessoa :: conjuge; relationship set<Pessoa> filhos inverse Pessoa :: pais; relationship list<Pessoa> pais inverse Pessoa :: filhos; void nascim (in string nome_pessoa; boolean casamento (in string nome_pessoa) raises (não_há_pessoa); unsigned short descendentes (out set<Pessoa> todos_desc) raises (não_há_pessoa); }; 3. Padrão ODMG 28 3.2 Linguagem de Definição - ODL Exemplo ODL - BD Genealogia UFPA Informática class Cidade (extent cidades key cep) { attribute unsigned short cep; attribute string nome; attribute set<Pessoa> população; }; 3. Padrão ODMG 29 Exercício - ODL Criar as Classes Pessoa Funcionário Aluno n n 1 gerencia 1 UFPA Informática n Prédio usa usa n n comp. de Escritório n Sala Sala de Aula 30 3.3. Linguagem de Consulta OQL Visão Geral Características de OQL - Object Query Language – linguagem associativa de consultas baseada no modelo de objetos do ODMG baseada em SQL-92 com extensões de orientação a objetos provê primitivas para manipular coleções linguagem funcional com expressões aninhadas UFPA Informática – – – – a consulta é especificada no SGBD através de uma expressão SGBD passa ao usuário apenas os objetos que resolvem a consulta 3. Padrão ODMG 31 3.3. Linguagem de Consulta OQL Visão Geral Características de OQL - Object Query Language – não é linguagem completa para desenvolvimento de aplicações – baseada no mesmo sistema de tipos de uma LPOO consultas OQL podem ser embutidas na LPOO consultas OQL podem chamar operações programadas na LPOO – não possui comandos de alteração uso da LPOO para alterações UFPA Informática – Objeto consultado: coleções objetos com nomes (pontos de entrada no BD) extensões de classes (extent) 3. Padrão ODMG 32 3.3. Linguagem de Consulta OQL Visão Geral Modelo para exemplos: – extent de Pessoa é pessoas – extent de Empregado é empregados – Presidente é nome de um objeto de pessoa subordinação 1 UFPA Informática Pessoa Empregado nome data_nasc sexo salário idade() nível() subordinados 0..* 3. Padrão ODMG 33 3.3. Linguagem de Consulta OQL Visão Geral Conjunto no resultado select distinct p.idade from Pessoas p where p.nome = “José” UFPA Informática – Obtém um conjunto com as diferentes idades de pessoas com nome = “José” – o resultado é do tipo set<integer> – cláusula distinct faz com que seja obtido set e não bag 3. Padrão ODMG 34 3.3. Linguagem de Consulta OQL Visão Geral Estrutura no resultado, uso de operação select distinct struct (id:p.idade, sx:p.sexo) from Pessoas p UFPA Informática – Obtém um par com a idade e o sexo de cada pessoa – o resultado é do tipo set<struct> – uso da operação idade() na consulta OQL como se fosse atributo 3. Padrão ODMG 35 3.3. Linguagem de Consulta OQL Visão Geral Consulta aninhada no resultado UFPA Informática select distinct struct (nome:emp.nome, altos_emp: (select s from emp.subordinados s where s.salario > 5000)) from Empregados emp – Para cada empregado, obter um par formado por seu nome e pelo conjunto dos empregados que a ele estão subordinados e cujo salário é maior que 5.000 – tipo do resultado: set<struct(nome:string, altos_emp:bag<Empregado>)> 3. Padrão ODMG 36 3.3. Linguagem de Consulta OQL Visão Geral Consulta aninhada no resultado distinct = set Empregado é especialização de pessoa herança de propriedades UFPA Informática consulta aninhada no select distinct struct resultado (nome:emp.nome, relacionamento subordinados de emp altos_emp: retorna conjunto de sem distinct = bag (select s subordinados from emp.subordinados s where s.salario > 5000)) from Empregados emp 3. Padrão ODMG 37 3.3. Linguagem de Consulta OQL Visão Geral Consulta aninhada no from select struct (id:emp_grad.idade, sx:emp_grad.sexo) from (select emp from Empregados emp where emp.nível = 10) as emp_grad where emp_grad.salario > 1000 UFPA Informática – Obtém a idade e o sexo de cada empregado de nível 10 com salário > 1000 3. Padrão ODMG 38 3.3. Linguagem de Consulta OQL Visão Geral Consultas sem select – Nomes de objetos ou de extents podem ser usados diretamente – Exemplos: UFPA Informática Obter o presidente: Presidente Obter os subordinados do presidente: Presidente.subordinados Obter o conjunto de todas as pessoas: Pessoas 3. Padrão ODMG 39 3.3. Linguagem de Consulta OQL Visão Geral Objetos e literais no resultado da consulta – OID do objeto pode ser OID do objeto no BD select emp from Empregados... OID gerado pelo processador de consultas UFPA Informática select Pessoa(nome:..., data_nasc:...)... 3. Padrão ODMG 40 3.3. Linguagem de Consulta OQL Visão Geral Expressões de caminho - path expression – notações: pess.conjuge pess->conjuge – exemplo (BD genealógico) pess.conjuge.endereco.cidade.nome UFPA Informática um atributo nome uma cidade, navegação de relacionamento um atributo endereço outra pessoa, obtida por navegação de relacionamento uma pessoa 3. Padrão ODMG 41 3.3. Linguagem de Consulta OQL Visão Geral Path Expressions e relacionamentos N:N – pess.filhos.nome – consulta incorreta pois: pess.filhos é um conjunto de pessoas (set<Pessoa>) a lista não tem o atributo nome, e sim cada elemento da lista UFPA Informática – Forma correta: select filho.nome from pess.filhos as filho – Resultado: bag<string> 3. Padrão ODMG 42 3.3. Linguagem de Consulta OQL Visão Geral Cláusula From com várias coleções select filho.endereço from Pessoas pess, Pess.filhos filho – Os dois elementos do from são interrelacionaods UFPA Informática – Pessoas pess indica que a consulta varre todo o extent de Pessoa – pess.filhos filho indica que, para cada pessoa pess, será varrido o conjunto de seus filhos (pess.filhos) 3. Padrão ODMG 43 3.3. Linguagem de Consulta OQL Visão Geral Cláusula WHERE - relação entre coleções UFPA Informática select fil.endereço from Pessoas pess, Pess.filhos fil where pess.endereco.rua= “Beco das Tamancas” and count(pess.filhos) > 1 and pess.endereco.cidade = fil.endereco.cidade – Obtém o conjunto de endereços dos filhos de pessoas com mais de um filho que vivem (pais) no Beco das Tamancas e cujos filhos vivem na mesma cidade 3. Padrão ODMG 44 3.3. Linguagem de Consulta OQL Visão Geral Cláusula WHERE - Junção select from where pess Pessoas pess, Cidades cid pess.nome = cid.nome UFPA Informática – Obtém as pessoas cujo nome é idêntico a um nome de cidade 3. Padrão ODMG 45 3.3. Linguagem de Consulta OQL Visão Geral Tratamento de valores vazios - (nil) – o resultado do acesso a nil é UNDEFINED – Regras: . ou -> aplicado sobre UNDEFINED resulta UNDEFINED comparação (=, !=, <,...) com operandos UNDEFINED resulta em FALSE is_defined(predicado) e is_undefined(predicado) testam se um predicado é definido ou não qualquer outra operação sobre UNDEFINED resulta em erro de execução UFPA Informática 3. Padrão ODMG 46 3.3. Linguagem de Consulta OQL Visão Geral Tratamento de valores vazios - (nil) – Exemplo 1: obter os empregados de Curitiba select emp from Empregados emp where emp.endereco.cidade = “Curitiba” UFPA Informática – Exemplo 2: erro - um dos empregados não possui endereço select emp.endereco.cidade from Empregados emp – Exemplo 3: forma correta select emp.endereco.cidade from Empregados emp where is_defined(emp.endereco.cidade) 3. Padrão ODMG 47 3.3. Linguagem de Consulta OQL Visão Geral Chamada de Operações – Operações podem ser referenciadas na mesma posição em que atributos são usados – o usuário não necessita saber se a chamada é a um atributo ou método (a menos que existam parâmetros) referência a uma operação – Exemplo: select max( select filho.idade UFPA Informática from pess.filhos filho) from Pessoas pess where pess.nome = “José da Silva” 3. Padrão ODMG 48 3.3. Linguagem de Consulta OQL Visão Geral Chamada de Operações – Supor que UFPA Informática – primogênito() é um método de pessoa que retorna uma instância de pessoa – vive_em(string) retorna true se a pessoa vive na cidade dada como parâmetro select pess.primogenito.endereco.rua from Pessoas pess where pess.vive_em(“Curitiba”) and count(pess.filhos) > 0 referência a uma operação 3. Padrão ODMG 49 3.3. Linguagem de Consulta OQL Visão Geral Polimorfismo – O método a ser chamado é decidido em tempo de execução (late binding) Pessoa UFPA Informática select pess.atividades from Pessoas pess atividades() Empregado Estudante atividades() atividades() média() 3. Padrão ODMG 50 3.3. Linguagem de Consulta OQL Visão Geral Definição estática de classe – Type casting – indicação de que um objeto pertence a uma subclasse específica UFPA Informática select ((Estudante)pess).média from Pessoas pess where “estudar” in pess.atividades Pessoa atividades() Empregado Estudante atividades() atividades() média() 3. Padrão ODMG 51 3.3. Linguagem de Consulta OQL Visão Detalhada OQL é linguagem funcional e tipada – cada expressão envolve um operador e seus operandos tipados – uma expressão (consulta) retorna um objeto ou um literal – operandos podem ser expressões – uma expressão tem um tipo (estático) derivado: UFPA Informática da estrutura da consulta da definição de tipo dentro da consulta de tipos de objetos e literais consultados 3. Padrão ODMG 52 3.3. Linguagem de Consulta OQL Visão Detalhada Consultas nomeadas UFPA Informática – consultas usadas frequentemente podem ser armazenadas no BD sob um nome (visão em SQL) – consultas nomeadas podem ter parâmetros – Exemplo: define idade_de(x) as select pess.idade from Pessoas pess where pess.nome = x – Uso: idade_de(“Jose da Silva”) 3. Padrão ODMG 53 3.3. Linguagem de Consulta OQL Visão Detalhada UFPA Informática Tipos de expressões OQL – – – – – – – – – – Expressão elementar Construtor Expressão de tipo atômico Expressão de objeto Expressão de coleção Select-from-where Operadores Group by e Order by Expressão de coleção indexada Operação de coleção Chamada de função 3. Padrão ODMG 54 3.3. Linguagem de Consulta OQL Visão Detalhada Expressão elementar – Literal Atômico referência vazia: nil boolean: true false integer: 27 3789 Float: 3.14 345.55e-2 Character: ‘x’ String: “João” – Objeto nomeado Estudantes Presidente UFPA Informática Extent da classe: nome definido para o objeto: 3. Padrão ODMG 55 3.3. Linguagem de Consulta OQL Visão Detalhada Expressão elementar – Variável de iteração Cláusula FROM select ... from Pessoas as p select ... from Pessoas p UFPA Informática select ... from p in Pessoas p é uma variável de iteração pode ser usada como uma expressão elementar 3. Padrão ODMG 56 3.3. Linguagem de Consulta OQL Visão Detalhada Construtor – Expressão que retorna uma nova instância de um tipo – Exemplos: UFPA Informática Empregado (nome:”José da Silva”, sexo:”M” data_nasc:”13/9/98” salario: 325 chefe: Presidente) struct(nome:”José da Silva”, sexo:”M”) set(1,2,4) list(1,4,3,6) list(3..5) bag(1,5,6,8) array(1,4,6) 3. Padrão ODMG 57 3.3. Linguagem de Consulta OQL Visão Detalhada Expressão de tipo atômico – retorna um objeto atômico – Operadores unários: +, -, abs, not Exemplo: +5, not(salario > 10) – Operadores binários aritméticos: +, -, *, /, mod relacionais: =, !=, <, <=,>,>= booleanos: and, or string: ||, + (concatenação), like – Exemplos: “José”|| “Silva” ou “José” + “Silva” “s” in “José” “José”3 retorna “s” “José”[2:4] retorna “osé” nome like “J?s*” UFPA Informática 3. Padrão ODMG 58 3.3. Linguagem de Consulta OQL Visão Detalhada Expressões de Objeto – Referência a propriedades e operações UFPA Informática pess.nome emp.chefe emp.chefe.chefe pess.idade 3. Padrão ODMG 59 3.3. Linguagem de Consulta OQL Visão Detalhada Expressões de coleção – Quantificador Universal (for all) for all est in Estudantes: est.id != ““ UFPA Informática – Quantificador Existencial (exists) exists disc in EstudFulano.asDiscip exists part in disc.asPartes: part.oProf.nome=“Codd” select from where disc.nome disciplinas disc exists (select part.numero from part in disc.asPartes where part.oProf.nome=“Codd”) 3. Padrão ODMG 60 3.3. Linguagem de Consulta OQL Visão Detalhada Expressões de Coleção – Teste de contenção em coleção pess in Pessoas – Funções de Agregação (mesmas do SQL, porém ortogonais!) UFPA Informática min, max, count, sum, avg Sintaxe: – <oper> (<e>) onde <e> é uma expressão que retorna uma coleção Exemplos: max(select salário from Professores) sum(select salário from Professores) avg(select salário from Professores) count(Professores) 3. Padrão ODMG 61 3.3. Linguagem de Consulta OQL Visão Detalhada Select-From-Where – Uso de variáveis de iteração no from from Estudantes as est select from UFPA Informática where Professor_aluno:struct (estudante:est_nome, professor:parte.oProf.nome) Estudantes as est, est.asDiscip as disc, disc.asPartes as parte parte.oProf.nivel = “Titular” 3. Padrão ODMG 62 3.3. Linguagem de Consulta OQL Visão Detalhada Select-From-Where – Uso de variáveis de iteração no from UFPA Informática select * from Estudantes as est, est.asDiscip as disc, disc.asPartes as parte where parte.oProf.nivel = “Titular” – retorna triplas formadas por um estudante, uma disciplina e uma parte de tipo: bag<struct(est:Estudante, disc:Disciplina, parte:Parte)> 3. Padrão ODMG 63 3.3. Linguagem de Consulta OQL Visão Detalhada Cláusula Group by – Resultado é um struct que contém as variáveis de agrupamento e uma coleção com as instâncias de valor comum Exemplos: select * from Professores prof group by niv:nível partition niv prof titular prof ... partition niv prof adjunto prof UFPA Informática ... ... Resultado: set<struct(niv:enum, partition:bag<struct(prof:Professor)>)> 3. Padrão ODMG 64 3.3. Linguagem de Consulta OQL Visão Detalhada Cláusula Group by departamento, sal_med:avg( select part.salario from partition as part) from Empregados emp group by departamento:emp.deptno having avg( select part.salario from partition as part)> 3000 UFPA Informática select 3. Padrão ODMG 65 3.3. Linguagem de Consulta OQL Visão Detalhada Cláusula Order by – Resultado: lista – Exemplo: select pess from Pessoas pess order by pess.idade, pess.nome Expressões de Coleção Indexada – Obtendo o i-ésimo elemento de uma lista list(a,b,c,d) [1] retorna ‘b’ (primeiro elemento é indexado por 0) UFPA Informática 3. Padrão ODMG 66 3.3. Linguagem de Consulta OQL Visão Detalhada Expressões de Coleção Indexada element( select disc from Disciplinas disc where disc.nome = “Cálculo” and disc.numero = “101”).temPreReq [2] retorna o terceiro pré-requisito de Cálculo 101 – Obtendo o primeiro ou último elemento de uma lista (first/last) UFPA Informática First(element( select where disc from Disciplinas disc disc.nome = “Cálculo” and disc.numero = “101”).temPreReq) – Concatenando listas list(1,2) + list(2,3) retorna list(1,2,2,3) 3. Padrão ODMG 67 3.3. Linguagem de Consulta OQL Visão Detalhada Operações sobre coleções – Union, Intersect, Except bag (2,3,3) union bag(3,3,2) retorna bag(2,3,3,3,3,2) bag (2,3,3) intersect bag(3,3,2) retorna bag(2,3) Estudante except Monitor – Inclusão de coleções {<,<=,>,>=} retorna true UFPA Informática set(1,2,3) < set (3,4,2,1) 3. Padrão ODMG 68 3.3. Linguagem de Consulta OQL Visão Detalhada Operações sobre coleções – Expressões de conversão element (t) resulta no único elemento da coleção operando (Caso a coleção contenha mais que um elemento resulta em erro) UFPA Informática element(select p from professores p where p.nome = “Codd”) Conversão de lista para conjunto listtoset(list(1,2,3)) Remoção de duplicatas distinct(list(1,2,2,3)) retorna set(1,2,3) “Achatamento” de coleções flatten(list(1,2,3),set(3,2,5,6),set(7)) retorna set(1,2,3,5,6,7) 3. Padrão ODMG 69 3.3. Linguagem de Consulta OQL Visão Detalhada Type Casting – Considere a consulta abaixo: select from where e.oSalario Estudantes e e in (select part.oMonitor from Partes part) – Esta consulta resulta em erro: UFPA Informática – O SGBD não tem como verificar que todo estudante em questão é um monitor e por isso possui um salário – Solução: type casting select (Empregado)e).oSalario from Estudantes e where e in (select part.oMonitor from Partes part) 3. Padrão ODMG 70 Exercício OQL UFPA Informática Obter nome das pessoas e quantidade de filhos que a pessoa tem para aquelas que têm mais de 2 filhos Obter as idades das pessoas e todas as pessoas do sexo feminino que possuem aquela idade. Mesma consulta anterior mas apenas para idades com mais de 10 pessoas 71 Exercício OQL - BD genealógico select struct(nome: pess.nome, no_filhos: count(pess.filhos)) from Pessoas pess where count(pess.filhos)>2 UFPA Informática select * from Pessoas pess where pess.sexo = ‘F’ group by id: pess.idade select * from Pessoas pess where pess.sexo = ‘F’ group by id: pess.idade having count(partition) > 10 72