4-Heranca

Propaganda
III – Oracle 9i
Herança
Pessoa
Empregado
Pessoa_tab
Estudante
Est. Parcial
• Criar um super tipo
CREATE TYPE Person_typ AS OBJECT ( ssn NUMBER, name
VARCHAR2(30),
address VARCHAR2(100))
NOT FINAL
• Criar um sub tipo
CREATE TYPE Student_typ UNDER
Person_typ
( deptid NUMBER,
major VARCHAR2(30))
NOT FINAL
• Criar um sub tipo de um sub tipo
CREATE TYPE PartTimeStudent_typ UNDER Student_typ
( numhours NUMBER)
• Final de um ramo de uma árvore
CREATE TYPE Employee_typ UNDER
Person_typ
( empid NUMBER,
mgr VARCHAR2(30))
[FINAL]
• Método FINAL
– Não pode ser redefinido em um sub tipo
CREATE TYPE T AS OBJECT
(..., MEMBER PROCEDURE Print(),
FINAL MEMBER FUNCTION
foo(x NUMBER)...)
NOT FINAL
• Tipo abstrato
– Default: INSTANTIABLE
• Podemos criar instâncias ou não
CREATE TYPE Address_typ AS OBJECT
(...)
NOT INSTANTIABLE NOT FINAL
Hierarquia de Tipos e “Object
Tables”
• Como estudante (estudante parcial) (empregado) é
uma pessoa
– Estudantes, estudantes parciais e empregados
podem ser criados em Pessoa_tab
– Pessoas em Pessoa_tab, empregados em
Empregado_tab, estudantes em Estudante_tab,
estudantes parciais em Est-Parcial_tab
– Outra alternativa: pessoas em Pessoa_tab,
empregados em Empregado_tab, estudantes e
estudantes parciais em Estudante_tab
Hierarquia de Tipos e
“Object Tables” (2)
CREATE
TABLE
Person_typ
(…)
Person_tab
OF
INSERT INTO TABLE Person_tab
VALUES (student_typ ( … ) )
Consultas
• Função TREAT
– SELECT p.name, TREAT(VALUE(p) AS
Employee_typ).salary AS p.salary
FROM Person_tab p
• Imprime os salários das pessoas-empregados, e SALARIO
IS NULL para as pessoas que não são empregados
Consultas (2)
Função IS OF
• SELECT VALUE(p)
FROM Person_tab P
WHERE VALUE(p) IS OF
(Employee_typ, Student_typ)
– Retorna os estados dos objetos pessoa-estudante, pessoaestudante-parcial, pessoa-empregado
– Não retorna estados de objetos exclusivamente pessoa
• SELECT VALUE(p)
FROM Person_tab p
WHERE VALUE(p) IS OF(ONLY
Student_typ)
– Só objetos estudante, excluindo estudante-parcial
Consultas (3)
• SELECT DEREF(REF(p))
FROM Person_tab 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
Oracle9i.
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)
/
Exercícios (2)
CREATE TYPE Estrelas_ntabtyp AS TABLE OF
RefEstrela_objtyp
/
CREATE TYPE Filmes_ntabtyp AS TABLE OF
RefFilme_objtyp
/
Exercícios (3)
CREATE
TYPE
Filme_objtyp
AS
OBJECT (
Titulo VARCHAR2(60),
Ano INTEGER,
Duracao NUMBER,
Estrelado_por_ntab Estrelas_ntabtyp
)
/
Exercícios (4)
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)
)
/
Exercícios (5)
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
/
Exercícios (6)
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;
...};
Exercícios (7)
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?
Download