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

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

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

Apresentações semelhantes


Apresentação em tema: "Capítulo 4: SGBDOR Oracle 11g Banco de Dados II Prof. Carlos Eduardo Pires"— 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 11g2 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:

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

4 Capítulo 4: BDOR – SGBD Oracle 11g4 Exemplo - UML Esquema Conceitual

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

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

7 Capítulo 4: BDOR – SGBD Oracle 11g7 Definindo os Tipos

8 Capítulo 4: BDOR – SGBD Oracle 11g8 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)

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

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

11 Capítulo 4: BDOR – SGBD Oracle 11g11 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] );

12 Capítulo 4: BDOR – SGBD Oracle 11g12 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, dt_contato DATE ); CREATE TYPE tp_domicilio AS OBJECT ( local tp_ponto, endereco VARCHAR2 (80) );

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

14 Capítulo 4: BDOR – SGBD Oracle 11g14 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 CREATE TYPE ENDERECO_TYP AS OBJECT (rua VARCHAR2(50), cidade VARCHAR2(25), estado CHAR(2), cep NUMBER); CREATE TYPE PESSOA_TYP AS OBJECT (nome VARCHAR2(25), endereco ENDERECO_TYP); ENDEREÇO_TYP é usado para definir o tipo do atributo Endereco do tipo PESSOA_TYP Tipos de Objetos

15 Capítulo 4: BDOR – SGBD Oracle 11g15 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 Tipos de Objetos

16 Capítulo 4: BDOR – SGBD Oracle 11g16 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!

17 Capítulo 4: BDOR – SGBD Oracle 11g17 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); END;

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

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

20 Capítulo 4: BDOR – SGBD Oracle 11g20 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)

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

22 Capítulo 4: BDOR – SGBD Oracle 11g22 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; colunatabela CREATE TABLE office_tab ( office_loc location_typ, occupant occupant_typ); CREATE TYPE location_typ AS OBJECT( city VARCHAR2(30), building_no NUMBER); CREATE TYPE occupant_typ AS OBJECT( idno NUMBER);

23 Capítulo 4: BDOR – SGBD Oracle 11g23 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)

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

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

26 Capítulo 4: BDOR – SGBD Oracle 11g26 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); END; MEMBER PROCEDURE display (SELF IN OUT solid_typ) IS BEGIN DBMS_OUTPUT.PUT_LINE('Length: ' || len || ' - ' || 'Width: ' || wth || ' - ' || 'Height: ' || hgt); DBMS_OUTPUT.PUT_LINE('Volume: ' || volume || ' - ' || 'Surface area: ' || surface); END;

27 Capítulo 4: BDOR – SGBD Oracle 11g27 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);

28 Capítulo 4: BDOR – SGBD Oracle 11g28 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()

29 Capítulo 4: BDOR – SGBD Oracle 11g29 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); Exemplo 01: Static Method

30 Capítulo 4: BDOR – SGBD Oracle 11g30 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; BEGIN alunosbd2_typ.atualiza(20111); END; SELECT * FROM alunosbd2_tab; Exemplo 01: Static Method

31 Capítulo 4: BDOR – SGBD Oracle 11g31 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; BEGIN atype.newa(1, 'atab', 'HR'); END; construtor valor, tabela e esquema (usuário do BD)

32 Capítulo 4: BDOR – SGBD Oracle 11g32 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));

33 Capítulo 4: BDOR – SGBD Oracle 11g33 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'));

34 Capítulo 4: BDOR – SGBD Oracle 11g34 Métodos para Comparação de Objetos SELECT m.nome FROMemp_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

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

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

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

38 Capítulo 4: BDOR – SGBD Oracle 11g38 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 -- Rua da Lua -- Rua do Sol Ou... SELECT m.nome FROMemp_table m ORDER BY m.endr.rua; Não precisaria de MAP!

39 Capítulo 4: BDOR – SGBD Oracle 11g39 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 ELSERETURN 0; END IF; END;

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

41 Capítulo 4: BDOR – SGBD Oracle 11g41 Evolução de Tipos Exemplos ALTER TYPE person_typ ADD ATTRIBUTE (sex CHAR(1)) CASCADE; ALTER TYPE person_typ 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

