Monitoria GDI Aula Prática OR (Aula 1)
Roteiro Tipos Tabela de Objetos Herança Métodos Referências 2
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]; 4
Tipos e Tabelas de Objetos Tabelas de Objetos o Objetos 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 o Tabelas armazenam espaço físico o Cria-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 o Criando uma tabela CREATE TABLE <nome da tabela> OF <nome do tipo> ( <lista de propriedades dos atributos> ); o Excluindo uma tabela DROP TABLE <nome da tabela>; 6
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> ); o Deletando 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; o Restrições devem ser feitas nas tabelas: NOT NULL UNIQUE PRIMARY KEY CHECK 8
Exercício 1 Construa um tipo Endereço com os seguintes atributos o 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ço CREATE 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 ); 10
Exercício 2 Construa uma tabela para o tipo Pessoa o id é a chave primária Insira 3 pessoas nessa tabela 11
Exercício 2 - Resposta Tabela do tipo Pessoa CREATE TABLE tab_pessoa OF pessoas_tp (id PRIMARY KEY); Inserção de 3 pessoas INSERT 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')); 12
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. o Tipos abstratos CREATE [OR REPLACE] TYPE <nomedo tipo> AS OBJECT ( ) NOT INSTATIABLE ; o Para permitir criação de subtipos CREATE [OR REPLACE] TYPE <nomedo tipo> AS OBJECT ( ) NOT FINAL ; 14
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ções Profissional nome data de nascimento Médico CRM especialista Engenheiro CREA 16
Exercício 3 - Resposta Criando os tipos CREATE 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 tabelas INSERT 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) ); 18
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 o Para permitir que um método não possa ser sobrescrito nos subtipos, este deve ser definido como FINAL 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> ); 20
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 ); ATRIBUTOS CONSTRUCTOR METHOD MEMBER METHOD COMPARATION METHOD 21
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. 22
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 o o o Permite a comparação de dois objetos Torna possível utilizar as cláusulas DISTINCT, GROUP BY, ORDER BY, UNION entre outras. Sem definir o MAP ou ORDER só é possível verificar se dois objetos são iguais São funções chamadas implicitamente pelo SGBD quando é realizada a comparação entre dois tipos. 24
MAP o Método 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 atributos o 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 26
Exercício 4 - Resposta Declaração do tipo CREATE 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étodos CREATE 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; 28
Referência Tipo REF oretorna referência OID(ObjectId) a uma instância de uma object table oencapsula uma referência para um rowobject de um tipo de objeto especificado oo 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ência nome CPF Cliente N 1 possui Endereço bairo cidade CEP 30
Parte 1 - Resposta Criação dos tipos CREATE 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 clientes o será necessário o uso de consulta aninhada 32
Parte 2 - Resposta Tabela de endereços CREATE TABLE tab_endereco OF tp_endereco (CEP PRIMARY KEY); Tabela de clientes CREATE TABLE tab_cliente OF tp_cliente (CPF PRIMARY KEY); 33
Parte 2 - Resposta Inserção de endereços INSERT INTO tab_endereco VALUES ('50100250', 'Santo Amaro', 'Recife'); INSERT INTO tab_endereco VALUES ('52021180', 'Espinheiro', 'Recife'); Inserção de clientes INSERT 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')); 34
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