III – Oracle 10g Herança Pessoa Empregado Pessoas Estudante Est. Parcial • Criar um super tipo CREATE TYPE Pessoa AS OBJECT ( rg NUMBER, nome VARCHAR2(30), endereço VARCHAR2(100)) NOT FINAL • Criar um sub tipo CREATE TYPE Estudante UNDER Pessoa ( departamento NUMBER, formação VARCHAR2(30)) NOT FINAL • Criar um sub tipo de um sub tipo CREATE TYPE estudante_parcial UNDER Estudante ( num_horas NUMBER) • Final de um ramo de uma árvore CREATE TYPE Empregado UNDER Pessoa ( matricula NUMBER, gerente VARCHAR2(30)) [FINAL] • Método FINAL – Não pode ser redefinido em um sub tipo CREATE TYPE T AS OBJECT (..., MEMBER PROCEDURE Imprimir(), FINAL MEMBER FUNCTION area(x NUMBER)...) NOT FINAL Hierarquia de Tipos e “Object Tables” • Como estudante (estudante parcial) (empregado) é uma pessoa – Estudantes, estudantes parciais e empregados podem ser criados em Pessoas – Objetos Pessoa em Pessoas, empregados em Empregados, estudantes em Estudantes, estudantes parciais em EstudantesParciais – Outra alternativa: pessoas em Pessoas, empregados em Empregados, estudantes e estudantes parciais em Estudantes – Ou a alternativa ‘normal’: somente os tipos das folhas da hierarquia são instanciáveis CREATE TABLE Pessoas OF Pessoa (…) INSERT INTO TABLE VALUES (Estudante ( … ) ) Pessoas Consultas • Função TREAT – SELECT p.nome, TREAT(VALUE(p) AS Empregado).salario AS p.salario FROM Pessoas p • Imprime os salários das pessoas-empregados, e SALARIO IS NULL para as pessoas que não são empregados Função IS OF • SELECT VALUE(p) FROM Pessoas p WHERE VALUE(p) IS OF (Empregado, Estudante) – Retorna os estados dos objetos pessoa-estudante, pessoaestudante-parcial, pessoa-empregado – Não retorna estados de objetos exclusivamente pessoa • SELECT VALUE(p) FROM Pessoas p WHERE VALUE(p) IS OF(ONLY Estudante) – Só objetos estudante, excluindo estudante-parcial • SELECT DEREF(REF(p)) FROM Pessoas p Os resultados de REF e DEREF podem incluir objetos do tipo pessoa e objetos dos subtipos empregado, estudante e estudante parcial Exercícios • BD Filmes, da sala de aula, e sua implementação Oracle 10g CREATE TYPE Filme_objtyp / CREATE TYPE Estrela_objtyp / CREATE TYPE RefFilme_objtyp AS OBJECT ( RefFilme REF Filme_objtyp) / CREATE TYPE RefEstrela_objtyp AS OBJECT ( RefEstrela REF Estrela_objtyp) / CREATE TYPE Estrelas_ntabtyp AS TABLE OF RefEstrela_objtyp / CREATE TYPE Filmes_ntabtyp AS TABLE OF RefFilme_objtyp / CREATE TYPE Filme_objtyp AS OBJECT ( Titulo VARCHAR2(60), Ano INTEGER, Duracao NUMBER, Estrelado_por_ntab Estrelas_ntabtyp ) / CREATE TYPE Estrela_objtyp AS OBJECT ( Nome VARCHAR2(60), Estrelou_em_ntab Filmes_ntabtyp, MEMBER FUNCTION Numero_filmes RETURN INTEGER, PRAGMA RESTRICT_REFERENCES (Numero_filmes, RNDS, RNPS, WNDS, WNPS) ) / CREATE OR REPLACE TYPE BODY Estrela_objtyp AS MEMBER FUNCTION Numero_filmes RETURN INTEGER IS BEGIN RETURN SELF.Estrelou_em_ntab.COUNT; END; END; / CREATE TABLE Filme_objtab OF Filme_objtyp NESTED TABLE Estrelado_por_ntab STORE AS Estrelas / CREATE TABLE Estrela_objtab OF Estrela_objtyp NESTED TABLE Estrelou_em_ntab STORE AS Filmes / a) Estender o “script” para implementar a classe class Des_Animado extends Filme { (extent Desenhos) relationship Set<Estrela> dublado_por; ...}; b) Povoar a “object table” Desenho_objtab, e em seguida as “nested tables” respectivas c) Inserir tudo em um único comando INSERT d) Quais os filmes dublados por Marília Pêra?