42 Capítulo 4: BDOR – SGBD Oracle 11g42 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)

43 Capítulo 4: BDOR – SGBD Oracle 11g43 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; SELECT status FROM user_objects WHERE object_name = 'TEST_PROC01'; STATUS INVALID

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

45 Capítulo 4: BDOR – SGBD Oracle 11g45 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!

46 Capítulo 4: BDOR – SGBD Oracle 11g46 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) ) NOT FINAL;

47 Capítulo 4: BDOR – SGBD Oracle 11g47 Herança de Tipos CREATE TYPE student_typ UNDER person_typ ( registrationNUMBER ) NOT FINAL; CREATE TYPE monitor_typ UNDER student_typ ( yearNUMBER ) NOT FINAL;

48 Capítulo 4: BDOR – SGBD Oracle 11g48 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 Nome Nulo?Tipo IDNO NUMBER NAME VARCHAR2(30) PHONE VARCHAR2(20) DEPTO_ID NUMBER FUNCAO VARCHAR2(30) SALARIO NUMBER

49 Capítulo 4: BDOR – SGBD Oracle 11g49 Herança de Tipos 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)); Não foi necessário usar UNDER

50 Capítulo 4: BDOR – SGBD Oracle 11g50 Herança de Tipos SELECT p.* FROMperson_tab p; IDNO NAME PHONE JOSE SELECTs.* FROMstudent_tab s; IDNO NAME PHONE REGISTRATION MARIA SELECTm.* FROMmonitor_tab m; IDNO NAME PHONE REGISTRATIONYEAR EICKMANN

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

52 Capítulo 4: BDOR – SGBD Oracle 11g52 Herança de Tipos SELECTp.* FROM person_tab p; IDNONAME PHONE JOSE MARIA PEDRO SELECT s.name FROM student_tab s; não há linhas selecionadas

53 Capítulo 4: BDOR – SGBD Oracle 11g53 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; NAME JOSE MARIA MARY PEDRO

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

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

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

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

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

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

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

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

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

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

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

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

66 Capítulo 4: BDOR – SGBD Oracle 11g66 Tabela de Objetos 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 CREATE TYPE PESSOA_TY AS OBJECT (Nome VARCHAR2(25), CPF NUMBER, Endereco ENDERECO_TY); CREATE TABLE PESSOAS OF PESSOA_TY (CPF PRIMARY KEY);

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

68 Capítulo 4: BDOR – SGBD Oracle 11g68 SELECT p.* FROM pessoas p ; ============================================================ NOME CPF ENDERECO(RUA, CIDADE, ESTADO, CEP) Maria Silva ENDERECO_TY(Rua das Flores 84', Campina Grande', PB', ) 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', ' ')); Seleção em Tabelas

69 Capítulo 4: BDOR – SGBD Oracle 11g69 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', ) Seleção em PESSOAS como uma tabela de uma de uma única coluna: Seleção em Tabelas Alias

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

71 Capítulo 4: BDOR – SGBD Oracle 11g71 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', ) Seleção em Tabelas Seleção em PESSOAS por coluna de tipo de dados definido pelo usuário:

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

73 Capítulo 4: BDOR – SGBD Oracle 11g73 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) E2D09F93B14F7795EBC4A77846A8237B6BF5CCEE8E455F9 43B79DF5CC FD7E Operador REF

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

75 Capítulo 4: BDOR – SGBD Oracle 11g75 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. Inserção em Tabelas de Objetos

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

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

78 Capítulo 4: BDOR – SGBD Oracle 11g78 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);

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

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

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

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

83 Capítulo 4: BDOR – SGBD Oracle 11g83 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'));

84 Capítulo 4: BDOR – SGBD Oracle 11g84 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);

85 Capítulo 4: BDOR – SGBD Oracle 11g85 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'; INSERT INTO tb_dependente SELECT 'D2', 'Pedro', REF (c) FROM tb_cliente c WHERE c.cod_cli = 'C2';

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

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

88 Capítulo 4: BDOR – SGBD Oracle 11g88 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!

89 Capítulo 4: BDOR – SGBD Oracle 11g89 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 C2 Ana Pedro O objeto Rita não é listado, mas Paulo ainda existe!!!! Paulo aponta para um OID que não existe mais!

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

