A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Capítulo 4: SGBDOR Oracle 11g

Apresentações semelhantes


Apresentação em tema: "Capítulo 4: SGBDOR Oracle 11g"— Transcrição da apresentação:

1 Capítulo 4: SGBDOR Oracle 11g
Banco de Dados II Prof. Carlos Eduardo Pires

2 Capítulo 4: BDOR – SGBD Oracle 11g
SGBDOR Oracle 11g O SGBDOR ORACLE 11g oferece diferentes tipos de objetos: Tipos de Objetos (TADs) Nested Tables (Tabelas Aninhadas) Varying Arrays (Varrays) Large Objects (LOBs) References (REF) Object View (Visão de Objetos) No entanto, há algumas diferenças com o padrão SQL: Capítulo 4: BDOR – SGBD Oracle 11g

3 Capítulo 4: BDOR – SGBD Oracle 11g
SGBDOR Oracle 11g Conceitos Básicos Tipo de Objeto Método Evolução de Tipo (ALTER TYPE) Herança de Tipo Tabela de Objeto Objeto de Linha e Objeto de Coluna Referência de Objeto Coleção de Objetos Capítulo 4: BDOR – SGBD Oracle 11g

4 Capítulo 4: BDOR – SGBD Oracle 11g
25/03/2017 Exemplo - UML Esquema Conceitual Capítulo 4: BDOR – SGBD Oracle 11g 4

5 Capítulo 4: BDOR – SGBD Oracle 11g
Projeto BD Relacional Esquema Relacional Capítulo 4: BDOR – SGBD Oracle 11g

6 Capítulo 4: BDOR – SGBD Oracle 11g
Esquema Objeto-Relacional Capítulo 4: BDOR – SGBD Oracle 11g

7 Capítulo 4: BDOR – SGBD Oracle 11g
Definindo os Tipos 5 7 6 2 4 1 3 Capítulo 4: BDOR – SGBD Oracle 11g

8 Tipos de Objetos (Object Types)
Tipo de objeto é um tipo abstrato de dados (TAD), ou seja, um Structured Type 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 Por default, são definidos como FINAL (herança) Capítulo 4: BDOR – SGBD Oracle 11g

9 Capítulo 4: BDOR – SGBD Oracle 11g
Tipos de Objetos (Object Types) Um Tipo de Objeto é um esquema de objeto com 3 componentes: Nome  obrigatório Atributos  obrigatório Métodos  facultativo (já vem com construtor) Um Tipo de Objeto pode ser usado para: Definir o domínio de campos (“column object”) de tabelas normais Definir o tipo dos atributos de TADs (“embedded object”) Criar uma tabela de objetos (“object table”) Capítulo 4: BDOR – SGBD Oracle 11g

10 Tipos de Objetos (Object Types)
Um tipo de objeto em Oracle possui a seguinte estrutura: Capítulo 4: BDOR – SGBD Oracle 11g

11 Tipos de Objetos (Object Types)
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] ); Capítulo 4: BDOR – SGBD Oracle 11g

