Monitoria GDI
Aula Prática
OR (Aula 1)
Roteiro
• Tipos
• Tabela de Objetos
• Herança
• Métodos
• Referências
Tipos e Tabelas de Objetos
• Tipos de Objetos
oObjetos são abstrações de entidades do mundo real, como por exemplo, uma ordem de compra, um
cliente, um produto…
oUm tipo de objeto funciona como um molde para
criação de objetos, através da atribuição de valores a essa estrutura de dados.
3
Tipos e Tabelas de Objetos
• Tipos de Objetos - Sintáxe
oCriando um tipo
CREATE [OR REPLACE] TYPE <nomedo tipo>
AS OBJECT (
<listade atributos e métodos>
);
oExcluindo um tipo
DROP TYPE <nome do tipo> [FORCE];
Tipos e Tabelas de Objetos
• Tabelas de Objetos
oObjetos são diferentes de tabelas
oTipos de Objetos apenas definem uma estrutura lógica, contendo nome, métodos e atributos.
•Não obrigatoriedade da presença de métodos
oTabelas armazenam espaço físico
oCria-se tabelas de objetos previamente definidos
oCada tabela recebe instâncias de objetos de apenas um tipo
5
Tipos e Tabelas de Objetos
• Tabelas de Objetos - Sintáxe
oCriando uma tabela
CREATE TABLE <nome da tabela>
OF <nome do tipo> (
<lista de propriedades dos atributos>
);
oExcluindo uma tabela
DROP TABLE <nome da tabela>;
Tipos e Tabelas de Objetos
• Tabelas de Objetos - Sintáxe
oInserindo uma linha em uma tabela INSERT INTO <nome da tabela>
( <nomesdos atributos> ) VALUES ( <valores> );
oDeletando de uma tabela
DELETE FROM <nome data bela> WHERE <condição>;
7
Tipos e Tabelas de Objetos
• Tipos vs Tabelas
oTipos não permitem restrições de valores para os seus atributos;
oRestrições devem ser feitas nas tabelas:
•NOT NULL
•UNIQUE
•PRIMARY KEY
•CHECK
Exercício 1
•
Construa um tipo Endereço com os seguintes atributoso Rua o Cidade o Estado o CEP
•Construa um tipo Pessoa, que possui
o ID o Nome
o Endereço 9
Exercício 1 - Resposta
•
Tipo EndereçoCREATE OR REPLACE TYPE tp_endereco AS OBJECT ( Rua VARCHAR2(50),
Cidade VARCHAR2(25), Estado CHAR(2),
Cep NUMBER );
•Tipo Pessoa
CREATE OR REPLACE TYPE tp_pessoas AS OBJECT ( id NUMBER,
Nome VARCHAR2(25), Endereco tp_endereco );
Exercício 2
•
Construa uma tabela para o tipo Pessoao id é a chave primária
•
Insira 3 pessoas nessa tabela11
Exercício 2 - Resposta
•
Tabela do tipo PessoaCREATE TABLE tab_pessoa OF pessoas_tp (id PRIMARY KEY);
•
Inserção de 3 pessoasINSERT INTO tab_pessoa VALUES (1, 'João',
endereco_tp('Rua Simão Mendes', 'Recife', 'PE', '53050110'));
INSERT INTO tab_pessoa VALUES (2, 'Maria',
endereco_tp('Rua Padre Faustino','Jaboatão','PE', '45879362'));
INSERT INTO tab_pessoa VALUES (3, 'José',
endereco_tp('Rua Ernesto Ribeiro','Olinda','PE', '15469781'));
Herança
•Apenas herança simples é permitida no ORACLE
13
Herança
• Controle do usuário sobre a definição de tipos e métodos “herdáveis” -FINAL e NOT FINAL.
oTipos abstratos
CREATE [OR REPLACE] TYPE <nomedo tipo>
AS OBJECT (
…
) NOT INSTATIABLE ;
oPara permitir criação de subtipos
CREATE [OR REPLACE] TYPE <nomedo tipo>
AS OBJECT (
…
) NOT FINAL ;
Herança
• Sintaxe para criar um subtipo:
CREATE [OR REPLACE] TYPE
<nome do subtipo> UNDER <nome do tipo> ( <definição dos atributos específicos>
);
15
Exercício 3
•
Implemente o modelo, crie as tabelas necessários e realize 3 inserçõesProfissional
nome
data de nascimento
Médico
CRM especialista
Engenheiro
CREA
Exercício 3 - Resposta
•
Criando os tiposCREATE OR REPLACE TYPE tp_profissional AS OBJECT ( nome VARCHAR2(100),
data_nascimento DATE
) NOT FINAL NOT INSTANTIABLE;
CREATE OR REPLACE TYPE
tp_medico UNDER tp_profissional (crm NUMBER,
especialidade VARCHAR2(30));
CREATE OR REPLACE TYPE
tp_engenheiro UNDER tp_profissional (crea NUMBER);
17
Exercício 3 - Resposta
•
Inserindo nas tabelasINSERT INTO tb_medico VALUES (
tp_medico('Jose',to_date('05/04/2009','dd/mm/yyyy'), 12345, 'Cardiologista')
);
INSERT INTO tb_medico VALUES (
tp_medico('Ana',to_date('05/04/2009','dd/mm/yyyy'),54321, 'Neurologista')
);
INSERT INTO tb_engenheiro VALUES (
tp_engenheiro('Luiz',to_date('05/04/2009','dd/mm/yyyy'),34567) );
Métodos
•Programas associados aos tipos que fazem
computações e podem ter acesso aos atributos do tipo
•Na declaração de um tipo são definidas as assinaturas dos métodos, depois são implementados
•Tipos de Métodos
o Member Method o Static Method
o Constructor Method o Comparison Methods
19
Método
• Métodos podem ser FINAL ou NOT FINAL
o Para permitir que um método não possa ser sobrescrito nos subtipos, este deve ser definido como FINAL
o Por padrão, um método é definido como NOT FINAL
CREATE [OR REPLACE] TYPE <nome do tipo>
AS OBJECT (
<lista de atributos>
<lista de assinatura dos métodos>
);
CREATE [OR REPLACE] TYPE BODY <nome do tipo> AS (
<lista de implementações dos métodos>
);
Método
• Exemplo
CREATE OR REPLACE TYPE tp_periodo AS OBJECT ( data_inicio DATE,
data_fim DATE,
CONSTRUCTOR FUNCTION tp_periodo (di DATE, df DATE) RETURN SELF AS RESULT,
MEMBER FUNCTION dt_pertence (data DATE) RETURN INTEGER, MEMBER PROCEDURE set_DataInicio(pDataDATE),
ORDER MEMBER FUNCTION match (p tp_periodo) RETURN INTEGER, MAP MEMBER FUNCTION compara RETURN INTEGER
);
21 ATRIBUTOS CONSTRUCTOR METHOD MEMBER METHOD COMPARATION METHOD
Método
ATENÇÃO!
Um objeto só pode ter UM método MAP OU UM método ORDER.
O código utilizado como exemplo anteriormente não funcionará pois possui um método MAP e um ORDER.
Método
• Member Functions
o Podem ser chamados através de um SELECT como em funções de PL/SQL.
• Member Procedures
o Só é possível chamá-los em Blocos Anônimos, Functions, Procedures ou Triggers, pois
diferentemente das Member Function não possuem retorno
23
Método
• Comparison Method
o Permite a comparação de dois objetos
o Torna possível utilizar as cláusulas DISTINCT, GROUP BY, ORDER BY, UNION entre outras.
o Sem definir o MAP ou ORDER só é possível verificar se dois objetos são iguais
o São funções chamadas implicitamente pelo SGBD quando é realizada a comparação entre dois tipos.
Método
• MAP
o Não possui parâmetros, retorna um valor escalar (CHAR, DATE, VARCHAR, NUMBER) que será comparado com o valor de outro objeto
• ORDER
o Recebe sempre um objeto do mesmo tipo como parâmetro. É possível realizar comparações entre os objetos e retorna um número inteiro (negativo, zero, positivo). Semelhante a interface de Java java.util.Comparator
25
Exercício 4
•
Crie um tipo TP_QUADRILATERO que possui como atributoso id, o altura o largura
•
E possui os seguintes métodos:o Um construtor
o Um método que retorna a área do quadrilátero
o Um método que atualiza apenas a altura do objeto
Exercício 4 - Resposta
•
Declaração do tipoCREATE OR REPLACE TYPE tp_quadrilatero AS OBJECT ( id NUMBER,
altura NUMBER, largura NUMBER,
CONSTRUCTOR FUNCTION tp_quadrilatero
(id NUMBER, a NUMBER, l NUMBER) RETURN SELF AS RESULT, MEMBER FUNCTION getArea RETURN NUMBER,
MEMBER PROCEDURE setAltura(a NUMBER) );
27
Exercício 4 - Resposta
•
Implementação dos MétodosCREATE OR REPLACE TYPE BODY tp_quadrilatero AS CONSTRUCTOR FUNCTION tp_quadrilatero
(id NUMBER, a NUMBER, l NUMBER) RETURN SELF AS RESULT IS BEGIN
id := i; altura := a; largura := l;
END;
MEMBER FUNCTION getArea RETURN NUMBER IS BEGIN
RETURN altura * largura;
END;
MEMBER PROCEDURE setAltura(a NUMBER) IS BEGING
altura := a;
END;
END;
Referência
•Tipo REF
o Retorna referência OID(ObjectId) a uma instância de uma object table
o Encapsula uma referência para um “rowobject” de um tipo de objeto especificado
o O valor de um objeto do tipo REF é um “ponteiro lógico” para um rowobject.
29
Exercício 5 - Parte 1
•
Implemente os tipos do modelo abaixo, usando os conceitos de referênciaCliente possui Endereço
bairo cidade CEP
nome CPF
N 1
Parte 1 - Resposta
•
Criação dos tiposCREATE OR REPLACE TYPE tp_endereco AS OBJECT ( CEP VARCHAR(8),
bairro VARCHAR(20), cidade VARCHAR(20) );
CREATE OR REPLACE TYPE tp_cliente AS OBJECT ( CPF VARCHAR(14),
nome VARCHAR(30),
endereco REF tp_endereco );
31
Exercício 5 - Parte 2
•
Crie a tabela de endereços e a tabela de clientes•
Insira 2 endereços e 3 clienteso será necessário o uso de consulta aninhada
Parte 2 - Resposta
•
Tabela de endereçosCREATE TABLE tab_endereco OF tp_endereco (CEP PRIMARY KEY);
•
Tabela de clientesCREATE TABLE tab_cliente OF tp_cliente (CPF PRIMARY KEY);
33
Parte 2 - Resposta
•
Inserção de endereçosINSERT INTO tab_endereco VALUES ('50100250', 'Santo Amaro', 'Recife');
INSERT INTO tab_endereco VALUES ('52021180', 'Espinheiro', 'Recife');
•
Inserção de clientesINSERT INTO tab_cliente VALUES ('12345678902', 'Rodrigo', ( SELECT REF(e) FROM tab_endereco e WHERE e.CEP = '50100250'));
INSERT INTO tab_cliente VALUES ('56789012303', 'Carlos', (
SELECT REF(e) FROM tab_endereco e WHERE e.CEP = '50100250'));
INSERT INTO tab_cliente VALUES ('78912345604', 'Marco', (
SELECT REF(e) FROM tab_endereco e WHERE e.CEP = '52021180'));
Referência
•Faça um SELECT dos clientes e veja o retorno
•Faça um SELECT dos endereços dos clientes utilizando DREF
SELECT DREF(c.endereco) FROM cliente c;
35
Dúvidas?
36