91 Capítulo 4: BDOR – SGBD Oracle 11g91 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 C2 Ana Pedro

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

93 Capítulo 4: BDOR – SGBD Oracle 11g93 SCOPED REF 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; Várias Object Tables podem ter sido criadas a partir de person_typ, nesse caso é bom definir o escopo

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

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

96 Capítulo 4: BDOR – SGBD Oracle 11g96 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)); 1 linha criada. DELETE FROM tab_evento WHERE codeve = 10; ORA-02292: restrição de integridade (TPCE.TAB_ARTIGO_EVENTO_FK) violada - registro filho localizado

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

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

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

100 Capítulo 4: BDOR – SGBD Oracle 11g100 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)

101 Capítulo 4: BDOR – SGBD Oracle 11g101 EMPREGADO_TY DEPARTAMENTO_TY depto create table EMPREGADOS (Nome VARCHAR2(25), CPF NUMBER, depto REF DEPARTAMENTO_TY SCOPE IS departamentos); 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. Referenciando Objetos

102 Capítulo 4: BDOR – SGBD Oracle 11g102 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 create type EMPREGADO_TY as object (Nome VARCHAR2(25), CPF NUMBER, depto REF DEPARTAMENTO_TY); Tipo REF

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

104 Capítulo 4: BDOR – SGBD Oracle 11g104 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)

105 Capítulo 4: BDOR – SGBD Oracle 11g105 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', ' ')));

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

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

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

109 Capítulo 4: BDOR – SGBD Oracle 11g109 Nested Table (Exemplo) CREATE TYPE person_typ AS OBJECT ( idnoNUMBER, nameVARCHAR2(30), phoneVARCHAR2(25)); CREATE TYPE people_typ AS TABLE OF person_typ;

110 Capítulo 4: BDOR – SGBD Oracle 11g110 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) ) );

111 Capítulo 4: BDOR – SGBD Oracle 11g111 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(31, 'Sarah Chen', ' '), person_typ(52, 'Kim Patel', ' ')), physics_majors = people_typ (person_typ(12, 'Bob Jones', ' '), person_typ(45, 'Chris Woods', ' ')) WHERE graduation = '01-JUN-03';

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

113 Capítulo 4: BDOR – SGBD Oracle 11g113 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); Location Country Region

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

115 Capítulo 4: BDOR – SGBD Oracle 11g115 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') ) ) );

116 Capítulo 4: BDOR – SGBD Oracle 11g116 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_empspeople_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', ' ') ));

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

118 Capítulo 4: BDOR – SGBD Oracle 11g118 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', ' '))

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

120 Capítulo 4: BDOR – SGBD Oracle 11g120 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 Operações em Coleções

121 Capítulo 4: BDOR – SGBD Oracle 11g121 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 Jorge Valdez John Smith Diane Smith Operações em Coleções

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

123 Capítulo 4: BDOR – SGBD Oracle 11g123 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', ' ');

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

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

126 Capítulo 4: BDOR – SGBD Oracle 11g126 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);

127 Capítulo 4: BDOR – SGBD Oracle 11g127 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', 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, 'Magdalen Centre, The Oxford Science Park', 'OX9 9ZB', 'Oxford', 'Oxford'), location_typ(2600, '9702 Chester Road', ' ', 'Stretford', 'Manchester') ) ) ) );

128 Capítulo 4: BDOR – SGBD Oracle 11g128 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 1000 Europe Italy 1100 Europe Switzerland 2900 Europe Switzerland 3000 Europe United Kingdom 2400 Europe United Kingdom 2500 Europe United Kingdom 2600

129 Capítulo 4: BDOR – SGBD Oracle 11g129 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 Roma 1100 Venice 2900 Geneva 3000 Bern 2400 London 2500 Oxford 2600 Stretford

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

131 Capítulo 4: BDOR – SGBD Oracle 11g131 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), salary NUMBER (9,2), job 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';

132 Capítulo 4: BDOR – SGBD Oracle 11g132 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, deptname VARCHAR2(20), 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'));


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

Apresentações semelhantes


Anúncios Google