12 Tipos de Objetos (Object Types)
Pode ser usado da mesma forma que é usado um tipo primitivo -- Para definir o tipo de um atributo de uma tabela CREATE TABLE tb_contatos ( contato tp_pessoa, dt_contato DATE ); CREATE TABLE tb_domicilio ( local tp_ponto, endereco VARCHAR2 (80) ); -- Para definir o tipo de um atributo de um TAD CREATE TYPE tp_contatos AS OBJECT ( contato tp_ pessoa, CREATE TYPE tp_domicilio AS OBJECT ( Capítulo 4: BDOR – SGBD Oracle 11g

13 Capítulo 4: BDOR – SGBD Oracle 11g
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 Capítulo 4: BDOR – SGBD Oracle 11g

14 Capítulo 4: BDOR – SGBD Oracle 11g
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, porque um tipo de objeto apenas descreve dados, mas não os armazena Capítulo 4: BDOR – SGBD Oracle 11g

15 Capítulo 4: BDOR – SGBD Oracle 11g
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); CREATE TABLE pessoas2 OF pessoa_ty; As tabelas de objetos PESSOAS e PESSOAS2 irão armazenar dados com a estrutura do tipo PESSOA_TY Capítulo 4: BDOR – SGBD Oracle 11g

16 Capítulo 4: BDOR – SGBD Oracle 11g
Exemplo com Métodos CREATE TYPE person_typ AS OBJECT ( idno NUMBER, first_name VARCHAR2(20), last_name VARCHAR2(25), VARCHAR2(25), phone VARCHAR2(20), MAP MEMBER FUNCTION get_idno RETURN NUMBER, MEMBER PROCEDURE display_details (SELF IN OUT person_typ)); Atenção: (SELF IN OUT person_type ) é opcional! Capítulo 4: BDOR – SGBD Oracle 11g

17 Capítulo 4: BDOR – SGBD Oracle 11g
Exemplo (cont.) CREATE TYPE BODY person_typ AS MAP MEMBER FUNCTION get_idno RETURN NUMBER IS BEGIN -- método usado para comparação de objetos RETURN idno; END; MEMBER PROCEDURE display_details (SELF IN OUT 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( || ' ' || phone); Using SELF IN OUT NOCOPY with Member Procedures In member procedures, if SELF is not declared, its parameter mode defaults to IN OUT. However, the default behavior does not include the NOCOPY compiler hint. Because the value of the IN OUT actual parameter is copied into the corresponding formal parameter, the copying slows down execution when the parameters hold large data structures such as instances of large object types. For performance reasons, you may want to include SELF IN OUT NOCOPY when passing a large object type as a parameter. For example: MEMBER PROCEDURE my_proc (SELF IN OUT NOCOPY my_LOB) Capítulo 4: BDOR – SGBD Oracle 11g

18 Capítulo 4: BDOR – SGBD Oracle 11g
Inserindo Dados Exemplo CREATE TABLE contacts ( contact person_typ, contact_date DATE ); INSERT INTO contacts VALUES ( person_typ (65, 'Verna', 'Mills', ' '), '24-JUN-2003'); construtor Capítulo 4: BDOR – SGBD Oracle 11g

19 Capítulo 4: BDOR – SGBD Oracle 11g
Inserindo com NULL INSERT INTO contacts VALUES (person_typ (NULL, NULL, NULL,NULL,NULL), '24 Jun 2003' ); INSERT INTO contacts VALUES (NULL, '25 Jun 2003' ); 1 2 Capítulo 4: BDOR – SGBD Oracle 11g

20 Capítulo 4: BDOR – SGBD Oracle 11g
Inserindo com NULL Em ambos os casos, o SGBD Oracle aloca espaço em CONTACTS para uma nova linha e atualiza a coluna CONTACT_DATE de acordo com o valor fornecido Caso 1: SGBD Oracle aloca espaço para um objeto na coluna CONTACT e atualiza cada atributo para NULL ((null, null, null, null, null),’08-JAN-2009’) Caso 2: SGBD Oracle atualiza o campo CONTACT para NULL e não aloca espaço para um objeto na coluna CONTACT (null,’08-JAN-2009’) Capítulo 4: BDOR – SGBD Oracle 11g

21 Restrições de Integridade (Constraints)
São definidas na tabela normal ou de objetos CREATE TABLE department_mgrs ( dept_no NUMBER CONSTRAINT dept_no_pk PRIMARY KEY, dept_name CHAR(20), dept_mgr person_typ, dept_loc location_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, 'Physical Sciences', person_typ(65,'Vrinda Mills', ' '), location_typ(300, 'Palo Alto')); nome da constraint dado pelo usuário construtores Capítulo 4: BDOR – SGBD Oracle 11g

22 Trigger em Objetos Tipados
CREATE TABLE movement ( idno NUMBER, old_office location_typ, new_office location_typ); CREATE TRIGGER my_trigger BEFORE UPDATE OF office_loc ON office_tab FOR EACH ROW WHEN (new.office_loc.city = 'Redwood Shores') 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; CREATE TYPE location_typ AS OBJECT( city VARCHAR2(30), building_no NUMBER); coluna tabela CREATE TABLE office_tab ( office_loc location_typ, occupant occupant_typ); CREATE TYPE occupant_typ AS OBJECT( idno NUMBER); Capítulo 4: BDOR – SGBD Oracle 11g

23 Capítulo 4: BDOR – SGBD Oracle 11g
Métodos São funções ou procedimentos 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 Por default, os métodos são definidos como NOT FINAL (permite que sejam sobrescritos) Capítulo 4: BDOR – SGBD Oracle 11g

24 Capítulo 4: BDOR – SGBD Oracle 11g
Métodos Um Object Type... sempre possui um método construtor pode possuir zero ou mais métodos membro pode possuir um método map ou um método order, porém não os dois Exemplo de chamada de método sem parâmetros SELECT c.get_idno() AS idno FROM contacts c; Capítulo 4: BDOR – SGBD Oracle 11g

25 Capítulo 4: BDOR – SGBD Oracle 11g
Métodos MEMBER São os métodos mais comuns Implementam as operações das instâncias do tipo São chamados através da qualificação de objeto objeto.método() SELF não precisa ser declarado, mas, se for, deverá ser sempre o primeiro parâmetro Capítulo 4: BDOR – SGBD Oracle 11g

26 Exemplo: Member Method
CREATE TYPE solid_typ AS OBJECT ( len INTEGER, wth INTEGER, hgt INTEGER, MEMBER FUNCTION volume RETURN INTEGER, MEMBER FUNCTION surface RETURN INTEGER, MEMBER PROCEDURE display (SELF IN OUT 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); MEMBER PROCEDURE display (SELF IN OUT solid_typ) IS DBMS_OUTPUT.PUT_LINE('Length: ' || len || ' - ' || 'Width: ' || wth || ' - ' || 'Height: ' || hgt); DBMS_OUTPUT.PUT_LINE('Volume: ' || volume || ' - ' || 'Surface area: ' || surface); Capítulo 4: BDOR – SGBD Oracle 11g

27 Capítulo 4: BDOR – SGBD Oracle 11g
Métodos Construtor Criado implicitamente ao criar um tipo de objeto Nome é exatamente igual ao nome do tipo Pode haver mais de um construtor (overloadable) Exemplo INSERT INTO tb_contatos VALUES ( Person_typ (65, 'Pedro', 'Medeiros', ' '), SYSDATE); Capítulo 4: BDOR – SGBD Oracle 11g

28 Capítulo 4: BDOR – SGBD Oracle 11g
Static Method 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 São chamados nos tipos de dados, não em uma instância particular Chamado da seguinte forma: type_name.method() Capítulo 4: BDOR – SGBD Oracle 11g

29 Exemplo 01: Static Method
CREATE OR REPLACE TYPE alunosbd2_typ AS OBJECT( matricula NUMBER, nome VARCHAR2(20), semestre NUMBER, ano NUMBER, STATIC PROCEDURE atualiza (p_semestre NUMBER)); CREATE TABLE alunosbd2_tab OF alunosbd2_typ; INSERT INTO alunosbd2_tab VALUES (1,'JOSE',20101,null); INSERT INTO alunosbd2_tab VALUES (2,'MARIA',20111,null); INSERT INTO alunosbd2_tab VALUES (3,'PEDRO',20111,null); Capítulo 4: BDOR – SGBD Oracle 11g

30 Exemplo 01: Static Method
CREATE OR REPLACE TYPE BODY alunosbd2_typ AS STATIC PROCEDURE atualiza (p_semestre NUMBER) IS BEGIN UPDATE alunosbd2_tab SET ano = SUBSTR(TO_CHAR(semestre),1,4) WHERE semestre = p_semestre; END; alunosbd2_typ.atualiza(20111); SELECT * FROM alunosbd2_tab; Capítulo 4: BDOR – SGBD Oracle 11g

31 Exemplo 02: Static Method
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; CREATE TABLE atab OF atype; atype.newa(1, 'atab', 'HR'); construtor valor, tabela e esquema (usuário do BD) Capítulo 4: BDOR – SGBD Oracle 11g

32 Métodos para Comparação de Objetos
Motivação DROP TABLE emp_table; DROP TYPE emp_type; CREATE OR REPLACE TYPE end_type AS OBJECT ( rua VARCHAR2(30), bairro VARCHAR2(30)); Capítulo 4: BDOR – SGBD Oracle 11g

33 Métodos para Comparação de Objetos
CREATE OR REPLACE TYPE emp_type AS OBJECT ( nome VARCHAR2(30), endr end_type); CREATE TABLE emp_table OF emp_type; INSERT INTO emp_table VALUES ('JOSE',end_type('RUA DO SOL','CATOLE')); INSERT INTO emp_table VALUES ('MARIA',end_type('RUA DA LUA','CATOLE')); Capítulo 4: BDOR – SGBD Oracle 11g

34 Métodos para Comparação de Objetos
SELECT m.nome FROM emp_table m ORDER BY m.endr; order by m.endr * ERRO na linha 3: ORA-22950: não pode ORDER objetos sem o método MAP ou ORDER Capítulo 4: BDOR – SGBD Oracle 11g

35 Métodos para Comparação de Objetos
MAP ou ORDER São “funções” opcionais e servem para comparar objetos São mutuamente exclusivas! MAP Implementa o MAP do SQL:1999, retornando um valor de tipo built-in Não exige parâmetro de entrada MAP compara vários objetos (ex.: ORDER BY) ORDER Implementa o RELATIVE WITH do SQL:1999, retornando negativo, zero ou positivo Exige como parâmetro um objeto do mesmo tipo Compara o objeto corrente (SELF) com o objeto do parâmetro Capítulo 4: BDOR – SGBD Oracle 11g

36 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; Capítulo 4: BDOR – SGBD Oracle 11g

37 Métodos para Comparação de Objetos
Outro Exemplo de MAP CREATE OR REPLACE TYPE end_type AS OBJECT ( rua VARCHAR2(30), bairro VARCHAR2(30), MAP MEMBER FUNCTION compare RETURN VARCHAR2); Ou... ALTER TYPE end_type ADD MAP MEMBER FUNCTION compare RETURN VARCHAR2 CASCADE; CREATE OR REPLACE TYPE BODY end_type AS MAP MEMBER FUNCTION compare RETURN VARCHAR2 IS BEGIN RETURN rua; END; Capítulo 4: BDOR – SGBD Oracle 11g

38 Métodos para Comparação de Objetos
CREATE TABLE emp_table (nome VARCHAR2(400), endr end_type); SELECT m.nome FROM emp_table m ORDER BY m.endr; NOME MARIA JOSE Ou... SELECT m.nome FROM emp_table m ORDER BY m.endr.rua; Não precisaria de MAP! -- Rua da Lua -- Rua do Sol Capítulo 4: BDOR – SGBD Oracle 11g

39 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 self.building_no < l.building_no THEN RETURN -1; -- qualquer número negativo ELSIF self.building_no > l.building_no THEN RETURN 1; -- qualquer número positivo ELSE RETURN 0; END IF; END; Capítulo 4: BDOR – SGBD Oracle 11g

40 Capítulo 4: BDOR – SGBD Oracle 11g
Evolução de Tipos Uso do comando ALTER TYPE, permite modificar ou evoluir um tipo objeto: Adicionar e remover atributos Adicionar e remover métodos Modificar um atributo numérico para aumentar a precisão ou a escala Modificar um atributo texto para aumentar seu comprimento Mudar propriedades FINAL e INSTANTIABLE do tipo Capítulo 4: BDOR – SGBD Oracle 11g

41 Capítulo 4: BDOR – SGBD Oracle 11g
Evolução de Tipos Exemplos ALTER TYPE person_typ ADD ATTRIBUTE (sex CHAR(1)) CASCADE; DROP MAP MEMBER FUNCTION get_id RETURN NUMBER; ALTER TYPE person_typ NOT FINAL CASCADE; ALTER TYPE person_typ FINAL; -- não poderá ter subtipo Observação CASCADE: propaga a mudança para todos os tipos dependentes Capítulo 4: BDOR – SGBD Oracle 11g

42 Evolução de Tipos – Exemplo 01
CREATE TYPE address_type AS OBJECT (street VARCHAR2(60)); CREATE TABLE customer ( id NUMBER, name VARCHAR2(40), address address_type); ALTER TYPE address_type ADD ATTRIBUTE province VARCHAR2(40); * ERRO na linha 1: ORA-22312: é necessário especificar a opção CASCADE ou INVALIDATE ALTER TYPE address_type ADD ATTRIBUTE province VARCHAR2(40) CASCADE; SQL> DESCRIBE address_type Nome Nulo? Tipo STREET VARCHAR2(60) PROVINCE VARCHAR2(40) Capítulo 4: BDOR – SGBD Oracle 11g

43 Evolução de Tipos – Exemplo 02
CREATE TYPE address_type2 AS OBJECT (street VARCHAR2(60), num NUMBER); CREATE OR REPLACE PROCEDURE test_proc01 IS v_address ADDRESS_TYPE2; BEGIN v_address.street := 'test'; END; SELECT status FROM user_objects WHERE object_name = 'TEST_PROC01'; STATUS VALID ALTER TYPE address_type2 DROP ATTRIBUTE num INVALIDATE; INVALID Capítulo 4: BDOR – SGBD Oracle 11g

44 Capítulo 4: BDOR – SGBD Oracle 11g
Herança de Tipos Suporta herança simples Há uma diferença do padrão SQL:1999, pois o Oracle não requer herança explicitamente nas tabelas, mas apenas nos tipos  modelo mais simples 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 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 Capítulo 4: BDOR – SGBD Oracle 11g

45 Capítulo 4: BDOR – SGBD Oracle 11g
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; Obs.: Por default, um tipo de objeto é FINAL! Capítulo 4: BDOR – SGBD Oracle 11g

46 Capítulo 4: BDOR – SGBD Oracle 11g
Herança de Tipos CREATE TYPE employee_typ UNDER person_typ ( depto_id NUMBER, funcao VARCHAR2(30), salario NUMBER ) NOT FINAL; CREATE TYPE professor_typ UNDER person_typ ( dept_id NUMBER, speciality VARCHAR2(30) Capítulo 4: BDOR – SGBD Oracle 11g

47 Capítulo 4: BDOR – SGBD Oracle 11g
Herança de Tipos CREATE TYPE student_typ UNDER person_typ ( registration NUMBER ) NOT FINAL; CREATE TYPE monitor_typ UNDER student_typ ( year NUMBER Capítulo 4: BDOR – SGBD Oracle 11g

48 Capítulo 4: BDOR – SGBD Oracle 11g
Herança de Tipos SQL> DESCRIBE person_typ; person_typ is NOT FINAL Nome Nulo? Tipo IDNO NUMBER NAME VARCHAR2(30) PHONE VARCHAR2(20) SQL> DESCRIBE employee_typ; employee_typ extends HR.PERSON_TYP employee_typ is NOT FINAL DEPTO_ID NUMBER FUNCAO VARCHAR2(30) SALARIO NUMBER Capítulo 4: BDOR – SGBD Oracle 11g

49 Capítulo 4: BDOR – SGBD Oracle 11g
Herança de Tipos Não foi necessário usar UNDER CREATE TABLE person_tab OF person_typ; CREATE TABLE student_tab OF student_typ; CREATE TABLE monitor_tab OF monitor_typ; INSERT INTO person_tab VALUES (person_typ(1,'JOSE',' ')); INSERT INTO student_tab VALUES(student_typ(2,'MARIA', ' ',20000)); INSERT INTO monitor_tab VALUES(monitor_typ(3, 'EICKMANN',' ',30000,2010)); Capítulo 4: BDOR – SGBD Oracle 11g

50 Capítulo 4: BDOR – SGBD Oracle 11g
Herança de Tipos SELECT p.* FROM person_tab p; IDNO NAME PHONE 1 JOSE SELECT s.* FROM student_tab s; IDNO NAME PHONE REGISTRATION 2 MARIA SELECT m.* FROM monitor_tab m; IDNO NAME PHONE REGISTRATION YEAR 3 EICKMANN Capítulo 4: BDOR – SGBD Oracle 11g

51 Capítulo 4: BDOR – SGBD Oracle 11g
Herança de Tipos DELETE FROM person_tab; DELETE FROM student_tab; DELETE FROM monitor_tab; INSERT INTO person_tab VALUES (person_typ(1,'JOSE',' ')); INSERT INTO person_tab VALUES (student_typ(2,'MARIA',' ',10000)); INSERT INTO person_tab VALUES (monitor_typ(3,'PEDRO',' ',20000,2010)); Princípio da Substituição Capítulo 4: BDOR – SGBD Oracle 11g

52 Capítulo 4: BDOR – SGBD Oracle 11g
Herança de Tipos SELECT p.* FROM person_tab p; IDNO NAME PHONE 1 JOSE 2 MARIA 3 PEDRO SELECT s.name FROM student_tab s;  não há linhas selecionadas Capítulo 4: BDOR – SGBD Oracle 11g

53 Capítulo 4: BDOR – SGBD Oracle 11g
Herança de Tipos INSERT INTO student_tab VALUES (student_typ(4,'MARY',' ',40000)); SELECT s.name FROM student_tab s; NAME MARY SELECT p.name FROM person_tab p UNION SELECT s.name FROM student_tab s; JOSE MARIA PEDRO Capítulo 4: BDOR – SGBD Oracle 11g

54 Outro Exemplo de Herança
CREATE OR REPLACE TYPE emp_type AS OBJECT ( id NUMBER, nm VARCHAR2(40)) NOT FINAL; CREATE TYPE prof_type UNDER emp_type ( siape NUMBER); CREATE TABLE emp_tab OF emp_type; INSERT INTO emp_tab VALUES (prof_type(10,'JOSE',12345)); SELECT value(p) FROM emp_tab p; -- única forma que encontrei para acessar siape Capítulo 4: BDOR – SGBD Oracle 11g

55 Herança de Tipos – DROP TYPE
Não se pode remover um subtipo antes de remover suas respectivas instâncias na tabela que armazena as tuplas daquele subtipo (substitutability) Ex.: DROP TYPE student_typ VALIDATE; ORA-02303: não pode eliminar ou substituir um tipo com dependentes de tabela ou de tipo Correto é: DELETE FROM student_tab; DROP TABLE student_tab; DROP TYPE student_typ VALIDATE; Capítulo 4: BDOR – SGBD Oracle 11g

56 Capítulo 4: BDOR – SGBD Oracle 11g
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; Capítulo 4: BDOR – SGBD Oracle 11g

57 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 RETURN 'Id: ' || TO_CHAR(person_obj.idno) || ', Name: ' || person_obj.name; -- function that can be overriden by subtypes MEMBER FUNCTION show RETURN VARCHAR2 IS RETURN person_typ.show_super(SELF); Capítulo 4: BDOR – SGBD Oracle 11g

58 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: ' || self. major; END; Capítulo 4: BDOR – SGBD Oracle 11g

59 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; Capítulo 4: BDOR – SGBD Oracle 11g

60 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; Capítulo 4: BDOR – SGBD Oracle 11g

61 Overriding Method (cont.)
CREATE TABLE person_obj_table OF person_typ; INSERT INTO person_obj_table VALUES (person_typ(12, 'Bob Jones', ' ')); VALUES (student_typ(51, 'Joe Lane', ' ', 12, 'HISTORY')); VALUES (employee_typ(55, 'Jane Smith', ' ', 100, 'Jennifer Nelson')); VALUES (part_time_student_typ(52, 'Kim Patel', ' ', 14, 'PHYSICS', 20)); Princípio da Substituição Capítulo 4: BDOR – SGBD Oracle 11g

62 Overriding Method (cont.)
SELECT p.show() AS report 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 Capítulo 4: BDOR – SGBD Oracle 11g

63 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 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 Um método STATIC (MEMBER) num subtipo não pode override um método MEMBER (STATIC) do supertipo Capítulo 4: BDOR – SGBD Oracle 11g

64 Capítulo 4: BDOR – SGBD Oracle 11g
Tabelas no ORACLE 11g Oracle11g suporta 2 tipos de tabelas: Tabela Relacional (tabela normal) Tabela de Objetos (Object Table) Equivalentes às Tabelas Tipadas (Typed Tables) do SQL:1999 Tipo especial de tabela que lida com objetos (“row objects”) e fornece uma visão relacional dos atributos desses objetos Capítulo 4: BDOR – SGBD Oracle 11g

65 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 SGBD 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 Capítulo 4: BDOR – SGBD Oracle 11g

66 Capítulo 4: BDOR – SGBD Oracle 11g
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_TY Uma Tabela com múltiplas colunas - uma coluna para cada atributo do tipo PESSOA_TY Capítulo 4: BDOR – SGBD Oracle 11g

67 Capítulo 4: BDOR – SGBD Oracle 11g
Tabelas de Objetos São tabelas especiais onde cada linha armazena um objeto Provê uma visão relacional desses objetos As linhas de uma tabela de objetos possuem um OID (Object IDentifier) implícito (definido pelo ORACLE) Os objetos de uma tabela de objetos podem ser referenciados (REF) por outros objetos Nos comandos de manipulação de objetos deve-se utilizar aliases para as tabelas Capítulo 4: BDOR – SGBD Oracle 11g

68 Capítulo 4: BDOR – SGBD Oracle 11g
Seleção em Tabelas Seleção em PESSOAS como uma tabela de múltiplas colunas: INSERT INTO pessoas VALUES ('Maria Silva', , ENDERECO_TY('Rua das Flores 84', 'Campina Grande', 'PB', ' ')); SELECT p.* FROM pessoas p; ============================================================ NOME CPF ENDERECO(RUA, CIDADE, ESTADO, CEP) Maria Silva ENDERECO_TY(‘Rua das Flores 84', ‘Campina Grande', ‘PB', ) Capítulo 4: BDOR – SGBD Oracle 11g

69 Capítulo 4: BDOR – SGBD Oracle 11g
25/03/2017 Seleção em Tabelas Seleção em PESSOAS como uma tabela de uma de uma única coluna: SELECT VALUE (p) FROM PESSOAS p WHERE p.nome = 'Maria Silva'; Resposta: VALUE(P)(NOME, CPF, ENDERECO(RUA, CIDADE, ESTADO, CEP)) PESSOA_TY(‘Maria Silva', , ENDERECO_TY(‘Rua das Flores 84', ‘Campina Grande', ‘PB', ) Alias Capítulo 4: BDOR – SGBD Oracle 11g 69

70 Capítulo 4: BDOR – SGBD Oracle 11g
25/03/2017 Seleção em Tabelas Seleção em PESSOAS por coluna de tipo primitivo: SELECT p.CPF FROM PESSOAS p WHERE p.nome = 'Maria Silva'; Resposta: CPF Capítulo 4: BDOR – SGBD Oracle 11g 70

71 Capítulo 4: BDOR – SGBD Oracle 11g
25/03/2017 Seleção em Tabelas Seleção em PESSOAS por coluna de tipo de dados definido pelo usuário: SELECT p.endereco FROM PESSOAS p WHERE p.nome = 'Maria Silva'; Resposta: ENDERECO(RUA, CIDADE, ESTADO, CEP) ENDERECO_TY('rua das Flores 84', ‘Campina Grande', ‘PB', ) Capítulo 4: BDOR – SGBD Oracle 11g 71

72 Capítulo 4: BDOR – SGBD Oracle 11g
25/03/2017 Seleção em Tabelas Seleção em PESSOAS por atributo de coluna cujo tipo de dados é definido pelo usuário: SELECT p.endereco.cidade FROM PESSOAS p WHERE p.nome = 'Maria Silva'; Resposta: ENDERECO.CIDADE Campina Grande Capítulo 4: BDOR – SGBD Oracle 11g 72

73 Capítulo 4: BDOR – SGBD Oracle 11g
Seleção em Tabelas Seleção em PESSOAS pelo OID dos objetos: SELECT REF(p) FROM pessoas p WHERE p.nome = 'Maria Silva'; Resposta: REF(P) E2D09F93B14F7795EBC4A77846A8237B6BF5CCEE8E455F943B79DF5CC FD7E0000 -- Operador REF Capítulo 4: BDOR – SGBD Oracle 11g

74 Capítulo 4: BDOR – SGBD Oracle 11g
Inserção de Dados CREATE TABLE person_obj_table OF person_typ; INSERT INTO person_obj_table VALUES ( person_typ(101, 'John', 'Smith', ' ') ); DECLARE v_person person_typ; BEGIN -- PL/SQL block for selecting a person and displaying details SELECT VALUE(p) INTO v_person FROM person_obj_table p WHERE p.idno = 101; person_typ.display_details(v_person); -- método estático END; Capítulo 4: BDOR – SGBD Oracle 11g

75 Inserção em Tabelas de Objetos
Inserção em PESSOAS como uma tabela de uma única coluna. - Usa o método construtor PESSOA_TY que constrói novos objetos do tipo PESSOA_TY. INSERT INTO PESSOAS VALUES (PESSOA_TY(‘Maria Silva', , ENDERECO_TY(‘Rua das Flores 84', ‘Campina Grande', ‘PB', )) Métodos construtores para os tipos PESSOA_TY e ENDERECO_TY. O nome do método construtor tem o mesmo nome do tipo. Capítulo 4: BDOR – SGBD Oracle 11g

76 Inserção Usando Substitutability
CREATE TABLE contacts ( contact person_typ, contact_date DATE ); INSERT INTO contacts VALUES (person_typ (12, 'Bob Jones', ' '), '24 Jun 2003' ); VALUES (student_typ(51, 'Joe Lane', ' ', 12, 'HISTORY'), '24 Jun 2003' ); VALUES (part_time_student_typ(52, 'Kim Patel', ' ', 14, 'PHYSICS', 20), '24 Jun 2003' ); Capítulo 4: BDOR – SGBD Oracle 11g

77 Desligando a Substitutability
CREATE TYPE office_typ AS OBJECT ( office_id VARCHAR(10), location location_typ, occupant person_typ) NOT FINAL; CREATE TABLE office_tab OF office_typ COLUMN occupant NOT SUBSTITUTABLE AT ALL LEVELS; Capítulo 4: BDOR – SGBD Oracle 11g

78 Desligando a Substitutability
Uma alternativa à cláusula: NOT SUBSTITUTABLE AT ALL LEVELS é usar o operador IS OF type, que especifica qual subtipo pode ser instanciado CREATE TABLE office_tab OF office_typ COLUMN occupant IS OF (ONLY employee_typ); Capítulo 4: BDOR – SGBD Oracle 11g

79 Atualização em Tabelas de Objetos
Atualiza endereço completo UPDATE PESSOAS p SET p.endereco = ENDERECO_TY(‘Rua das Margaridas 22', ‘Patos', ‘PB', ) WHERE p.nome = ‘Maria Silva'; Atualiza só a rua do endereço UPDATE PESSOAS p SET p.endereco.rua = ‘Rua das Margaridas 22' WHERE p.nome = ‘Maria Silva'; Capítulo 4: BDOR – SGBD Oracle 11g

80 Remoção em Tabelas de Objetos
DELETE FROM PESSOAS p WHERE p.nome = ‘Maria Silva'; Capítulo 4: BDOR – SGBD Oracle 11g

81 Identificadores de Objetos
Uma tabela de objetos contém uma coluna (implícita) gerada pelo SGBD contendo o OID do “row object” OID de um objeto é único e imutável Sobre essa coluna de OID é também criado automaticamente um índice para prover acesso eficiente sobre o objeto através do OID A coluna de OID é equivalente a se ter uma coluna extra de 16 bytes para uma possível chave primária Um OID permite que um “row object” seja referenciado em atributos de outros objetos ou em colunas de tabelas relacionais Um tipo pré-definido REF é capaz de representar tais referências Capítulo 4: BDOR – SGBD Oracle 11g

82 Referenciando Objetos (REF)
É um ponteiro lógico para um “Row Object” Usado para fazer referência É definido a partir do OID do objeto Oferece acesso rápido/direto (índice) Não garante integridade referencial Para isso, tem que usar referential constraint Neste caso, REF pode apontar para qualquer objeto do tipo apontado Capítulo 4: BDOR – SGBD Oracle 11g

83 Capítulo 4: BDOR – SGBD Oracle 11g
REF – Exemplo 01 CREATE TYPE emp_person_typ AS OBJECT ( name VARCHAR2(30), manager REF emp_person_typ); CREATE TABLE emp_person_obj_table OF emp_person_typ; INSERT INTO emp_person_obj_table VALUES ( emp_person_typ ('John Smith', NULL)); INSERT INTO emp_person_obj_table -- Insere Bob Jones apontando para John Smith SELECT emp_person_typ('Bob Jones', REF(e)) FROM emp_person_obj_table e WHERE e.name = 'John Smith'; ou INSERT INTO emp_person_obj_table VALUES ('Bob Jones', (SELECT REF(e) FROM emp_person_obj_table e WHERE e.name = 'John Smith')); Capítulo 4: BDOR – SGBD Oracle 11g

84 Capítulo 4: BDOR – SGBD Oracle 11g
REF – Exemplo 02 CREATE OR REPLACE TYPE tp_cliente as OBJECT ( cod_cli VARCHAR2(3), nome_cli VARCHAR2(60)); CREATE TABLE tb_cliente OF tp_cliente ( cod_cli CONSTRAINT tb_cliente_cod_cli_pk PRIMARY KEY, nome_cli CONSTRAINT tp_cliente_nome_cli_nn NOT NULL); CREATE OR REPLACE TYPE tp_dependente as OBJECT ( cod_dep VARCHAR2(3), nm_dep VARCHAR2(60), ref_titular REF tp_cliente); CREATE TABLE tb_dependente OF tp_dependente ( cod_dep CONSTRAINT tb_dependente_cod_dep_pk PRIMARY KEY, nm_dep CONSTRAINT tp_dependente_nm_dep_nn NOT NULL, ref_titular SCOPE IS tb_cliente); Capítulo 4: BDOR – SGBD Oracle 11g

85 Capítulo 4: BDOR – SGBD Oracle 11g
REF – Exemplo 02 INSERT INTO tb_cliente VALUES ('C1', 'Rita'); INSERT INTO tb_cliente VALUES ('C2', 'Ana'); INSERT INTO tb_dependente SELECT 'D1', 'Paulo', REF (c) FROM tb_cliente c WHERE c.cod_cli = 'C1'; SELECT 'D2', 'Pedro', REF (c) FROM tb_cliente c WHERE c.cod_cli = 'C2'; Capítulo 4: BDOR – SGBD Oracle 11g

86 Capítulo 4: BDOR – SGBD Oracle 11g
REF SELECT * FROM tb_dependente; ou SELECT d.* FROM tb_dependente d; COD_DEP NM_DEP REF_TITULAR D Paulo Q2459QW8RNDGS0D98G765SF D Pedro 5XBGVX3B75XCN490VM0VBX4 OIDs de clientes Capítulo 4: BDOR – SGBD Oracle 11g

87 Capítulo 4: BDOR – SGBD Oracle 11g
REF SELECT REF(d) FROM tb_dependente d WHERE d. nm_dep = ‘Paulo’; REF(D) HRD23K56RNDGS0DUY6TGDE4 OID de dependente Capítulo 4: BDOR – SGBD Oracle 11g

88 Capítulo 4: BDOR – SGBD Oracle 11g
REF SELECT d.ref_titular.cod_cli AS cod_cliente, d.ref_titular.nm_cli AS nm_cliente, d.nm_dep AS nm_dependente FROM tb_dependente d; COD_CLIENTE NM_CLIENTE NM_DEPENDENTE C1 Rita Paulo C2 Ana Pedro -- Não foi feita nenhuma operação de junção! Capítulo 4: BDOR – SGBD Oracle 11g

89 Capítulo 4: BDOR – SGBD Oracle 11g
Dangling REF Verificando a validade das referências (Dangling) DELETE FROM tb_cliente WHERE cod_cli = ‘C1’; Remove o “objeto Rita” SELECT d.ref_titular.cod_cli AS cod_cliente, d.ref_titular.nm_cli AS nm_cliente, d.nm_dep AS nm_dependente FROM tb_dependente d; COD_CLIENTE NM_CLIENTE NM_DEPENDENTE Paulo C Ana Pedro O objeto Rita não é listado, mas Paulo ainda existe!!!! Paulo aponta para um OID que não existe mais! Capítulo 4: BDOR – SGBD Oracle 11g

90 Capítulo 4: BDOR – SGBD Oracle 11g
Dangling REF Verificando a validade das referências (Dangling) SELECT d.ref_titular.cod_cli cod_cliente, d.ref_titular.nome_cli nm_cliente, d.nm_dep nm_dependente FROM tb_dependente d WHERE d.ref_titular IS DANGLING; COD_CLIENTE NM_CLIENTE NM_DEPENDENTE Paulo Capítulo 4: BDOR – SGBD Oracle 11g

91 Capítulo 4: BDOR – SGBD Oracle 11g
Dangling REF Verificando a validade das referências (Dangling) SELECT d.ref_titular.cod_cli cod_cliente, d.ref_titular.nome_cli nm_cliente, d.nm_dep nm_dependente FROM tb_dependente d WHERE d.ref_titular IS NOT DANGLING; -- complemento COD_CLIENTE NM_CLIENTE NM_DEPENDENTE C Ana Pedro Capítulo 4: BDOR – SGBD Oracle 11g

92 Capítulo 4: BDOR – SGBD Oracle 11g
Dangling IS NOT NULL SELECT d.ref_titular.cod_cli AS cod_cliente, d.ref_titular.nm_cli AS nm_cliente, d.nm_dep AS nm_dependente FROM tb_dependente d WHERE d.ref_titular IS NOT NULL; COD_CLIENTE NM_CLIENTE NM_DEPENDENTE Paulo C2 Ana Pedro Capítulo 4: BDOR – SGBD Oracle 11g

93 Capítulo 4: BDOR – SGBD Oracle 11g
SCOPED REF Várias Object Tables podem ter sido criadas a partir de person_typ, nesse caso é bom definir o escopo CREATE TABLE contacts_ref ( contact_ref REF person_typ SCOPE IS person_obj_table, contact_date DATE ); Para inserir uma linha na tabela contacts_ref: INSERT INTO contacts_ref SELECT REF(p), '26 Jun 2003' FROM person_obj_table p WHERE p.idno = 101; Capítulo 4: BDOR – SGBD Oracle 11g

94 Integridade Referencial em REF
Vimos que apenas utilizar o tipo de dados REF não garante integridade referencial Utiliza-se uma sintaxe semelhante ao FOREIGN KEY do modelo relacional Exemplo: FOREIGN KEY (cust_ref) REFERENCES customer_objtab No exemplo acima o escopo é dado implicitamente! PRIMARY KEY não pode ser especificado para uma coluna REF Capítulo 4: BDOR – SGBD Oracle 11g

95 Integridade Referencial em REF
CREATE TYPE tipo_evento AS OBJECT ( codeve NUMBER, nome VARCHAR2(500)); CREATE TYPE tipo_artigo AS OBJECT ( codart NUMBER, titulo VARCHAR2(200), evento REF tipo_evento); CREATE TABLE tab_evento OF tipo_evento ( CONSTRAINT tab_evento_codeve PRIMARY KEY (codeve)); CREATE TABLE tab_artigo OF tipo_artigo ( CONSTRAINT tab_artigo_codart PRIMARY KEY (codart), CONSTRAINT tab_artigo_evento_fk FOREIGN KEY (evento) REFERENCES tab_evento); EVENTO ARTIGO Capítulo 4: BDOR – SGBD Oracle 11g

96 Integridade Referencial em REF
INSERT INTO tab_evento VALUES (10,'ICDE'); 1 linha criada. INSERT INTO tab_artigo VALUES (1,'BLA BLA BLA',10); ORA-00932: tipos de dados inconsistentes: esperava REF obteve NUMBER INSERT INTO tab_artigo VALUES (1, 'BLA BLA BLA',(SELECT REF(e) FROM tab_evento e WHERE e.codeve = 10)); DELETE FROM tab_evento WHERE codeve = 10; ORA-02292: restrição de integridade (TPCE.TAB_ARTIGO_EVENTO_FK) violada - registro filho localizado Capítulo 4: BDOR – SGBD Oracle 11g

97 Capítulo 4: BDOR – SGBD Oracle 11g
DEREF O operador DEREF “desfaz” o REF Retorna um objeto referenciado por uma coluna do tipo REF Desreferenciar um objeto dangling retorna um objeto null Capítulo 4: BDOR – SGBD Oracle 11g

98 Capítulo 4: BDOR – SGBD Oracle 11g
DEREF Exemplo SELECT DEREF(d.ref_titular) AS deref_titular, d.nm_dep AS nm_dependente FROM tb_dependente d; DEREF_TITULAR(COD_CLI, NM_CLI) NM_DEPENDENTE TP_CLIENTE('C1', 'Rita') Paulo TP_CLIENTE('C2', 'Ana') Pedro Capítulo 4: BDOR – SGBD Oracle 11g

99 Capítulo 4: BDOR – SGBD Oracle 11g
DEREF Exemplo (sem usar DEREF) SELECT d.ref_titular AS sem_deref, d.nm_dep AS nm_dependente FROM tb_dependente d; SEM_DEREF NM_DEPENDENTE P07XZC8V6Z0F97X6VZ965X6VZ4X8VXCVB6Z Paulo XCVU6CHBD967B436CB74B5X9B2BX2VQ4WFF Pedro Capítulo 4: BDOR – SGBD Oracle 11g

100 Capítulo 4: BDOR – SGBD Oracle 11g
VALUE Exibe os dados das instâncias dos objetos Usa o mesmo formato que DEREF Exemplo SELECT VALUE(d) AS value_titular FROM tb_dependente d; VALUE_TITULAR (COD_DEP, NM_DEP, REF_TITULAR) TP_DEPENDENTE('D1', 'Paulo', Q2459QW8RNDGS0D98G765SF) TP_DEPENDENTE('D2', 'Pedro', 5XBGVX3B75XCN490VM0VBX4) Capítulo 4: BDOR – SGBD Oracle 11g

101 Referenciando Objetos
EMPREGADO_TY DEPARTAMENTO_TY depto create type DEPARTAMENTO_TY as object (Nome VARCHAR2(25), ); create table DEPARTAMENTOS of DEPARTAMENTO_TY ( ); Os objetos do tipo DEPARTAMENTO_TY podem ser referenciados em colunas de tabelas relacionais ou em atributos de outros objetos. create table EMPREGADOS (Nome VARCHAR2(25), CPF NUMBER, depto REF DEPARTAMENTO_TY SCOPE IS departamentos); Capítulo 4: BDOR – SGBD Oracle 11g

102 Capítulo 4: BDOR – SGBD Oracle 11g
Tipo REF create type EMPREGADO_TY as object (Nome VARCHAR2(25), CPF NUMBER, depto REF DEPARTAMENTO_TY); Um objeto do tipo REF encapsula uma referência para um “row object” de um tipo de objeto especificado O valor de um objeto do tipo REF é um “ponteiro lógico” para um row object REFs e coleções de REFs são utilizados na modelagem de associações entre objetos. Por exemplo, o relacionamento entre uma ordem de compra e um cliente REFs constituem um mecanismo simples para navegar entre objetos. Pode-se utilizar a notação estendida de “pontos” para seguir os ponteiros sem a necessidade de junções explícitas Capítulo 4: BDOR – SGBD Oracle 11g

103 Capítulo 4: BDOR – SGBD Oracle 11g
Coleções O SGBD Oracle dá suporte a: VARRAY: coleção ordenada de elementos, com número fixo de elementos, se quiser manipular a coleção toda de uma vez Nested Tables (Tabelas Aninhadas): quando se precisa executar consultas eficientes em coleções, manipular um número arbitrário de elementos ou executar várias operações de INSERT, UPDATE ou DELETE Capítulo 4: BDOR – SGBD Oracle 11g

104 Capítulo 4: BDOR – SGBD Oracle 11g
VARRAYS É um conjunto ordenado de elementos Todos os elementos do VARRAY são do mesmo tipo de dados (ou subtipo) Cada elemento tem um índice, que representa sua posição no array,e é usado para acessar um dado elemento Possui um número máximo de elementos, chamado de tamanho do array (que pode ser alterado depois) Capítulo 4: BDOR – SGBD Oracle 11g

105 Capítulo 4: BDOR – SGBD Oracle 11g
VARRAYS Exemplo 1: VARRAY de tipo de dados primitivo CREATE TYPE _list_arr AS VARRAY(10) OF VARCHAR2(80); Exemplo 2: VARRAY de tipo de dados definido pelo usuário CREATE TYPE phone_typ AS OBJECT ( country_code VARCHAR2(2), area_code VARCHAR2(3), ph_number VARCHAR2(7)); CREATE TYPE phone_varray_typ AS VARRAY(5) OF phone_typ; CREATE TABLE dept_phone_list ( dept_no NUMBER(5), phone_list phone_varray_typ); INSERT INTO dept_phone_list VALUES ( 100, phone_varray_typ( phone_typ ('01', '650', ' '), phone_typ ('01', '650', ' '), phone_typ ('01', '650', ' '))); Capítulo 4: BDOR – SGBD Oracle 11g

106 Capítulo 4: BDOR – SGBD Oracle 11g
VARRAY Modificando o tamanho de um elemento do VARRAY CREATE TYPE _list_arr AS VARRAY(10) OF VARCHAR2(80); ALTER TYPE _list_arr MODIFY ELEMENT TYPE VARCHAR2(100) CASCADE; Capítulo 4: BDOR – SGBD Oracle 11g

107 Capítulo 4: BDOR – SGBD Oracle 11g
VARRAY Modificando o tamanho do VARRAY CREATE TYPE _varray_typ AS VARRAY(5) OF _list_typ; ALTER TYPE _varray_typ MODIFY LIMIT 100; Capítulo 4: BDOR – SGBD Oracle 11g

108 Nested Table (Tabela Aninhada)
É um conjunto não ordenado de elementos, cada um do mesmo tipo de dados Não há número máximo de elementos e a ordem não é preservada Inserção, remoção, seleção e atualização “como” em tabelas normais Capítulo 4: BDOR – SGBD Oracle 11g

109 Nested Table (Exemplo)
CREATE TYPE person_typ AS OBJECT ( idno NUMBER, name VARCHAR2(30), phone VARCHAR2(25)); CREATE TYPE people_typ AS TABLE OF person_typ; Capítulo 4: BDOR – SGBD Oracle 11g

110 Nested Table (Exemplo)
CREATE TABLE people_tab ( group_no NUMBER, people_column people_typ) NESTED TABLE people_column STORE AS people_column_nt; INSERT INTO people_tab VALUES ( 100, people_typ ( person_typ (1, 'John Smith', ' '), person_typ (2, 'Diane Smith', NULL) ) ); Capítulo 4: BDOR – SGBD Oracle 11g

111 Nested Table (Exemplo)
CREATE TABLE students ( graduation DATE, math_majors people_typ, chem_majors people_typ, physics_majors people_typ) NESTED TABLE math_majors STORE AS math_majors_nt NESTED TABLE chem_majors STORE AS chem_majors_nt NESTED TABLE physics_majors STORE AS physics_majors_nt; CREATE INDEX math_idno_idx ON math_majors_nt(idno); CREATE INDEX chem_idno_idx ON chem_majors_nt(idno); CREATE INDEX physics_idno_idx ON physics_majors_nt(idno); INSERT INTO students (graduation) VALUES ('01-JUN-03'); UPDATE students SET math_majors = people_typ (person_typ(12, 'Bob Jones', ' '), person_typ(31, 'Sarah Chen', ' '), person_typ(45, 'Chris Woods', ' ')), chem_majors = people_typ (person_typ(51, 'Joe Lane', ' '), person_typ(52, 'Kim Patel', ' ')), physics_majors = person_typ(45, 'Chris Woods', ' ')) WHERE graduation = '01-JUN-03'; Capítulo 4: BDOR – SGBD Oracle 11g

112 Coleções Multi-dimensionais
Podemos ter: Nested table de nested table type Nested table de VARRAY type VARRAY de nested table type VARRAY de VARRAY type Nested table ou VARRAY de um UDT que tem um atributo que é uma nested table ou VARRAY type Capítulo 4: BDOR – SGBD Oracle 11g

113 Coleções Multi-Dimensionais
CREATE TYPE location_typ AS OBJECT ( location_id NUMBER(4), street_address VARCHAR2(40), postal_code VARCHAR2(12), city VARCHAR2(30), state_province VARCHAR2(25)); CREATE TYPE nt_location_typ AS TABLE OF location_typ; CREATE TYPE country_typ AS OBJECT ( country_id CHAR(2), country_name VARCHAR2(40), locations nt_location_typ); CREATE TYPE nt_country_typ AS TABLE OF country_typ; CREATE TABLE region_tab ( region_id NUMBER, region_name VARCHAR2(25), countries nt_country_typ) NESTED TABLE countries STORE AS nt_countries_tab (NESTED TABLE locations STORE AS nt_locations_tab); Region Country Location Capítulo 4: BDOR – SGBD Oracle 11g

114 Coleções Multi-Dimensionais
Capítulo 4: BDOR – SGBD Oracle 11g

115 Coleções Multi-Dimensionais
INSERT INTO region_tab VALUES(1, 'Europe', nt_country_typ( country_typ( 'IT', 'Italy', nt_location_typ ( location_typ(1000, '1297 Via Cola di Rie','00989','Roma', ''), location_typ(1100, '93091 Calle della Testa','10934','Venice','') )), country_typ( 'CH', 'Switzerland', nt_location_typ ( location_typ(2900, '20 Rue des Corps-Saints', '1730', 'Geneva', 'Geneve'), location_typ(3000, 'Murtenstrasse 921', '3095', 'Bern', 'BE') )), country_typ( 'UK', 'United Kingdom', nt_location_typ ( location_typ(2400, '8204 Arthur St', '', 'London', 'London'), location_typ(2500, 'Mag Centre, Ox Science Park', 'OX9 9ZB', 'Oxford', 'Oxford'), location_typ(2600, '9702 Chester Road', '93', 'Stretford','Manchester') ) ) ); Capítulo 4: BDOR – SGBD Oracle 11g

116 Capítulo 4: BDOR – SGBD Oracle 11g
Operações em Coleções CREATE TYPE people_typ AS TABLE OF person_typ; CREATE TABLE department_persons ( dept_no NUMBER PRIMARY KEY, dept_name CHAR(20), dept_mgr person_typ DEFAULT person_typ(10,'John Doe',NULL), dept_emps people_typ) NESTED TABLE dept_emps STORE AS dept_emps_tab; INSERT INTO department_persons VALUES ( 101, 'Physical Sciences', person_typ(65,'Vrinda Mills', ' '), people_typ( person_typ(1, 'John Smith', ' '), person_typ(2, 'Diane Smith', ' ') ) ); INSERT INTO department_persons VALUES ( 104, 'Life Sciences', person_typ(70,'James Hall', ' '), people_typ(person_typ(3, 'Jorge Valdez', ' ') )); Capítulo 4: BDOR – SGBD Oracle 11g

117 Capítulo 4: BDOR – SGBD Oracle 11g
Operações em Coleções Existem duas formas de se realizar uma consulta em colunas com coleções: Uma delas traz as coleções aninhadas dentro das linhas que as contêm A outra forma, desaninha (unnest) as coleções de forma que cada elemento da coleção aparecerá numa linha do resultado Capítulo 4: BDOR – SGBD Oracle 11g

118 Capítulo 4: BDOR – SGBD Oracle 11g
Operações em Coleções Consultas com resultado aninhado: SELECT d.dept_emps -- Dados da tabela aninhada FROM department_persons d; DEPT_EMPS(IDNO, NAME, PHONE) PEOPLE_TYP(PERSON_TYP(1, 'John Smith', ' '), PERSON_TYP(2, 'Diane Smith', ' )) PEOPLE_TYP(PERSON_TYP(3, 'Jorge Valdez', ' ')) Capítulo 4: BDOR – SGBD Oracle 11g

119 Capítulo 4: BDOR – SGBD Oracle 11g
Operações em Coleções Consultas com resultado desaninhado: SELECT e.* -- Dados da tabela aninhada FROM department_persons d, TABLE(d.dept_emps) e; IDNO NAME PHONE 1 John Smith 2 Diane Smith 3 Jorge Valdez Capítulo 4: BDOR – SGBD Oracle 11g

120 Capítulo 4: BDOR – SGBD Oracle 11g
Operações em Coleções Consulta que resulta linhas de departamentos que possuem empregados SELECT d.dept_no, e.* FROM department_persons d, TABLE(d.dept_emps) e; DEPT_NO IDNO NAME PHONE John Smith Diane Smith Jorge Valdez Capítulo 4: BDOR – SGBD Oracle 11g

121 Capítulo 4: BDOR – SGBD Oracle 11g
Operações em Coleções Mesma consulta anterior mostrando também departamentos sem empregados (outer join) INSERT INTO department_persons VALUES ( 110, 'Mathematics', person_typ(5, 'Dr Kumalo', ' '),people_typ() ); SELECT d.dept_no, e.* FROM department_persons d, TABLE(d.dept_emps) (+) e; DEPT_NO IDNO NAME PHONE 110 Jorge Valdez John Smith Diane Smith Capítulo 4: BDOR – SGBD Oracle 11g

122 Capítulo 4: BDOR – SGBD Oracle 11g
Operações em Coleções SELECT * FROM TABLE ( SELECT d.dept_emps FROM department_persons d WHERE d.dept_no = 101); IDNO NAME PHONE 1 John Smith 2 Diane Smith Observações A subquery acima deve retornar sempre uma coleção A projeção da subquery deve conter apenas um item Capítulo 4: BDOR – SGBD Oracle 11g

123 Capítulo 4: BDOR – SGBD Oracle 11g
Operações em Coleções Inserção INSERT INTO TABLE(SELECT d.dept_emps FROM department_persons d WHERE d.dept_no = 101) – deve retornar uma única linha VALUES (5, 'Kevin Taylor', ' '); Capítulo 4: BDOR – SGBD Oracle 11g

124 Capítulo 4: BDOR – SGBD Oracle 11g
Operações em Coleções Atualização UPDATE TABLE(SELECT d.dept_emps FROM department_persons d WHERE d.dept_no = 101) e SET VALUE(e) = person_typ(5, 'Kevin Taylor', ' ') WHERE e.idno = 5; Capítulo 4: BDOR – SGBD Oracle 11g

125 Capítulo 4: BDOR – SGBD Oracle 11g
Operações em Coleções Remoção DELETE FROM TABLE(SELECT d.dept_emps FROM department_persons d WHERE d.dept_no = 101) e WHERE e.idno = 5 Capítulo 4: BDOR – SGBD Oracle 11g

126 Capítulo 4: BDOR – SGBD Oracle 11g
Operações em Coleções CREATE TYPE location_typ AS OBJECT ( location_id NUMBER(4), street_address VARCHAR2(40), postal_code VARCHAR2(12), city VARCHAR2(30), state_province VARCHAR2(25)); CREATE TYPE nt_location_typ AS TABLE OF location_typ; CREATE TYPE country_typ AS OBJECT ( country_id CHAR(2), country_name VARCHAR2(40), locations nt_location_typ); CREATE TYPE nt_country_typ AS TABLE OF country_typ; CREATE TABLE region_tab ( region_id NUMBER, region_name VARCHAR2(25), countries nt_country_typ) NESTED TABLE countries STORE AS nt_countries_tab (NESTED TABLE locations STORE AS nt_locations_tab); Capítulo 4: BDOR – SGBD Oracle 11g

127 Capítulo 4: BDOR – SGBD Oracle 11g
Operações em Coleções INSERT INTO region_tab VALUES( 1, 'Europe', nt_country_typ ( country_typ( 'IT', 'Italy', nt_location_typ ( location_typ(1000, '1297 Via Cola di Rie','00989','Roma', ''), location_typ(1100, '93091 Calle della Testa','10934','Venice','') ) ), country_typ( 'CH', 'Switzerland', location_typ(2900, '20 Rue des Corps-Saints', '1730', 'Geneva', 'Geneve'), location_typ(3000, 'Murtenstrasse 921', '3095', 'Bern', 'BE') ) ), country_typ( 'UK', 'United Kingdom', location_typ(2400, '8204 Arthur St', '', 'London', 'London'), location_typ(2500, 'Magdalen Centre, The Oxford Science Park', 'OX9 9ZB', 'Oxford', 'Oxford'), location_typ(2600, '9702 Chester Road', ' ', 'Stretford', 'Manchester') ) ) ) ); Capítulo 4: BDOR – SGBD Oracle 11g

128 Consulta em Multi-Coleções
Exemplo 1 SELECT r.region_name, c.country_name, l.location_id FROM region_tab r, TABLE(r.countries) c, TABLE(c.locations) l; REGION_NAME COUNTRY_NAME LOCATION_ID Europe Italy Europe Italy Europe Switzerland Europe Switzerland Europe United Kingdom Europe United Kingdom Europe United Kingdom Capítulo 4: BDOR – SGBD Oracle 11g

129 Consulta em Multi-Coleções
Exemplo 2 SELECT l.location_id, l.city FROM region_tab r, TABLE(r.countries) c, TABLE(c.locations) l; LOCATION_ID CITY 1000 Roma 1100 Venice 2900 Geneva 3000 Bern 2400 London 2500 Oxford 2600 Stretford Capítulo 4: BDOR – SGBD Oracle 11g

130 Capítulo 4: BDOR – SGBD Oracle 11g
Object Views São tabelas de objetos (object table) virtuais Cada linha (row) da Object View é um objeto, podendo-se, portanto, chamar seus métodos e acessar seus atributos Dá um aspecto de classe a uma tabela puramente relacional Capítulo 4: BDOR – SGBD Oracle 11g

131 Criando uma Object View – Exemplo 1
CREATE TABLE emp_table ( empnum NUMBER (5) PRIMARY KEY, ename VARCHAR2 (20) NOT NULL, salary NUMBER (9,2), job VARCHAR2 (20)); CREATE TYPE employee_t AS OBJECT ( -- pode-se criar métodos aqui empno NUMBER (5), ename VARCHAR2 (20), CREATE VIEW emp_view1 OF employee_t WITH OBJECT IDENTIFIER (empno) AS SELECT e.empnum, e.ename, e.salary, e.job FROM emp_table e WHERE e.job = 'Developer'; Capítulo 4: BDOR – SGBD Oracle 11g

132 Criando uma Object View – Exemplo 2
CREATE TABLE dept ( deptno NUMBER PRIMARY KEY, deptname VARCHAR2(20), deptstreet VARCHAR2(20), deptcity VARCHAR2(10), deptstate CHAR(2), deptzip VARCHAR2(10)); CREATE TYPE address_t AS OBJECT ( street VARCHAR2(20), city VARCHAR2(10), state CHAR(2), zip VARCHAR2(10)); CREATE TYPE dept_t AS OBJECT ( deptno NUMBER, address address_t ); CREATE VIEW dept_view OF dept_t WITH OBJECT IDENTIFIER (deptno) AS SELECT d.deptno, d.deptname, address_t(d.deptstreet, d.deptcity, d.deptstate, d.deptzip) AS deptaddr FROM dept d; INSERT INTO dept_view VALUES (10, 'CS', address_t('20 Los Loucos','Long Beach','CA','62000')); Capítulo 4: BDOR – SGBD Oracle 11g


Carregar ppt "Capítulo 4: SGBDOR Oracle 11g"

Apresentações semelhantes


Anúncios Google