1.2k likes | 1.5k Views
Unidade 4.1: BDOR – Oracle 11g. Banco de Dados II – 2009.2 Prof. Cláudio de Souza Baptista, Ph.D. UFCG/CEEI/DSC. Oracle OR 11g. O ORACLE 11g oferece diferentes tipos de objetos: Tipos de Objetos ( TADs ) Nested Tables (Tabelas aninhadas) VArrays ( Varying Arrays )
E N D
Unidade 4.1: BDOR – Oracle 11g Banco de Dados II – 2009.2 Prof. Cláudio de Souza Baptista, Ph.D. UFCG/CEEI/DSC
Oracle OR 11g • O ORACLE 11g oferece diferentes tipos de objetos: • Tipos de Objetos (TADs) • NestedTables (Tabelas aninhadas) • VArrays (VaryingArrays) • LargeObjects (LOBs) • References (REF) • ObjectView (Visão de Objetos) • No entanto, háalgumasdiferenças com o padrã SQL:1999
Oracle OR 11g • Conceitos Básicos • Tipo de Objeto • Método • Evolução de Tipo • Herança de Tipo • Tabela de Objeto • Objeto de Linha e Objeto de Coluna • Referência de Objeto • Coleção de Objetos
Relacional.Objeto-relacional - Um banco de dados, tradicionalmente relacional, estendido para incluir os conceitos OO e estruturas como tipos de dados abstratos, nested tables e varying arrays.Orientado a objetos- Um banco de dados orientado a objetos cujo projeto é, desde o seu início, desenvolvido com análise orientada a objetos. Oracle OR 11g O ORACLE 11g fornece um suporte completo para todos os três diferentes tipos de implementação:
Projeto BD Relacional Esquema Relacional
Esquema Objeto Relacional
Tipos de Objetos (Object Types) • Tipo de objeto é um tipo abstrato de dados (TAD), ou seja um StructuredType em SQL:1999 • TAD é um tipo de dado definido pelo usuário que encapsula propriedades (atributos) e comportamento (métodos) • Corresponde ao “Molde” de um objeto • Não aloca espaço de armazenamento • Não pode armazenar dados
Tipos de Objetos • Um Tipo de Objeto é um esquema de objeto com 3 componentes: • Nome • Atributos • Métodos • Um tipo de objeto pode ser usado para: • Definir o domínio de atributos (“column object”) de tabelas • Definir o tipo dos atributos de TADs ( “embedded object”) • Criar uma tabela de objetos
Tipos de Objetos • Um tipo de objeto em Oracle possui a seguinte estrutura:
Tipos de Objetos • Exemplo de especificação da interface pública de um objeto • Sintaxe resumida: CREATE [OR REPLACE] TYPE nome_tipo AS OBJECT ( [lista de atributos] [lista de métodos] );
Tipos de Objetos Pode ser usado da mesma forma que é usado um tipo primitivo EX: Para definir o tipo de um atributo de uma tabela CREATE TABLE tb_contatos ( contato tp_pessoa, dt_contatoDATE ); CREATE TABLE tb_domicilio ( local tp_ponto, enderecoVARCHAR2 (80) ); -- Para definir o tipo de um atributo de um TAD CREATE TYPE tp_contatos AS OBJECT ( contato tp_ pessoa, dt_contatoDATE ); CREATE TYPE tp_domicilio AS OBJECT ( local tp_ponto, enderecoVARCHAR2 (80) );
Tipos de objetos create type ENDERECO_TYP as object(rua VARCHAR2(50), cidade VARCHAR2(25), estado CHAR(2), cep NUMBER); create table PESSOAS (nome VARCHAR2(25), endereço ENDERECO_TYP); ENDEREÇO_TYP é usado para definir o tipo (domínio) da coluna Endereço da tabela PESSOAS
Tipos de objetos create type ENDERECO_TYP as object(rua VARCHAR2(50), cidade VARCHAR2(25), estado CHAR(2), cep NUMBER); ENDEREÇO_TYP é usado para definir o tipo do atributo Endereco do tipo PESSOA_TYP create type PESSOA_TYP as object(nome VARCHAR2(25), endereco ENDERECO_TYP); Não é possível ocorrer uma inserção de dados em PESSOA_TYP. Isso porque um tipo de objeto descreve dados, mas não os armazena.
Tipos de objetos Para armazenar dados é necessário a criação de uma tabela a partir de um tipo de objeto. create type PESSOA_TY as object(Nome VARCHAR2(25), CPF NUMBER, Endereco ENDERECO_TY); create table PESSOAS of PESSOA_TY (CPF primary key ); A tabela PESSOAS irá armazenar dados com a estrutura do tipo PESSOA_TY
Exemplo CREATE TYPE person_typ AS OBJECT ( idno NUMBER, first_name VARCHAR2(20), last_name VARCHAR2(25), email VARCHAR2(25), phone VARCHAR2(20), MAP MEMBER FUNCTION get_idno RETURN NUMBER, MEMBER PROCEDURE display_details ( SELF IN OUT NOCOPY person_typ ));
Exemplo (cont.) CREATE TYPE BODY person_typ AS MAP MEMBER FUNCTION get_idno RETURN NUMBER IS BEGIN RETURN idno; END; MEMBER PROCEDURE display_details ( SELF IN OUT NOCOPY person_typ ) IS BEGIN -- use the PUT_LINE procedure of the DBMS_OUTPUT package to display details DBMS_OUTPUT.PUT_LINE(TO_CHAR(idno) || ' ' ||first_name || ' ' ||last_name); DBMS_OUTPUT.PUT_LINE(email || ' ' ||phone); END; END;
Inserindo dados • Ex.: CREATE TABLE contacts ( contact person_typ, contact_date DATE ); INSERT INTO contacts VALUES ( person_typ (65, 'Verna', 'Mills', 'vmills@oracle.com', '1-800-555-4412'), '24 Jun 2003' );
Inserindo com NULL CREATE TABLE contacts ( contact person_typ, contact_date DATE ); INSERT INTO contacts VALUES (person_typ (NULL, NULL, NULL), '24 Jun 2003' ); INSERT INTO contacts VALUES (NULL, '24 Jun 2003' );
Constraints CREATE TABLE department_mgrs ( dept_no NUMBER PRIMARY KEY, dept_name CHAR(20), dept_mgrperson_typ, dept_loclocation_typ, CONSTRAINT dept_loc_cons1 UNIQUE (dept_loc.building_no, dept_loc.city), CONSTRAINT dept_loc_cons2 CHECK (dept_loc.city IS NOT NULL) ); INSERT INTO department_mgrs VALUES ( 101, 'PhysicalSciences', person_typ(65,'Vrinda Mills', '1-800-555-4412'), location_typ(300, 'Palo Alto'));
Trigger em Objetos Tipados CREATE TABLE movement ( idno NUMBER, old_officelocation_typ, new_officelocation_typ ); CREATE TRIGGER trigger1 BEFORE UPDATE OF office_loc ON office_tab FOR EACH ROW WHEN (new.office_loc.city = 'RedwoodShores') BEGIN IF :new.office_loc.building_no = 600 THEN INSERT INTO movement (idno, old_office, new_office) VALUES (:old.occupant.idno, :old.office_loc, :new.office_loc); END IF; END; OBS.: Não se podemodificarcolunas do tipo LOB no corpo de um trigger!
Métodos • São funções ou procedimentos que são declarados na definição de um tipo de objeto • Exigem o uso de parênteses (mesmo sem parâmetros) • O uso de ( ) é para diferenciar o método de um procedimento ou função comum • Podem ser • MEMBER ou STATIC • MAP ou ORDER (para ordenação) • Construtor
Métodos • Um object type sempre possui um construtor, pode possuir zero ou mais métodos membro e pode possuir um método map ou um método order, porém não os dois • Ex.: Chamada de método SELECT c.contact.get_idno() FROM contacts c;
Métodos • MEMBER • São os métodos mais comuns • Implementam as operações das instâncias do tipo • São invocados através da qualificação de objeto objeto.método() • SELF não precisa ser declarado, mas pode ser e deverá ser sempre o primeiro parâmetro
Ex. Member method CREATE TYPE solid_typ AS OBJECT ( len INTEGER, wth INTEGER, hgt INTEGER, MEMBER FUNCTION surface RETURN INTEGER, MEMBER FUNCTION volume RETURN INTEGER, MEMBER PROCEDURE display (SELF IN OUT NOCOPY solid_typ) ); CREATE TYPE BODY solid_typ AS MEMBER FUNCTION volume RETURN INTEGER IS BEGIN RETURN len * wth * hgt; -- RETURN SELF.len * SELF.wth * SELF.hgt; -- equivalent to previous line END; MEMBER FUNCTION surface RETURN INTEGER IS BEGIN -- not necessary to include SELF prefix in following line RETURN 2 * (len * wth + len * hgt + wth * hgt); END; MEMBER PROCEDURE display (SELF IN OUT NOCOPY solid_typ) IS BEGIN DBMS_OUTPUT.PUT_LINE('Length: ' ||len || ' - ' || 'Width: ' ||wth || ' - ' || 'Height: ' ||hgt); DBMS_OUTPUT.PUT_LINE('Volume: ' || volume || ' - ' || 'Surface area: ‘ ||surface); END; END;
Métodos • Construtor • Criado implicitamente ao criar um tipo de objeto • Deve ser exatamente igual ao nome do tipo • Pode haver mais de um construtor • EX: INSERT INTO tb_contatos VALUES ( Person_typ(65, ‘Pedro', ‘Medeiros', ‘pm@hotmail.com', '83-3337-3333'), ‘12 Mai 2005' );
Static Method • São invocados nos tipos de dados, não nas instâncias • Usados para operações que são globais ao tipo e não precisam se reportar a uma instância particular • Não possui parâmetro SELF • Invocado da seguinte forma: type_name.method()
Static Method - Exemplo CREATE TYPE atype AS OBJECT( a1 NUMBER, STATIC PROCEDURE newa ( p1 NUMBER, tabname VARCHAR2, schname VARCHAR2)); CREATE TYPE BODY atype AS STATIC PROCEDURE newa (p1 NUMBER, tabname VARCHAR2, schname VARCHAR2) IS sqlstmt VARCHAR2(100); BEGIN sqlstmt := 'INSERT INTO '||schname||'.'||tabname|| ' VALUES (atype(:1))'; EXECUTE IMMEDIATE sqlstmt USING p1; END; END; CREATE TABLE atab OF atype; BEGIN atype.newa(1, 'atab', 'HR'); END;
Métodos para Comparação de Objetos MAP ou ORDER • São funções opcionais para comparar objetos • São mutuamente exclusivos! • Por default o ORACLE implementa a comparação STATE do SQL:1999 (queindica se um objeto é igualounão de outrobaseadonacomparação de cadaatributo) • ORDER • Implementa o RELATIVE WITH do SQL:1999, retornandonegativo, zero oupositivo • exige como parâmetro um obj. do mesmo tipo • ORDER compara o obj. corrente com o obj. do parâmetro • MAP • Implementa MAP do SQL:1999, retornando um valor de tipo built-in • não exige parâmetro • MAP compara vários objetos (ex: ORDER BY)
Métodos para Comparação de Objetos Exemplo de MAP CREATE TYPE rectangle_typ AS OBJECT ( len NUMBER, wid NUMBER, MAP MEMBER FUNCTION area RETURN NUMBER); CREATE TYPE BODY rectangle_typ AS MAP MEMBER FUNCTION area RETURN NUMBER IS BEGIN RETURN len * wid; END area; END;
Métodos para Comparação de Objetos Exemplo de ORDER CREATE TYPE location_typ AS OBJECT ( building_no NUMBER, city VARCHAR2(40), ORDER MEMBER FUNCTION match (l location_typ) RETURN INTEGER ); CREATE TYPE BODY location_typ AS ORDER MEMBER FUNCTION match (l location_typ) RETURN INTEGER IS BEGIN IF building_no < l.building_no THEN RETURN -1; -- qualquernúmeronegativo ELSIF building_no > l.building_no THEN RETURN 1; -- qualquernúmeropositivo ELSE RETURN 0; END IF; END; END;
Evolução de Tipos • Uso do comandoALTER TYPE, permitemodificar, ouevoluir, um tipoobjeto: • Adicionar e remover atributos • Adicionar e remover métodos • Modificar um atributonuméricoparaaumentar o length, precision, ouscale • Modicar um atributo string paraaumentarseu length • Mudarpropriedades FINAL e INSTANTIABLE do tipo
Evolução de Tipos • EX: ALTER TYPE person_typ ADD ATTRIBUTE ( sexVARCHAR2(1) ) CASCADE ; ALTER TYPE person_typ DROP MAP MEMBER FUNCTION get_id RETURN NUMBER; ALTER TYPE person_typNOT FINAL CASCADE; ALTER TYPE person_typ MODIFY ATTRIBUTE sexVARCHAR2(10) CASCADE ; • OBS.: • CASCADE: propaga a mudança para todos os tipos dependentes
Herança de Tipos • Suportaherança simples • Háumadiferença do padrão SQL:1999, pois o Oracle nãorequerherançaexplicitamentenastabelas, masapenasnostipos => modelomais simples, emboramenosflexível • Permite criar uma hierarquia de sub-tipos especializados • Os tipos derivados (sub-tipos) herdam os atributos e métodos dos tipos ancestrais (super-tipos) • Os sub-tipos podem acrescentar novos atributos ou métodos e/ou redefinir os métodos dos super-tipos
Herança de Tipos CREATE TYPE employee_typUNDER person_typ( depto_idNUMBER, funcaoVARCHAR2(30), salarioNUMBER ) NOT FINAL; • OBS.: Por default um tipo de objeto é FINAL!
Herança de Tipos – Drop Type • Não se pode remover um subtipo antes de remover suasrespectivasinstânciasnatabelaquearmazena as tuplasdaquelesubtipo (substitutability) • Ex.: Drop Type incorreto DROP TYPE student_typ VALIDATE Corretoseria: DELETE FROM person_obj_table WHERE p IS OF (student_typ); DROP TYPE student_typ VALIDATE;
Herança de Tipos CREATE TYPE person_typ AS OBJECT ( idno NUMBER, name VARCHAR2(30), phone VARCHAR2(20), FINAL MAP MEMBER FUNCTION get_idno RETURN NUMBER) NOT FINAL;
Herança de Tipos CREATE TYPE professor_typ UNDER person_typ ( dept_id NUMBER, speciality VARCHAR2(30)) NOT FINAL;
Overriding Method CREATE TYPE person_typ AS OBJECT ( idno NUMBER, name VARCHAR2(30), phone VARCHAR2(20), MAP MEMBER FUNCTION get_idno RETURN NUMBER, STATIC FUNCTION show_super (person_obj in person_typ) RETURN VARCHAR2, MEMBER FUNCTION show RETURN VARCHAR2) NOT FINAL;
Overriding Method (cont.) CREATE TYPE BODY person_typ AS MAP MEMBER FUNCTION get_idno RETURN NUMBER IS BEGIN RETURN idno; END; -- static function that can be called by subtypes STATIC FUNCTION show_super (person_obj in person_typ) RETURN VARCHAR2 IS BEGIN RETURN 'Id: ' || TO_CHAR(person_obj.idno) || ', Name: ' || person_obj.name; END; -- function that can be overriden by subtypes MEMBER FUNCTION show RETURN VARCHAR2 IS BEGIN RETURN person_typ.show_super ( SELF ); END; END;
Overriding Method (cont.) CREATE TYPE student_typ UNDER person_typ ( dept_id NUMBER, major VARCHAR2(30), OVERRIDING MEMBER FUNCTION show RETURN VARCHAR2) NOT FINAL; CREATE TYPE BODY student_typ AS OVERRIDING MEMBER FUNCTION show RETURN VARCHAR2 IS BEGIN RETURN person_typ.show_super ( SELF ) || ' -- Major: ' || major ; END; END;
Overriding Method (cont.) CREATE TYPE employee_typ UNDER person_typ ( emp_id NUMBER, mgr VARCHAR2(30), OVERRIDING MEMBER FUNCTION show RETURN VARCHAR2); CREATE TYPE BODY employee_typ AS OVERRIDING MEMBER FUNCTION show RETURN VARCHAR2 IS BEGIN RETURN person_typ.show_super ( SELF ) || ' -- Employee Id: ' || TO_CHAR(emp_id) || ', Manager: ' || mgr ; END; END;
Overriding Method (cont.) CREATE TYPE part_time_student_typ UNDER student_typ ( number_hours NUMBER, OVERRIDING MEMBER FUNCTION show RETURN VARCHAR2); CREATE TYPE BODY part_time_student_typ AS OVERRIDING MEMBER FUNCTION show RETURN VARCHAR2 IS BEGIN RETURN person_typ.show_super ( SELF ) || ' -- Major: ' || major || ', Hours: ' || TO_CHAR(number_hours); END; END;
Overriding Method (cont.) CREATE TABLE person_obj_table OF person_typ; INSERT INTO person_obj_table VALUES (person_typ(12, 'Bob Jones', '111-555-1212')); INSERT INTO person_obj_table VALUES (student_typ(51, 'Joe Lane', '1-800-555-1312', 12, 'HISTORY')); INSERT INTO person_obj_table VALUES (employee_typ(55, 'Jane Smith', '1-800-555-7765', 100, 'Jennifer Nelson')); INSERT INTO person_obj_table VALUES (part_time_student_typ(52, 'Kim Patel', '1-800-555-1232', 14, 'PHYSICS', 20));
Overriding Method (cont.) SELECT p.show() FROM person_obj_table p; Resultado: Id: 12, Name: Bob Jones Id: 51, Name: Joe Lane -- Major: HISTORY Id: 55, Name: Jane Smith -- Employee Id: 100, Manager: Jennifer Nelson Id: 52, Name: Kim Patel -- Major: PHYSICS, Hours: 20
Restrições em Overriding methods • Só se pode fazer overriding de métodos declarados NOT FINAL no supertipo • Métodos ORDER só podem ser definidos na raiz da hierarquia de tipos, não podendo ser overriden • Um método STATIC (MEMBER) num subtipo não poder override um método MEMBER (STATIC) do supertipo • Usando PL/SQL não se pode chamar o método do supertipo através da keyword super, mas pode-se invocar um método estático do supertipo
Tabelas no ORACLE 11g • Oracle11g suporta 2 tipos de tabelas: • Tabela Relacional • Tabela de Objetos (Object Table) • uma tabela de objetos é um tipo especial de tabela que lida com objetos (“row objects”) e fornece uma visão relacional dos atributos desses objetos. • Princípio da Substituição (herança de tipos): uma coluna ou row definidas do tipo t podem conter instâncias de quaisquer de seus subtipos.
Tabela de objetos vs. Tabela relacional • Uma tabela de objetos difere de uma tabela relacional em vários aspectos: • Cada linha de uma tabela de objetos possui um identificador de objeto (OID), definido pelo ORACLE quando a linha é inserida na tabela; • Um OID é um ponteiro para um objeto “linha” (ROW Object); • As linhas ( row objects) de uma tabela de objetos podem ser referenciadas por outros objetos do banco de dados.
Tabela de objetos create type PESSOA_TY as object(Nome VARCHAR2(25), CPF NUMBER, Endereco ENDERECO_TY); create table PESSOAS of PESSOA_TY (CPF primary key ); • A tabela de objetos PESSOAS pode ser vista como: • Uma Tabela com uma única coluna: • - cada linha é um objeto do tipo PESSOA. • Uma Tabela com múltiplas colunas • - Uma coluna para cada atributo do tipo PESSOA_TY