Unidade 4.1: BDOR – Oracle 11g Banco de Dados II – 2009.2 Prof. Cláudio de Souza Baptista, Ph.D. UFCG/CEEI/DSC
Oracle OR 11g <ul><li>O ORACLE 11g oferece diferentes tipos de objetos:  </li></ul><ul><ul><li>Tipos de Objetos (TADs) </l...
Oracle OR 11g <ul><li>Conceitos Básicos </li></ul><ul><ul><li>Tipo de Objeto </li></ul></ul><ul><ul><li>Método </li></ul><...
Relacional. Objeto-relacional  - Um banco de dados, tradicionalmente relacional, estendido para incluir os conceitos OO e ...
Exemplo - UML
Esquema Relacional Projeto BD Relacional
Esquema  Objeto  Relacional
Definindo os Tipos
Tipos de Objetos (Object Types) <ul><li>Tipo de objeto é um tipo abstrato de dados (TAD), ou seja um Structured Type em SQ...
<ul><li>Um Tipo  de Objeto é um esquema de objeto com 3 componentes:  </li></ul><ul><ul><li>Nome </li></ul></ul><ul><ul><l...
Tipos de Objetos <ul><li>Um tipo de objeto em Oracle possui a seguinte estrutura: </li></ul>
Tipos de Objetos <ul><li>Exemplo de especificação da interface pública de um objeto </li></ul><ul><li>Sintaxe resumida: </...
Tipos de Objetos <ul><li>Pode ser usado da mesma forma que é usado um tipo primitivo </li></ul><ul><li>EX: Para definir o ...
Tipos de objetos create type ENDERECO_TYP as object (rua  VARCHAR2(50),  cidade  VARCHAR2(25),  estado  CHAR(2),  cep  NUM...
Tipos de objetos Não é possível ocorrer uma inserção de dados em PESSOA_TYP. Isso porque um tipo de objeto descreve dados,...
Tipos de objetos Para armazenar dados é necessário a criação de uma tabela a partir de um tipo de objeto. create type PESS...
Exemplo <ul><li>CREATE TYPE person_typ AS OBJECT ( </li></ul><ul><li>idno NUMBER, </li></ul><ul><li>first_name VARCHAR2(20...
Exemplo (cont.) <ul><li>CREATE TYPE BODY person_typ  AS </li></ul><ul><li>MAP MEMBER FUNCTION get_idno RETURN NUMBER IS </...
Inserindo dados <ul><li>Ex.: </li></ul><ul><li>CREATE TABLE contacts ( </li></ul><ul><li>contact person_typ, </li></ul><ul...
Inserindo com NULL <ul><li>CREATE TABLE contacts ( </li></ul><ul><li>contact person_typ, </li></ul><ul><li>contact_date DA...
Constraints <ul><li>CREATE TABLE department_mgrs ( </li></ul><ul><li>dept_no NUMBER PRIMARY KEY, </li></ul><ul><li>dept_na...
Trigger em Objetos Tipados <ul><li>CREATE TABLE movement ( </li></ul><ul><li>idno NUMBER, </li></ul><ul><li>old_office loc...
Métodos <ul><li>São funções ou procedimentos que são declarados na definição de um tipo de objeto </li></ul><ul><li>Exigem...
Métodos <ul><li>Um object type sempre possui um construtor, pode possuir zero ou mais métodos membro e pode possuir um mét...
Métodos <ul><li>MEMBER </li></ul><ul><ul><li>São os métodos mais comuns </li></ul></ul><ul><ul><li>Implementam as operaçõe...
Ex. Member method <ul><li>CREATE TYPE solid_typ AS OBJECT ( </li></ul><ul><li>len INTEGER, </li></ul><ul><li>wth INTEGER, ...
Métodos <ul><li>Construtor </li></ul><ul><ul><li>Criado implicitamente ao criar um tipo de objeto </li></ul></ul><ul><ul><...
Static Method <ul><li>São invocados nos tipos de dados, não nas instâncias </li></ul><ul><li>Usados para operações que são...
Static Method - Exemplo <ul><li>CREATE TYPE atype AS OBJECT( </li></ul><ul><li>a1 NUMBER, </li></ul><ul><li>STATIC PROCEDU...
Métodos para Comparação de Objetos <ul><li>MAP ou ORDER </li></ul><ul><ul><li>São funções opcionais para comparar objetos ...
Métodos para Comparação de Objetos <ul><li>Exemplo de MAP </li></ul><ul><li>CREATE TYPE rectangle_typ AS OBJECT ( </li></u...
Métodos para Comparação de Objetos <ul><li>Exemplo de ORDER </li></ul><ul><li>CREATE TYPE location_typ AS OBJECT ( </li></...
Evolução de Tipos <ul><li>Uso do comando ALTER TYPE, permite modificar, ou evoluir, um tipo objeto : </li></ul><ul><li>Adi...
Evolução de Tipos <ul><li>EX:  </li></ul><ul><li>ALTER TYPE person_typ </li></ul><ul><li>ADD ATTRIBUTE ( sex VARCHAR2(1) )...
Herança de Tipos <ul><li>Suporta  herança simples </li></ul><ul><li>Há uma diferença do padrão SQL:1999, pois o Oracle não...
Herança de Tipos <ul><li>CREATE TYPE employee_typ  UNDER  person_typ( </li></ul><ul><li>depto_id NUMBER, </li></ul><ul><li...
Herança de Tipos – Drop Type <ul><ul><li>Não se pode remover um subtipo antes de remover suas respectivas instâncias na ta...
Herança de Tipos <ul><li>CREATE TYPE person_typ AS OBJECT ( </li></ul><ul><li>idno NUMBER, </li></ul><ul><li>name VARCHAR2...
Herança de Tipos <ul><li>CREATE TYPE professor_typ  </li></ul><ul><li>UNDER person_typ (  </li></ul><ul><li>dept_id NUMBER...
Overriding Method <ul><li>CREATE TYPE person_typ AS OBJECT ( </li></ul><ul><li>idno NUMBER, </li></ul><ul><li>name VARCHAR...
Overriding Method (cont.) <ul><li>CREATE TYPE BODY person_typ AS </li></ul><ul><li>MAP MEMBER FUNCTION get_idno RETURN NUM...
Overriding Method (cont.) <ul><li>CREATE TYPE student_typ UNDER person_typ ( dept_id NUMBER, major VARCHAR2(30), </li></ul...
Overriding Method (cont.) <ul><li>CREATE TYPE employee_typ UNDER person_typ ( </li></ul><ul><li>emp_id NUMBER, </li></ul><...
Overriding Method (cont.) <ul><li>CREATE TYPE part_time_student_typ UNDER student_typ ( </li></ul><ul><li>number_hours NUM...
Overriding Method (cont.) <ul><li>CREATE TABLE person_obj_table OF person_typ; </li></ul><ul><li>INSERT INTO person_obj_ta...
Overriding Method (cont.) <ul><li>SELECT p.show() FROM person_obj_table p; </li></ul><ul><li>Resultado : </li></ul><ul><li...
Restrições em Overriding methods <ul><li>Só se pode fazer overriding de métodos declarados NOT FINAL no supertipo </li></u...
Tabelas no ORACLE 11g <ul><li>Oracle11g suporta 2 tipos de tabelas: </li></ul><ul><ul><li>Tabela Relacional </li></ul></ul...
Tabela de objetos vs.  Tabela relacional <ul><li>Uma tabela de objetos difere de uma tabela relacional em vários aspectos:...
Tabela de objetos <ul><li>A  tabela de objetos PESSOAS pode ser vista como:  </li></ul><ul><li>Uma Tabela com uma única co...
Tabelas de Objetos <ul><li>Equivalentes às Tabelas Tipadas (Typed Tables) do SQL:1999 </li></ul><ul><li>São tabelas especi...
Manipulando tabelas de objetos   Existem diferenças significativas no modo de utilização de uma tabela de objetos.  Cada l...
Seleção em tabelas select  *   from PESSOAS; ============================================================ NOME  CPF  ENDER...
Seleção em tabelas SELECT VALUE (p) FROM PESSOAS p WHERE p.nome = ‘Maria Silva'; Resposta: VALUE(P)(NOME, CPF, ENDERECO(RU...
Seleção em tabelas SELECT  p.CPF FROM PESSOAS p WHERE  p.nome = ‘Maria Silva'; Resposta: CPF   ---------------------------...
Seleção em tabelas SELECT p.endereco FROM PESSOAS p  WHERE p.nome = ‘Maria Silva'; Resposta: ENDERECO(RUA, CIDADE, ESTADO,...
Seleção em tabelas select p.endereco.cidade from PESSOAS p where p.nome = ‘Maria Silva'; Resposta: ENDERECO.CIDADE -------...
Inserção de dados <ul><li>CREATE TABLE person_obj_table OF person_typ; </li></ul><ul><li>INSERT INTO person_obj_table VALU...
Inserção em tabelas de Objetos <ul><li>Inserção em PESSOAS como uma tabela de uma única coluna.  </li></ul><ul><li>-  Usa ...
Inserção usando substitutability <ul><li>CREATE TABLE contacts ( </li></ul><ul><li>contact person_typ, </li></ul><ul><li>c...
Desligando a substitutability <ul><li>CREATE TYPE office_typ AS OBJECT ( </li></ul><ul><li>office_id VARCHAR(10), </li></u...
Desligando a substitutability <ul><li>Uma alternativa à cláusula:  NOT SUBSTITUTABLE AT ALL LEVELS  é usar o operador  IS ...
Atualização e Remoção em tabelas de Objetos update PESSOAS p Set p.endereco= ENDERECO_TY(‘Rua das Margaridas 22',  ‘ Patos...
Identificadores de objetos <ul><li>Uma tabela de objetos contém uma coluna gerada pelo SGBD contendo o OID do “row object”...
Referenciando Objetos (REF) <ul><li>É um ponteiro lógico para um “Row Object” </li></ul><ul><li>Usado para fazer referênci...
REF <ul><li>CREATE TYPE emp_person_typ AS OBJECT ( </li></ul><ul><li>name VARCHAR2(30), </li></ul><ul><li>manager REF emp_...
REF <ul><li>CREATE OR REPLACE TYPE tp_cliente as OBJECT( </li></ul><ul><li>cod_cli VARCHAR (3), </li></ul><ul><li>nome_cli...
REF <ul><li>INSERT INTO tb_cliente VALUES (‘C1’, ‘Rita’); </li></ul><ul><li>INSERT INTO tb_cliente VALUES (‘C2’, ‘Ana’); <...
REF <ul><li>SELECT *  FROM tb_dependente D; </li></ul><ul><li>COD_DEP NM_DEP REF_TITULAR </li></ul><ul><li>---------------...
REF <ul><li>SELECT REF(D) </li></ul><ul><li>FROM tb_dependente D </li></ul><ul><li>WHERE D. nm_dep = ‘Paulo’; </li></ul><u...
REF <ul><li>SELECT D.ref_titular.cod_cli cod_cliente, </li></ul><ul><li>D.ref_titular.nm_cli nm_cliente, </li></ul><ul><li...
Dangling REF <ul><li>Verificando a validade das referências (Dangling) </li></ul><ul><li>EX: </li></ul><ul><li>DELETE FROM...
Dangling REF <ul><li>Verificando a validade das referências (Dangling) </li></ul><ul><li>SELECT D.ref_titular.cod_cli cod_...
Dangling REF <ul><li>Verificando a validade das referências (Dangling) </li></ul><ul><li>SELECT D.ref_titular.cod_cli cod_...
Dangling  != NULL <ul><li>SELECT D.ref_titular.cod_cli cod_cliente, </li></ul><ul><li>D.ref_titular.nm_cli nm_cliente, </l...
SCOPED REF <ul><li>CREATE TABLE contacts_ref ( </li></ul><ul><li>contact_ref REF person_typ SCOPE IS person_obj_table, </l...
Integridade Referencial em REF <ul><li>Utiliza-se uma sintaxe semelhante ao FOREIGN KEY do modelo relacional </li></ul><ul...
DEREF <ul><li>O operador DEREF “desfaz” o REF </li></ul><ul><li>Retorna um objeto referenciado por uma coluna do tipo REF ...
DEREF <ul><li>Ex.: </li></ul><ul><li>SELECT DEREF(D.ref_titular) deref_titular, </li></ul><ul><li>D.nm_dep nm_dependente <...
DEREF <ul><li>EX. (sem usar DEREF): </li></ul><ul><li>SELECT D.ref_titular sem_deref, </li></ul><ul><li>D.nm_dep nm_depend...
VALUE <ul><li>Exibe os dados das instâncias dos objetos </li></ul><ul><li>Usa o mesmo formato que DEREF </li></ul><ul><li>...
Referenciando Objetos EMPREGADO_TY DEPARTAMENTO_TY depto create table  EMPREGADOS   (Nome  VARCHAR2(25),  CPF  NUMBER,  de...
Tipo REF <ul><li>Um objeto do tipo REF encapsula uma referência para um “row object” de um tipo de objeto especificado;  <...
Selecionando dados de um tipo específico <ul><li>Ex.: Pega subtipo student_t e seus respectivos subtipos </li></ul><ul><li...
TREAT <ul><li>Função que permite tratar um supertipo como subtipo. </li></ul><ul><li>Ex.: tratar person como student </li>...
Coleções <ul><li>Oracle dá suporte a: </li></ul><ul><ul><li>VARRAY: coleção ordenada de elementos, com número fixo de elem...
VARRAYS <ul><li>É um conjunto ordenado de elementos </li></ul><ul><li>Todos os elementos do VARRAY são do mesmo tipo de da...
VARRAYS <ul><li>Ex.1 . : </li></ul><ul><li>CREATE TYPE email_list_arr AS VARRAY(10) OF VARCHAR2(80); </li></ul><ul><li>Ex ...
VARRAY <ul><li>Modificando o tamanho de um elemento do varray </li></ul><ul><li>CREATE TYPE email_list_arr AS VARRAY(10) O...
VARRAY <ul><li>Modificando o tamanho do Varray </li></ul><ul><li>CREATE TYPE email_list_arr AS VARRAY(10) OF VARCHAR2(80);...
Nested Table <ul><li>É um conjunto não ordenado de elementos, cada um do mesmo tipo de dados </li></ul><ul><li>Não há núme...
Nested Table (exemplo) <ul><li>CREATE TYPE people_typ AS TABLE OF person_typ; </li></ul><ul><li>CREATE TABLE people_tab ( ...
Nested Table (exemplo) <ul><li>CREATE TABLE students ( </li></ul><ul><li>graduation DATE, </li></ul><ul><li>math_majors pe...
Coleções Multi-dimensionais <ul><li>Podemos ter: </li></ul><ul><ul><li>Nested table de nested table type </li></ul></ul><u...
Coleções Multi-dimensionais <ul><li>CREATE TYPE location_typ AS OBJECT ( </li></ul><ul><li>location_id NUMBER(4), </li></u...
Coleções Multi-dimensionais <ul><li>INSERT INTO region_tab </li></ul><ul><li>VALUES(1, 'Europe', nt_country_typ( </li></ul...
Operações em coleções <ul><li>Existem duas formas de se realizar uma consulta em colunas com coleções: </li></ul><ul><ul><...
Operações em coleções <ul><li>Consultas com resultado aninhado: </li></ul><ul><li>SELECT d.dept_emps </li></ul><ul><li>FRO...
Operações em coleções <ul><li>Consultas com resultado desaninhado: </li></ul><ul><li>SELECT e.* </li></ul><ul><li>FROM dep...
Operações em coleções <ul><li>Query que resulta linhas de departamentos que possuem empregados </li></ul><ul><li>SELECT d....
Operações em coleções <ul><li>Mesma query anterior mas que mostra também departamentos sem empregados (outer join) </li></...
Operações em coleções <ul><li>SELECT * </li></ul><ul><li>FROM TABLE( </li></ul><ul><li>SELECT d.dept_emps </li></ul><ul><l...
Consulta em multi-coleções <ul><li>Ex11: </li></ul><ul><li>SELECT r.region_name, c.country_name, l.location_id </li></ul><...
Operações em coleções <ul><li>Inserção </li></ul><ul><li>INSERT INTO TABLE(SELECT d.dept_emps </li></ul><ul><li>FROM depar...
Operações em coleções <ul><li>Atualização </li></ul><ul><li>UPDATE TABLE(SELECT d.dept_emps </li></ul><ul><li>FROM departm...
Operações em coleções <ul><li>Remoção </li></ul><ul><li>DELETE FROM TABLE(SELECT d.dept_emps </li></ul><ul><li>FROM depart...
Object Views <ul><li>São tabelas de objetos (object table) virtuais </li></ul><ul><li>Cada linha (row) da Object View é um...
Criando uma Object View <ul><li>CREATE TABLE emp_table ( </li></ul><ul><li>empnum NUMBER (5), </li></ul><ul><li>ename VARC...
Criando uma Object View – EX.2 <ul><li>CREATE TABLE dept ( </li></ul><ul><li>deptno NUMBER PRIMARY KEY, </li></ul><ul><li>...
Criando uma referência a Objetos numa View <ul><li>CREATE TYPE emp_t AS OBJECT ( </li></ul><ul><li>empno NUMBER, </li></ul...
Ex. De consulta à view anterior <ul><li>SELECT e.empno, e.salary, e.deptref.deptno </li></ul><ul><li>FROM emp_view e </li>...
Outra forma de definir a View <ul><li>CREATE OR REPLACE VIEW emp_view OF emp_t WITH OBJECT IDENTIFIER(empno) </li></ul><ul...
Atualizando Object Views <ul><li>Oracle permite, se não houver ambiguidade, realizar update, delete e insert em Object Vie...
Atualizando Object Views <ul><li>Ex.:  DELETE FROM Person_v; remove de Person_v, Student-V e Employee_v </li></ul><ul><li>...
Criando INSTEAD OF  Triggers numa View <ul><li>- Número de empregados um Departamento não pode exceder 10 </li></ul><ul><l...
Ex. De Hierarquia de Views <ul><li>CREATE TABLE AllPersons </li></ul><ul><li>( typeid NUMBER(1), </li></ul><ul><li>ssn NUM...
Ex. De Hierarquia de Views <ul><li>CREATE TYPE person_typ AS OBJECT </li></ul><ul><li>( ssn NUMBER, </li></ul><ul><li>name...
Ex. De Hierarquia de Views <ul><li>CREATE VIEW Person_v OF person_typ </li></ul><ul><li>WITH OBJECT OID(ssn) AS </li></ul>...
Consultando Object Views <ul><li>SELECT REF(p), VALUE(p) FROM Person_v p; </li></ul><ul><li>SELECT * FROM Person_v; </li><...
Próximos SlideShares
Carregando em…5
×

Unidade4.1 Oracle Or

2.128 visualizações

Publicada em

Publicada em: Tecnologia, Negócios
  • Seja o primeiro a comentar

Unidade4.1 Oracle Or

  1. 1. Unidade 4.1: BDOR – Oracle 11g Banco de Dados II – 2009.2 Prof. Cláudio de Souza Baptista, Ph.D. UFCG/CEEI/DSC
  2. 2. Oracle OR 11g <ul><li>O ORACLE 11g oferece diferentes tipos de objetos: </li></ul><ul><ul><li>Tipos de Objetos (TADs) </li></ul></ul><ul><ul><li>Nested Tables (Tabelas aninhadas) </li></ul></ul><ul><ul><li>VArrays (Varying Arrays) </li></ul></ul><ul><ul><li>Large Objects (LOBs) </li></ul></ul><ul><ul><li>References (REF) </li></ul></ul><ul><ul><li>Object View (Visão de Objetos) </li></ul></ul><ul><li>No entanto, há algumas diferenças com o padrã SQL:1999 </li></ul>
  3. 3. Oracle OR 11g <ul><li>Conceitos Básicos </li></ul><ul><ul><li>Tipo de Objeto </li></ul></ul><ul><ul><li>Método </li></ul></ul><ul><ul><li>Evolução de Tipo </li></ul></ul><ul><ul><li>Herança de Tipo </li></ul></ul><ul><ul><li>Tabela de Objeto </li></ul></ul><ul><ul><li>Objeto de Linha e Objeto de Coluna </li></ul></ul><ul><ul><li>Referência de Objeto </li></ul></ul><ul><ul><li>Coleção de Objetos </li></ul></ul>
  4. 4. Relacional. Objeto-relacional - Um banco de dados, tradicionalmente relacional, estendido para incluir os conceitos OO e estruturas como tipos de dados abstratos, nested tables e varying arrays. Orientado a objetos - Um banco de dados orientado a objetos cujo projeto é, desde o seu início, desenvolvido com análise orientada a objetos. O ORACLE 11g fornece um suporte completo para todos os três diferentes tipos de implementação: Oracle OR 11g
  5. 5. Exemplo - UML
  6. 6. Esquema Relacional Projeto BD Relacional
  7. 7. Esquema Objeto Relacional
  8. 8. Definindo os Tipos
  9. 9. Tipos de Objetos (Object Types) <ul><li>Tipo de objeto é um tipo abstrato de dados (TAD), ou seja um Structured Type em SQL:1999 </li></ul><ul><li>TAD é um tipo de dado definido pelo usuário que encapsula propriedades (atributos) e comportamento (métodos) </li></ul><ul><li>Corresponde ao “Molde” de um objeto </li></ul><ul><li>Não aloca espaço de armazenamento </li></ul><ul><li>Não pode armazenar dados </li></ul>
  10. 10. <ul><li>Um Tipo de Objeto é um esquema de objeto com 3 componentes: </li></ul><ul><ul><li>Nome </li></ul></ul><ul><ul><li>Atributos </li></ul></ul><ul><ul><li>Métodos </li></ul></ul><ul><li>Um tipo de objeto pode ser usado para: </li></ul><ul><ul><li>Definir o domínio de atributos (“column object”) de tabelas </li></ul></ul><ul><ul><li>Definir o tipo dos atributos de TADs ( “embedded object”) </li></ul></ul><ul><ul><li>Criar uma tabela de objetos </li></ul></ul>Tipos de Objetos
  11. 11. Tipos de Objetos <ul><li>Um tipo de objeto em Oracle possui a seguinte estrutura: </li></ul>
  12. 12. Tipos de Objetos <ul><li>Exemplo de especificação da interface pública de um objeto </li></ul><ul><li>Sintaxe resumida: </li></ul><ul><li>CREATE [OR REPLACE] TYPE nome_tipo AS OBJECT ( </li></ul><ul><li>[lista de atributos] </li></ul><ul><li>[lista de métodos] </li></ul><ul><li>); </li></ul>
  13. 13. Tipos de Objetos <ul><li>Pode ser usado da mesma forma que é usado um tipo primitivo </li></ul><ul><li>EX: Para definir o tipo de um atributo de uma tabela </li></ul><ul><li>CREATE TABLE tb_contatos ( </li></ul><ul><li>contato tp_pessoa, </li></ul><ul><li>dt_contato DATE ); </li></ul><ul><li>CREATE TABLE tb_domicilio ( </li></ul><ul><li>local tp_ponto, </li></ul><ul><li>endereco VARCHAR2 (80) ); </li></ul><ul><li>-- Para definir o tipo de um atributo de um TAD </li></ul><ul><li>CREATE TYPE tp_contatos AS OBJECT ( </li></ul><ul><li>contato tp_ pessoa, </li></ul><ul><li>dt_contato DATE ); </li></ul><ul><li>CREATE TYPE tp_domicilio AS OBJECT ( </li></ul><ul><li>local tp_ponto, </li></ul><ul><li>endereco VARCHAR2 (80) ); </li></ul>
  14. 14. 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
  15. 15. Tipos de objetos Não é possível ocorrer uma inserção de dados em PESSOA_TYP. Isso porque um tipo de objeto descreve dados, mas não os armazena. 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
  16. 16. Tipos de objetos Para armazenar dados é necessário a criação de uma tabela a partir de um tipo de objeto. create type PESSOA_TY as object (Nome VARCHAR2(25), CPF NUMBER, Endereco ENDERECO_TY); create table PESSOAS of PESSOA_TY (CPF primary key ); A tabela PESSOAS irá armazenar dados com a estrutura do tipo PESSOA_TY
  17. 17. Exemplo <ul><li>CREATE TYPE person_typ AS OBJECT ( </li></ul><ul><li>idno NUMBER, </li></ul><ul><li>first_name VARCHAR2(20), </li></ul><ul><li>last_name VARCHAR2(25), </li></ul><ul><li>email VARCHAR2(25), </li></ul><ul><li>phone VARCHAR2(20), </li></ul><ul><li>MAP MEMBER FUNCTION get_idno RETURN NUMBER, </li></ul><ul><li>MEMBER PROCEDURE display_details ( SELF IN OUT NOCOPY person_typ )); </li></ul>
  18. 18. Exemplo (cont.) <ul><li>CREATE TYPE BODY person_typ AS </li></ul><ul><li>MAP MEMBER FUNCTION get_idno RETURN NUMBER IS </li></ul><ul><li>BEGIN </li></ul><ul><li>RETURN idno; </li></ul><ul><li>END; </li></ul><ul><li>MEMBER PROCEDURE display_details ( SELF IN OUT NOCOPY person_typ ) IS </li></ul><ul><li>BEGIN </li></ul><ul><li>-- use the PUT_LINE procedure of the DBMS_OUTPUT package to display details </li></ul><ul><li>DBMS_OUTPUT.PUT_LINE(TO_CHAR(idno) || ' ' || first_name || ' ' || last_name); </li></ul><ul><li>DBMS_OUTPUT.PUT_LINE(email || ' ' || phone); </li></ul><ul><li>END; </li></ul><ul><li>END; </li></ul>
  19. 19. Inserindo dados <ul><li>Ex.: </li></ul><ul><li>CREATE TABLE contacts ( </li></ul><ul><li>contact person_typ, </li></ul><ul><li>contact_date DATE ); </li></ul><ul><li>INSERT INTO contacts VALUES ( </li></ul><ul><li>person_typ (65, 'Verna', 'Mills', 'vmills@oracle.com', '1-800-555-4412'), '24 Jun 2003' ); </li></ul>
  20. 20. Inserindo com NULL <ul><li>CREATE TABLE contacts ( </li></ul><ul><li>contact person_typ, </li></ul><ul><li>contact_date DATE ); </li></ul><ul><li>INSERT INTO contacts VALUES (p erson_typ (NULL, NULL, NULL), '24 Jun 2003' ); </li></ul><ul><li>INSERT INTO contacts VALUES (NULL, '24 Jun 2003' ); </li></ul>
  21. 21. Constraints <ul><li>CREATE TABLE department_mgrs ( </li></ul><ul><li>dept_no NUMBER PRIMARY KEY, </li></ul><ul><li>dept_name CHAR(20), </li></ul><ul><li>dept_mgr person_typ, </li></ul><ul><li>dept_loc location_typ, </li></ul><ul><li>CONSTRAINT dept_loc_cons1 </li></ul><ul><li>UNIQUE (dept_loc.building_no, dept_loc.city), </li></ul><ul><li>CONSTRAINT dept_loc_cons2 CHECK (dept_loc.city IS NOT NULL) ); </li></ul><ul><li>INSERT INTO department_mgrs VALUES </li></ul><ul><li>( 101, 'Physical Sciences', </li></ul><ul><li>person_typ(65,'Vrinda Mills', '1-800-555-4412'), </li></ul><ul><li>location_typ(300, 'Palo Alto')); </li></ul>
  22. 22. Trigger em Objetos Tipados <ul><li>CREATE TABLE movement ( </li></ul><ul><li>idno NUMBER, </li></ul><ul><li>old_office location_typ, </li></ul><ul><li>new_office location_typ ); </li></ul><ul><li>CREATE TRIGGER trigger1 </li></ul><ul><li>BEFORE UPDATE OF office_loc ON office_tab </li></ul><ul><li>FOR EACH ROW </li></ul><ul><li>WHEN (new.office_loc.city = 'Redwood Shores') </li></ul><ul><li>BEGIN </li></ul><ul><li>IF :new.office_loc.building_no = 600 THEN </li></ul><ul><li>INSERT INTO movement (idno, old_office, new_office) </li></ul><ul><li>VALUES (:old.occupant.idno, :old.office_loc, :new.office_loc); </li></ul><ul><li>END IF; </li></ul><ul><li>END; </li></ul><ul><li>OBS.: Não se pode modificar colunas do tipo LOB no corpo de um trigger! </li></ul>
  23. 23. Métodos <ul><li>São funções ou procedimentos que são declarados na definição de um tipo de objeto </li></ul><ul><li>Exigem o uso de parênteses (mesmo sem parâmetros) </li></ul><ul><li>O uso de ( ) é para diferenciar o método de um procedimento ou função comum </li></ul><ul><li>Podem ser </li></ul><ul><ul><li>MEMBER ou STATIC </li></ul></ul><ul><ul><li>MAP ou ORDER (para ordenação) </li></ul></ul><ul><ul><li>Construtor </li></ul></ul>
  24. 24. Métodos <ul><li>Um object type sempre possui um construtor, pode possuir zero ou mais métodos membro e pode possuir um método map ou um método order, porém não os dois </li></ul><ul><li>Ex.: Chamada de método </li></ul><ul><li>SELECT c.contact.get_idno() </li></ul><ul><li>FROM contacts c; </li></ul>
  25. 25. Métodos <ul><li>MEMBER </li></ul><ul><ul><li>São os métodos mais comuns </li></ul></ul><ul><ul><li>Implementam as operações das instâncias do tipo </li></ul></ul><ul><ul><li>São invocados através da qualificação de objeto objeto.método() </li></ul></ul><ul><ul><li>SELF não precisa ser declarado, mas pode ser e deverá ser sempre o primeiro parâmetro </li></ul></ul>
  26. 26. Ex. Member method <ul><li>CREATE TYPE solid_typ AS OBJECT ( </li></ul><ul><li>len INTEGER, </li></ul><ul><li>wth INTEGER, </li></ul><ul><li>hgt INTEGER, </li></ul><ul><li>MEMBER FUNCTION surface RETURN INTEGER, </li></ul><ul><li>MEMBER FUNCTION volume RETURN INTEGER, </li></ul><ul><li>MEMBER PROCEDURE display (SELF IN OUT NOCOPY solid_typ) ); </li></ul><ul><li>CREATE TYPE BODY solid_typ AS </li></ul><ul><li>MEMBER FUNCTION volume RETURN INTEGER IS </li></ul><ul><li>BEGIN </li></ul><ul><li>RETURN len * wth * hgt; </li></ul><ul><li>-- RETURN SELF.len * SELF.wth * SELF.hgt; -- equivalent to previous line </li></ul><ul><li>END; </li></ul><ul><li>MEMBER FUNCTION surface RETURN INTEGER IS </li></ul><ul><li>BEGIN -- not necessary to include SELF prefix in following line </li></ul><ul><li>RETURN 2 * (len * wth + len * hgt + wth * hgt); </li></ul><ul><li>END; </li></ul><ul><li>MEMBER PROCEDURE display (SELF IN OUT NOCOPY solid_typ) IS </li></ul><ul><li>BEGIN </li></ul><ul><li>DBMS_OUTPUT.PUT_LINE('Length: ' || len || ' - ' || 'Width: ' || wth || ' - ' || 'Height: ' || hgt); </li></ul><ul><li> DBMS_OUTPUT.PUT_LINE('Volume: ' || volume || ' - ' || 'Surface area: ‘ || surface); </li></ul><ul><li>END; </li></ul><ul><li>END; </li></ul>
  27. 27. Métodos <ul><li>Construtor </li></ul><ul><ul><li>Criado implicitamente ao criar um tipo de objeto </li></ul></ul><ul><ul><li>Deve ser exatamente igual ao nome do tipo </li></ul></ul><ul><ul><li>Pode haver mais de um construtor </li></ul></ul><ul><ul><li>EX: </li></ul></ul><ul><li>INSERT INTO tb_contatos VALUES ( </li></ul><ul><li>Person_typ (65, ‘Pedro', ‘Medeiros', ‘pm@hotmail.com', '83-3337-3333'), ‘12 Mai 2005' ); </li></ul>
  28. 28. Static Method <ul><li>São invocados nos tipos de dados, não nas instâncias </li></ul><ul><li>Usados para operações que são globais ao tipo e não precisam se reportar a uma instância particular </li></ul><ul><li>Não possui parâmetro SELF </li></ul><ul><li>Invocado da seguinte forma: type_name.method() </li></ul>
  29. 29. Static Method - Exemplo <ul><li>CREATE TYPE atype AS OBJECT( </li></ul><ul><li>a1 NUMBER, </li></ul><ul><li>STATIC PROCEDURE newa ( p1 NUMBER, tabname VARCHAR2, </li></ul><ul><li>schname VARCHAR2)); </li></ul><ul><li>CREATE TYPE BODY atype AS </li></ul><ul><li>STATIC PROCEDURE newa (p1 NUMBER, tabname VARCHAR2, schname VARCHAR2) IS </li></ul><ul><li>sqlstmt VARCHAR2(100); </li></ul><ul><li>BEGIN </li></ul><ul><li>sqlstmt := 'INSERT INTO '||schname||'.'||tabname|| ' VALUES (atype(:1))'; </li></ul><ul><li>EXECUTE IMMEDIATE sqlstmt USING p1; </li></ul><ul><li>END; </li></ul><ul><li>END; </li></ul><ul><li>CREATE TABLE atab OF atype; </li></ul><ul><li>BEGIN </li></ul><ul><li>atype.newa(1, 'atab', 'HR'); </li></ul><ul><li>END; </li></ul>
  30. 30. Métodos para Comparação de Objetos <ul><li>MAP ou ORDER </li></ul><ul><ul><li>São funções opcionais para comparar objetos </li></ul></ul><ul><ul><li>São mutuamente exclusivos! </li></ul></ul><ul><ul><li>Por default o ORACLE implementa a comparação STATE do SQL:1999 (que indica se um objeto é igual ou não de outro baseado na comparação de cada atributo) </li></ul></ul><ul><ul><li>ORDER </li></ul></ul><ul><ul><ul><li>Implementa o RELATIVE WITH do SQL:1999, retornando negativo, zero ou positivo </li></ul></ul></ul><ul><ul><ul><li>exige como parâmetro um obj. do mesmo tipo </li></ul></ul></ul><ul><ul><ul><li>ORDER compara o obj. corrente com o obj. do parâmetro </li></ul></ul></ul><ul><ul><li>MAP </li></ul></ul><ul><ul><ul><li>Implementa MAP do SQL:1999, retornando um valor de tipo built-in </li></ul></ul></ul><ul><ul><ul><li>não exige parâmetro </li></ul></ul></ul><ul><ul><ul><li>MAP compara vários objetos (ex: ORDER BY) </li></ul></ul></ul>
  31. 31. Métodos para Comparação de Objetos <ul><li>Exemplo de MAP </li></ul><ul><li>CREATE TYPE rectangle_typ AS OBJECT ( </li></ul><ul><li>len NUMBER, </li></ul><ul><li>wid NUMBER, </li></ul><ul><li>MAP MEMBER FUNCTION area RETURN NUMBER); </li></ul><ul><li>CREATE TYPE BODY rectangle_typ AS </li></ul><ul><li>MAP MEMBER FUNCTION area RETURN NUMBER IS </li></ul><ul><li>BEGIN </li></ul><ul><li>RETURN len * wid; </li></ul><ul><li>END area; </li></ul><ul><li>END; </li></ul>
  32. 32. Métodos para Comparação de Objetos <ul><li>Exemplo de ORDER </li></ul><ul><li>CREATE TYPE location_typ AS OBJECT ( </li></ul><ul><li>building_no NUMBER, </li></ul><ul><li>city VARCHAR2(40), </li></ul><ul><li>ORDER MEMBER FUNCTION match (l location_typ) RETURN INTEGER ); </li></ul><ul><li>CREATE TYPE BODY location_typ AS </li></ul><ul><li>ORDER MEMBER FUNCTION match (l location_typ) RETURN INTEGER IS </li></ul><ul><li>BEGIN </li></ul><ul><li>IF building_no < l.building_no THEN </li></ul><ul><li>RETURN -1; -- qualquer número negativo </li></ul><ul><li>ELSIF building_no > l.building_no THEN </li></ul><ul><li>RETURN 1; -- qualquer número positivo </li></ul><ul><li>ELSE RETURN 0; </li></ul><ul><li>END IF; </li></ul><ul><li>END; </li></ul><ul><li>END; </li></ul>
  33. 33. Evolução de Tipos <ul><li>Uso do comando ALTER TYPE, permite modificar, ou evoluir, um tipo objeto : </li></ul><ul><li>Adicionar e remover atributos </li></ul><ul><li>Adicionar e remover métodos </li></ul><ul><li>Modificar um atributo numérico para aumentar o length, precision, ou scale </li></ul><ul><li>Modicar um atributo string para aumentar seu length </li></ul><ul><li>Mudar propriedades FINAL e INSTANTIABLE do tipo </li></ul>
  34. 34. Evolução de Tipos <ul><li>EX: </li></ul><ul><li>ALTER TYPE person_typ </li></ul><ul><li>ADD ATTRIBUTE ( sex VARCHAR2(1) ) CASCADE ; </li></ul><ul><li>ALTER TYPE person_typ </li></ul><ul><li>DROP MAP MEMBER FUNCTION get_id RETURN NUMBER; </li></ul><ul><li>ALTER TYPE person_typ NOT FINAL CASCADE; </li></ul><ul><li>ALTER TYPE person_typ </li></ul><ul><li>MODIFY ATTRIBUTE sex VARCHAR2(10) CASCADE ; </li></ul><ul><li>OBS.: </li></ul><ul><ul><li>CASCADE: propaga a mudança para todos os tipos dependentes </li></ul></ul>
  35. 35. Herança de Tipos <ul><li>Suporta herança simples </li></ul><ul><li>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, embora menos flexível </li></ul><ul><li>Permite criar uma hierarquia de sub-tipos especializados </li></ul><ul><li>Os tipos derivados (sub-tipos) herdam os atributos e métodos dos tipos ancestrais (super-tipos) </li></ul><ul><li>Os sub-tipos podem acrescentar novos atributos ou métodos e/ou redefinir os métodos dos super-tipos </li></ul>
  36. 36. Herança de Tipos <ul><li>CREATE TYPE employee_typ UNDER person_typ( </li></ul><ul><li>depto_id NUMBER, </li></ul><ul><li>funcao VARCHAR2(30), </li></ul><ul><li>salario NUMBER </li></ul><ul><li>) NOT FINAL; </li></ul><ul><li>OBS.: Por default um tipo de objeto é FINAL! </li></ul>
  37. 37. Herança de Tipos – Drop Type <ul><ul><li>Não se pode remover um subtipo antes de remover suas respectivas instâncias na tabela que armazena as tuplas daquele subtipo (substitutability) </li></ul></ul><ul><ul><li>Ex.: Drop Type incorreto </li></ul></ul><ul><ul><li> DROP TYPE student_typ VALIDATE </li></ul></ul><ul><ul><li>Correto seria: </li></ul></ul><ul><ul><ul><li>DELETE FROM person_obj_table WHERE p IS OF (student_typ); </li></ul></ul></ul><ul><ul><ul><li>DROP TYPE student_typ VALIDATE; </li></ul></ul></ul>
  38. 38. Herança de Tipos <ul><li>CREATE TYPE person_typ AS OBJECT ( </li></ul><ul><li>idno NUMBER, </li></ul><ul><li>name VARCHAR2(30), </li></ul><ul><li>phone VARCHAR2(20), </li></ul><ul><li>FINAL MAP MEMBER FUNCTION get_idno RETURN NUMBER) </li></ul><ul><li>NOT FINAL; </li></ul>
  39. 39. Herança de Tipos <ul><li>CREATE TYPE professor_typ </li></ul><ul><li>UNDER person_typ ( </li></ul><ul><li>dept_id NUMBER, </li></ul><ul><li>speciality VARCHAR2(30)) </li></ul><ul><li>NOT FINAL; </li></ul>
  40. 40. Overriding Method <ul><li>CREATE TYPE person_typ AS OBJECT ( </li></ul><ul><li>idno NUMBER, </li></ul><ul><li>name VARCHAR2(30), </li></ul><ul><li>phone VARCHAR2(20), </li></ul><ul><li>MAP MEMBER FUNCTION get_idno RETURN NUMBER, </li></ul><ul><li>STATIC FUNCTION show_super (person_obj in person_typ) RETURN VARCHAR2, </li></ul><ul><li>MEMBER FUNCTION show RETURN VARCHAR2) </li></ul><ul><li>NOT FINAL; </li></ul>
  41. 41. Overriding Method (cont.) <ul><li>CREATE TYPE BODY person_typ AS </li></ul><ul><li>MAP MEMBER FUNCTION get_idno RETURN NUMBER IS </li></ul><ul><li>BEGIN </li></ul><ul><li>RETURN idno; </li></ul><ul><li>END; </li></ul><ul><li>-- static function that can be called by subtypes </li></ul><ul><li>STATIC FUNCTION show_super (person_obj in person_typ) RETURN VARCHAR2 IS </li></ul><ul><li>BEGIN </li></ul><ul><li>RETURN 'Id: ' || TO_CHAR(person_obj.idno) || ', Name: ' || person_obj.name; </li></ul><ul><li>END; </li></ul><ul><li>-- function that can be overriden by subtypes </li></ul><ul><li>MEMBER FUNCTION show RETURN VARCHAR2 IS </li></ul><ul><li>BEGIN </li></ul><ul><li>RETURN person_typ.show_super ( SELF ); </li></ul><ul><li>END; </li></ul><ul><li>END; </li></ul>
  42. 42. Overriding Method (cont.) <ul><li>CREATE TYPE student_typ UNDER person_typ ( dept_id NUMBER, major VARCHAR2(30), </li></ul><ul><li>OVERRIDING MEMBER FUNCTION show RETURN VARCHAR2) </li></ul><ul><li>NOT FINAL; </li></ul><ul><li>CREATE TYPE BODY student_typ AS </li></ul><ul><li>OVERRIDING MEMBER FUNCTION show RETURN VARCHAR2 IS </li></ul><ul><li>BEGIN </li></ul><ul><li>RETURN person_typ.show_super ( SELF ) || ' -- Major: ' || major ; </li></ul><ul><li>END; </li></ul><ul><li>END; </li></ul>
  43. 43. Overriding Method (cont.) <ul><li>CREATE TYPE employee_typ UNDER person_typ ( </li></ul><ul><li>emp_id NUMBER, </li></ul><ul><li>mgr VARCHAR2(30), </li></ul><ul><li>OVERRIDING MEMBER FUNCTION show RETURN VARCHAR2); </li></ul><ul><li>CREATE TYPE BODY employee_typ AS </li></ul><ul><li>OVERRIDING MEMBER FUNCTION show RETURN VARCHAR2 IS </li></ul><ul><li>BEGIN </li></ul><ul><li>RETURN person_typ.show_super ( SELF ) || ' -- Employee Id: ' </li></ul><ul><li>|| TO_CHAR(emp_id) || ', Manager: ' || mgr ; </li></ul><ul><li>END; </li></ul><ul><li>END; </li></ul>
  44. 44. Overriding Method (cont.) <ul><li>CREATE TYPE part_time_student_typ UNDER student_typ ( </li></ul><ul><li>number_hours NUMBER, </li></ul><ul><li>OVERRIDING MEMBER FUNCTION show RETURN VARCHAR2); </li></ul><ul><li>CREATE TYPE BODY part_time_student_typ AS </li></ul><ul><li>OVERRIDING MEMBER FUNCTION show RETURN VARCHAR2 IS </li></ul><ul><li>BEGIN </li></ul><ul><li>RETURN person_typ.show_super ( SELF ) || ' -- Major: ' || major || ', Hours: ' || TO_CHAR(number_hours); </li></ul><ul><li>END; </li></ul><ul><li>END; </li></ul>
  45. 45. Overriding Method (cont.) <ul><li>CREATE TABLE person_obj_table OF person_typ; </li></ul><ul><li>INSERT INTO person_obj_table </li></ul><ul><li>VALUES (person_typ(12, 'Bob Jones', '111-555-1212')); </li></ul><ul><li>INSERT INTO person_obj_table </li></ul><ul><li>VALUES (student_typ(51, 'Joe Lane', '1-800-555-1312', 12, 'HISTORY')); </li></ul><ul><li>INSERT INTO person_obj_table </li></ul><ul><li>VALUES (employee_typ(55, 'Jane Smith', '1-800-555-7765', </li></ul><ul><li>100, 'Jennifer Nelson')); </li></ul><ul><li>INSERT INTO person_obj_table </li></ul><ul><li>VALUES (part_time_student_typ(52, 'Kim Patel', '1-800-555-1232', 14, 'PHYSICS', 20)); </li></ul>
  46. 46. Overriding Method (cont.) <ul><li>SELECT p.show() FROM person_obj_table p; </li></ul><ul><li>Resultado : </li></ul><ul><li>Id: 12, Name: Bob Jones </li></ul><ul><li>Id: 51, Name: Joe Lane -- Major: HISTORY </li></ul><ul><li>Id: 55, Name: Jane Smith -- Employee Id: 100, Manager: Jennifer Nelson </li></ul><ul><li>Id: 52, Name: Kim Patel -- Major: PHYSICS, Hours: 20 </li></ul>
  47. 47. Restrições em Overriding methods <ul><li>Só se pode fazer overriding de métodos declarados NOT FINAL no supertipo </li></ul><ul><li>Métodos ORDER só podem ser definidos na raiz da hierarquia de tipos, não podendo ser overriden </li></ul><ul><li>Um método STATIC (MEMBER) num subtipo não poder override um método MEMBER (STATIC) do supertipo </li></ul><ul><li>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 </li></ul>
  48. 48. Tabelas no ORACLE 11g <ul><li>Oracle11g suporta 2 tipos de tabelas: </li></ul><ul><ul><li>Tabela Relacional </li></ul></ul><ul><ul><li>Tabela de Objetos (Object Table) </li></ul></ul><ul><ul><ul><li>uma tabela de objetos é um tipo especial de tabela que lida com objetos (“row objects”) e fornece uma visão relacional dos atributos desses objetos. </li></ul></ul></ul><ul><li>Princípio da Substituição (herança de tipos): um a coluna ou row definidas do tipo t podem conter instâncias de quaisquer de seus subtipos. </li></ul>
  49. 49. Tabela de objetos vs. Tabela relacional <ul><li>Uma tabela de objetos difere de uma tabela relacional em vários aspectos: </li></ul><ul><li>Cada linha de uma tabela de objetos possui um identificador de objeto (OID), definido pelo ORACLE quando a linha é inserida na tabela; </li></ul><ul><li>Um OID é um ponteiro para um objeto “linha” (ROW Object); </li></ul><ul><li>As linhas ( row objects) de uma tabela de objetos podem ser referenciadas por outros objetos do banco de dados. </li></ul>
  50. 50. Tabela de objetos <ul><li>A tabela de objetos PESSOAS pode ser vista como: </li></ul><ul><li>Uma Tabela com uma única coluna: </li></ul><ul><ul><li>- cada linha é um objeto do tipo PESSOA. </li></ul></ul><ul><li>Uma Tabela com múltiplas colunas </li></ul><ul><ul><li>- Uma coluna para cada atributo do tipo PESSOA_TY </li></ul></ul>create type PESSOA_TY as object (Nome VARCHAR2(25), CPF NUMBER, Endereco ENDERECO_TY); create table PESSOAS of PESSOA_TY (CPF primary key );
  51. 51. Tabelas de Objetos <ul><li>Equivalentes às Tabelas Tipadas (Typed Tables) do SQL:1999 </li></ul><ul><li>São tabelas especiais onde cada linha armazena um objeto </li></ul><ul><li>Provê uma visão relacional desses objetos. </li></ul><ul><li>As linhas de uma tabela de objetos possuem um OID (object identifier) implícito (definido pelo ORACLE) </li></ul><ul><li>Os objetos de uma tabela de objetos podem ser referenciados (REF) por outros objetos </li></ul><ul><li>Nos comandos de manipulação de objetos utilizar aliases para as tabelas </li></ul>
  52. 52. Manipulando tabelas de objetos Existem diferenças significativas no modo de utilização de uma tabela de objetos. Cada linha dentro de uma tabela de objetos possuirá um OID, e essas linhas poderão ser referenciadas como objetos.
  53. 53. Seleção em tabelas select * from PESSOAS; ============================================================ NOME CPF ENDERECO(RUA, CIDADE, ESTADO, CEP) --------------------- ---------------- ---------------------------------------------------------------- Maria Silva 543875432 ENDERECO_TY(‘Rua das Flores 84', ‘Campina Grande', ‘PB', 58102324) <ul><li>Seleção em PESSOAS como uma tabela de múltiplas colunas. </li></ul>
  54. 54. Seleção em tabelas 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', 543875432, ENDERECO_TY(‘Rua das Flores 84', ‘Campina Grande', ‘PB', 58102324) <ul><li>Seleção em PESSOAS como uma tabela de uma de uma única coluna. </li></ul>
  55. 55. Seleção em tabelas SELECT p.CPF FROM PESSOAS p WHERE p.nome = ‘Maria Silva'; Resposta: CPF -------------------------------------------------------------- 543875432
  56. 56. Seleção em tabelas 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', 58102324)
  57. 57. Seleção em tabelas select p.endereco.cidade from PESSOAS p where p.nome = ‘Maria Silva'; Resposta: ENDERECO.CIDADE ------------------------- Campina Grande
  58. 58. Inserção de dados <ul><li>CREATE TABLE person_obj_table OF person_typ; </li></ul><ul><li>INSERT INTO person_obj_table VALUES ( </li></ul><ul><li>person_typ(101, 'John', 'Smith', 'jsmith@oracle.com', '1-800-555-1212') ); </li></ul><ul><li>SELECT VALUE(p) FROM person_obj_table p </li></ul><ul><li>WHERE p.last_name = 'Smith'; </li></ul><ul><li>DECLARE </li></ul><ul><li>person person_typ; </li></ul><ul><li>BEGIN -- PL/SQL block for selecting a person and displaying details </li></ul><ul><li>SELECT VALUE(p) INTO person FROM person_obj_table p WHERE p.idno = 101; </li></ul><ul><li>person.display_details(); </li></ul><ul><li>END; </li></ul>
  59. 59. Inserção em tabelas de Objetos <ul><li>Inserção em PESSOAS como uma tabela de uma única coluna. </li></ul><ul><li>- Usa o método construtor PESSOA_TY que constrói novos objetos do tipo PESSOA_TY. </li></ul>INSERT INTO PESSOAS VALUES (PESSOA_TY(‘Maria Silva', 543875432, ENDERECO_TY(‘Rua das Flores 84', ‘Campina Grande', ‘PB', 58102324)) Métodos construtores para os tipos PESSOA_TY e ENDERECO_TY . O nome do método construtor tem o mesmo nome do tipo.
  60. 60. Inserção usando substitutability <ul><li>CREATE TABLE contacts ( </li></ul><ul><li>contact person_typ, </li></ul><ul><li>contact_date DATE ); </li></ul><ul><li>INSERT INTO contacts </li></ul><ul><li>VALUES (person_typ (12, 'Bob Jones', '111-555-1212'), '24 Jun 2003' ); </li></ul><ul><li>INSERT INTO contacts </li></ul><ul><li>VALUES (student_typ(51, 'Joe Lane', '1-800-555-1312', 12, 'HISTORY'), '24 Jun 2003' ); </li></ul><ul><li>INSERT INTO contacts </li></ul><ul><li>VALUES (part_time_student_typ(52, 'Kim Patel', '1-800-555-1232', 14, 'PHYSICS', 20), '24 Jun 2003' ); </li></ul>
  61. 61. Desligando a substitutability <ul><li>CREATE TYPE office_typ AS OBJECT ( </li></ul><ul><li>office_id VARCHAR(10), </li></ul><ul><li>location location_typ, </li></ul><ul><li>occupant person_typ ) NOT FINAL; </li></ul><ul><li>CREATE TABLE dept_office ( </li></ul><ul><li>dept_no NUMBER, </li></ul><ul><li>office office_typ) </li></ul><ul><li>COLUMN office NOT SUBSTITUTABLE AT ALL LEVELS; </li></ul><ul><li>CREATE TABLE dept_office ( </li></ul><ul><li>dept_no NUMBER, </li></ul><ul><li>office office_typ) </li></ul><ul><li>COLUMN office NOT SUBSTITUTABLE AT ALL LEVELS; </li></ul><ul><li>CREATE TABLE office_tab OF office_typ </li></ul><ul><li>COLUMN occupant NOT SUBSTITUTABLE AT ALL LEVELS; </li></ul>
  62. 62. Desligando a substitutability <ul><li>Uma alternativa à cláusula: NOT SUBSTITUTABLE AT ALL LEVELS é usar o operador IS OF type, que especifica qual subtipo pode ser instanciado. </li></ul><ul><li>CREATE TABLE office_tab OF office_typ </li></ul><ul><li>COLUMN occupant IS OF (ONLY employee_typ); </li></ul>
  63. 63. Atualização e Remoção em tabelas de Objetos update PESSOAS p Set p.endereco= ENDERECO_TY(‘Rua das Margaridas 22', ‘ Patos', ‘PB', 58453230) where p.nome = ‘Maria Silva'; Delete from PESSOAS p where p.nome = ‘Maria Silva';
  64. 64. Identificadores de objetos <ul><li>Uma tabela de objetos contém uma coluna gerada pelo SGBD contendo o OID do “row object”. O oid de um objeto é único e imutável. </li></ul><ul><li>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 chave primária. </li></ul><ul><li>Um OID permite que um “row object” seja referenciado em atributos de outros objetos ou em colunas de tabelas relacionais. </li></ul><ul><li>Um tipo pré-definido REF é capaz de representar tais referências. </li></ul>
  65. 65. Referenciando Objetos (REF) <ul><li>É um ponteiro lógico para um “Row Object” </li></ul><ul><li>Usado para fazer referência </li></ul><ul><li>É definido a partir do OID do objeto </li></ul><ul><li>Oferece acesso rápido/direto </li></ul><ul><li>Não garante integridade referencial, tem que usar referential constraint, neste caso REF pode apontar para qualquer objeto do tipo apontado </li></ul>
  66. 66. REF <ul><li>CREATE TYPE emp_person_typ AS OBJECT ( </li></ul><ul><li>name VARCHAR2(30), </li></ul><ul><li>manager REF emp_person_typ ); </li></ul><ul><li>CREATE TABLE emp_person_obj_table OF emp_person_typ; </li></ul><ul><li>INSERT INTO emp_person_obj_table VALUES ( </li></ul><ul><li>emp_person_typ ('John Smith', NULL)); </li></ul><ul><li>INSERT INTO emp_person_obj_table </li></ul><ul><li>SELECT emp_person_typ ('Bob Jones', REF(e)) </li></ul><ul><li>FROM emp_person_obj_table e </li></ul><ul><li>WHERE e.name = 'John Smith'; </li></ul>
  67. 67. REF <ul><li>CREATE OR REPLACE TYPE tp_cliente as OBJECT( </li></ul><ul><li>cod_cli VARCHAR (3), </li></ul><ul><li>nome_cli VARCHAR (60)); </li></ul><ul><li>CREATE TABLE tb_cliente OF tp_cliente( </li></ul><ul><li>cod_cli PRIMARY KEY, </li></ul><ul><li>nome_cli NOT NULL); </li></ul><ul><li>CREATE OR REPLACE TYPE tp_dependente as OBJECT( </li></ul><ul><li>cod_dep VARCHAR(3), </li></ul><ul><li>nm_dep VARCHAR (60), </li></ul><ul><li>ref_titular REF tp_cliente); </li></ul><ul><li>CREATE TABLE tb_dependente OF tp_dependente( </li></ul><ul><li>cod_dep PRIMARY KEY, </li></ul><ul><li>nm_dep NOT NULL, </li></ul><ul><li>ref_titular SCOPE IS tb_cliente); </li></ul>
  68. 68. REF <ul><li>INSERT INTO tb_cliente VALUES (‘C1’, ‘Rita’); </li></ul><ul><li>INSERT INTO tb_cliente VALUES (‘C2’, ‘Ana’); </li></ul><ul><li>INSERT INTO tb_dependente </li></ul><ul><li>SELECT ‘D1’, ‘Paulo’, REF (C) </li></ul><ul><li>FROM tb_cliente C WHERE cod_cli = ‘C1’; </li></ul><ul><li>INSERT INTO tb_dependente </li></ul><ul><li>SELECT ‘D2’, ‘Pedro’, REF (C) </li></ul><ul><li>FROM tb_cliente C WHERE cod_cli = ‘C2’; </li></ul>
  69. 69. REF <ul><li>SELECT * FROM tb_dependente D; </li></ul><ul><li>COD_DEP NM_DEP REF_TITULAR </li></ul><ul><li>----------------------------------------- </li></ul><ul><li>D1 Paulo Q2459QW8RNDGS0D98G765SF </li></ul><ul><li>D2 Pedro 5XBGVX3B75XCN490VM0VBX4 </li></ul>
  70. 70. REF <ul><li>SELECT REF(D) </li></ul><ul><li>FROM tb_dependente D </li></ul><ul><li>WHERE D. nm_dep = ‘Paulo’; </li></ul><ul><li>REF(D) </li></ul><ul><li>----------------------- </li></ul><ul><li>HRD23K56RNDGS0DUY6TGDE4 </li></ul>
  71. 71. REF <ul><li>SELECT D.ref_titular.cod_cli cod_cliente, </li></ul><ul><li>D.ref_titular.nm_cli nm_cliente, </li></ul><ul><li>D.nm_dep nm_dependente </li></ul><ul><li>FROM tb_dependente D; </li></ul><ul><li>COD_CLIENTE NM_CLIENTE NM_DEPENDENTE </li></ul><ul><li>--------------------------------------------------------------- </li></ul><ul><li>C1 Rita Paulo </li></ul><ul><li>C2 Ana Pedro </li></ul>
  72. 72. Dangling REF <ul><li>Verificando a validade das referências (Dangling) </li></ul><ul><li>EX: </li></ul><ul><li>DELETE FROM tb_cliente WHERE cod_cli = ‘C1’; </li></ul><ul><li>Remove o objeto Rita </li></ul><ul><li>SELECT D.ref_titular.cod_cli cod_cliente, </li></ul><ul><li> D.ref_titular.nm_cli nm_cliente, </li></ul><ul><li> D.nm_dep nm_dependente </li></ul><ul><li>FROM tb_dependente D; </li></ul><ul><li>COD_CLIENTE NM_CLIENTE NM_DEPENDENTE </li></ul><ul><li>--------------------------------------------------------------- </li></ul><ul><li>Paulo </li></ul><ul><li>C2 Ana Pedro </li></ul><ul><li>OBS.: O objeto Rita não é listado, mas Paulo ainda existe!!!! </li></ul>
  73. 73. Dangling REF <ul><li>Verificando a validade das referências (Dangling) </li></ul><ul><li>SELECT D.ref_titular.cod_cli cod_cliente, </li></ul><ul><li>D.ref_titular.nm_cli nm_cliente, </li></ul><ul><li>D.nm_dep nm_dependente </li></ul><ul><li>FROM tb_dependente D </li></ul><ul><li>WHERE D.ref_titular IS DANGLING; </li></ul><ul><li>COD_CLIENTE NM_CLIENTE NM_DEPENDENTE </li></ul><ul><li>-------------------------------------------------------------- </li></ul><ul><li>Paulo </li></ul>
  74. 74. Dangling REF <ul><li>Verificando a validade das referências (Dangling) </li></ul><ul><li>SELECT D.ref_titular.cod_cli cod_cliente, </li></ul><ul><li>D.ref_titular.nm_cli nm_cliente, </li></ul><ul><li>D.nm_dep nm_dependente </li></ul><ul><li>FROM tb_dependente D </li></ul><ul><li>WHERE D.ref_titular IS NOT DANGLING; </li></ul><ul><li>COD_CLIENTE NM_CLIENTE NM_DEPENDENTE </li></ul><ul><li>---------------------------------------------------------------- </li></ul><ul><li>C2 Ana Pedro </li></ul>
  75. 75. Dangling != NULL <ul><li>SELECT D.ref_titular.cod_cli cod_cliente, </li></ul><ul><li>D.ref_titular.nm_cli nm_cliente, </li></ul><ul><li>D.nm_dep nm_dependente </li></ul><ul><li>FROM tb_dependente D </li></ul><ul><li>WHERE D.ref_titular IS NOT NULL; </li></ul><ul><li>COD_CLIENTE NM_CLIENTE NM_DEPENDENTE </li></ul><ul><li>-------------------------------------------------------------- </li></ul><ul><li>Paulo </li></ul><ul><li>C2 Ana Pedro </li></ul>
  76. 76. SCOPED REF <ul><li>CREATE TABLE contacts_ref ( </li></ul><ul><li>contact_ref REF person_typ SCOPE IS person_obj_table, </li></ul><ul><li>contact_date DATE ); </li></ul><ul><li>Para inserir uma linha na tabela: </li></ul><ul><li>INSERT INTO contacts_ref </li></ul><ul><li>SELECT REF(p), '26 Jun 2003‘ </li></ul><ul><li>FROM person_obj_table p </li></ul><ul><li>WHERE p.idno = 101; </li></ul>
  77. 77. Integridade Referencial em REF <ul><li>Utiliza-se uma sintaxe semelhante ao FOREIGN KEY do modelo relacional </li></ul><ul><li>Ex.: </li></ul><ul><li>FOREIGN KEY (Cust_ref) REFERENCES Customer_objtab) </li></ul><ul><li>No exemplo acima o escopo é dado implicitamente! </li></ul><ul><li>PRIMARY KEY não pode ser especificado para uma coluna REF </li></ul>
  78. 78. DEREF <ul><li>O operador DEREF “desfaz” o REF </li></ul><ul><li>Retorna um objeto referenciado por uma coluna do tipo REF </li></ul><ul><li>Desreferenciar um objeto dangling retorna um objeto null </li></ul>
  79. 79. DEREF <ul><li>Ex.: </li></ul><ul><li>SELECT DEREF(D.ref_titular) deref_titular, </li></ul><ul><li>D.nm_dep nm_dependente </li></ul><ul><li>FROM tb_dependente D; </li></ul><ul><li>DEREF_TITULAR(COD_CLI, NM_CLI) NM_DEPENDENTE </li></ul><ul><li>------------------------------------------------------------------------ </li></ul><ul><li>TP_CLIENTE('C1', 'Rita') Paulo </li></ul><ul><li>TP_CLIENTE('C2', 'Ana') Pedro </li></ul>
  80. 80. DEREF <ul><li>EX. (sem usar DEREF): </li></ul><ul><li>SELECT D.ref_titular sem_deref, </li></ul><ul><li>D.nm_dep nm_dependente </li></ul><ul><li>FROM tb_dependente D; </li></ul><ul><li>SEM_DEREF NM_DEPENDENTE </li></ul><ul><li>------------------------------------------------------------------------ </li></ul><ul><li>P07XZC8V6Z0F97X6VZ965X6VZ4X8VXCVB6Z Paulo </li></ul><ul><li>XCVU6CHBD967B436CB74B5X9B2BX2VQ4WFF Pedro </li></ul>
  81. 81. VALUE <ul><li>Exibe os dados das instâncias dos objetos </li></ul><ul><li>Usa o mesmo formato que DEREF </li></ul><ul><li>EX: </li></ul><ul><li>SELECT VALUE(D) value_titular </li></ul><ul><li>FROM tb_dependente D; </li></ul><ul><li>VALUE_TITULAR (COD_DEP, NM_DEP, REF_TITULAR) </li></ul><ul><li>----------------------------------------------------- </li></ul><ul><li>TP_DEPENDENTE('D1', 'Paulo', Q2459QW8RNDGS0D98G765SF) </li></ul><ul><li>TP_DEPENDENTE('D2', 'Pedro', 5XBGVX3B75XCN490VM0VBX4) </li></ul>
  82. 82. Referenciando Objetos EMPREGADO_TY DEPARTAMENTO_TY depto create table EMPREGADOS (Nome VARCHAR2(25), CPF NUMBER, depto REF DEPARTAMENTO_TY ); 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 .
  83. 83. Tipo REF <ul><li>Um objeto do tipo REF encapsula uma referência para um “row object” de um tipo de objeto especificado; </li></ul><ul><li>O valor de um objeto do tipo REF é um “ponteiro lógico” para um row object. </li></ul><ul><li>REFs e coleções de REFs são utilizados na modelagem de associações entre objetos. Por ex. o relacionamento entre uma ordem de compra e um cliente </li></ul><ul><li>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 </li></ul>create type EMPREGADO_TY as object (Nome VARCHAR2(25), CPF NUMBER, depto REF DEPARTAMENTO_TY );
  84. 84. Selecionando dados de um tipo específico <ul><li>Ex.: Pega subtipo student_t e seus respectivos subtipos </li></ul><ul><li>SELECT VALUE(p) </li></ul><ul><li>FROM person_obj_table p </li></ul><ul><li>WHERE VALUE(p) IS OF (student_typ); </li></ul><ul><li>Ex.: Pega apenas instâncias do subtipo </li></ul><ul><li>SELECT TREAT(VALUE(p) AS student_typ) </li></ul><ul><li>FROM person_obj_table p </li></ul><ul><li>WHERE VALUE(p) IS OF(ONLY student_typ); </li></ul>
  85. 85. TREAT <ul><li>Função que permite tratar um supertipo como subtipo. </li></ul><ul><li>Ex.: tratar person como student </li></ul><ul><li>SELECT TREAT(VALUE(p) AS student_typ) </li></ul><ul><li>FROM person_obj_table p; </li></ul><ul><li>Obs.: retorna NULL quando a instância não é do subtipo especificado, por exemplo, a pessoa não é estudante. </li></ul>
  86. 86. Coleções <ul><li>Oracle dá suporte a: </li></ul><ul><ul><li>VARRAY: coleção ordenada de elementos, com número fixo de elementos, se quiser manipular a coleção toda de uma vez </li></ul></ul><ul><ul><li>Nested tables: quando se precisa rodar consultas eficientes em coleções, manipular um número arbitrário de elementos ou executar várias operações de i nsert, update, ou delete. </li></ul></ul>
  87. 87. VARRAYS <ul><li>É um conjunto ordenado de elementos </li></ul><ul><li>Todos os elementos do VARRAY são do mesmo tipo de dados (ou subtipo) </li></ul><ul><li>Cada elemento tem um índice, que representa sua posição no array, e é usado para acessar um dado elemento </li></ul><ul><li>Possui número máximo de elementos, chamado de tamanho do array (que pode ser alterado depois) </li></ul>
  88. 88. VARRAYS <ul><li>Ex.1 . : </li></ul><ul><li>CREATE TYPE email_list_arr AS VARRAY(10) OF VARCHAR2(80); </li></ul><ul><li>Ex 2: </li></ul><ul><li>CREATE TYPE phone_typ AS OBJECT ( </li></ul><ul><li>country_code VARCHAR2(2), </li></ul><ul><li>area_code VARCHAR2(3), </li></ul><ul><li>ph_number VARCHAR2(7)); </li></ul><ul><li>CREATE TYPE phone_varray_typ AS VARRAY(5) OF phone_typ; </li></ul><ul><li>CREATE TABLE dept_phone_list ( </li></ul><ul><li>dept_no NUMBER(5), </li></ul><ul><li>phone_list phone_varray_typ); </li></ul><ul><li>INSERT INTO dept_phone_list VALUES ( </li></ul><ul><li>100, </li></ul><ul><li>phone_varray_typ( phone_typ ('01', '650', '5061111'), </li></ul><ul><li>phone_typ ('01', '650', '5062222'), </li></ul><ul><li>phone_typ ('01', '650', '5062525'))); </li></ul>
  89. 89. VARRAY <ul><li>Modificando o tamanho de um elemento do varray </li></ul><ul><li>CREATE TYPE email_list_arr AS VARRAY(10) OF VARCHAR2(80); </li></ul><ul><li>ALTER TYPE email_list_arr MODIFY ELEMENT TYPE VARCHAR2(100) CASCADE; </li></ul><ul><li>CREATE TYPE email_list_tab AS TABLE OF VARCHAR2(30); </li></ul><ul><li>ALTER TYPE email_list_tab MODIFY ELEMENT TYPE VARCHAR2(40) CASCADE; </li></ul>
  90. 90. VARRAY <ul><li>Modificando o tamanho do Varray </li></ul><ul><li>CREATE TYPE email_list_arr AS VARRAY(10) OF VARCHAR2(80); </li></ul><ul><li>CREATE TYPE email_list_typ AS OBJECT ( </li></ul><ul><li>section_no NUMBER, </li></ul><ul><li>emails email_list_arr); </li></ul><ul><li>CREATE TYPE email_varray_typ AS VARRAY(5) OF email_list_typ; </li></ul><ul><li>ALTER TYPE email_varray_typ MODIFY LIMIT 100 </li></ul>
  91. 91. Nested Table <ul><li>É um conjunto não ordenado de elementos, cada um do mesmo tipo de dados </li></ul><ul><li>Não há número máximo de elementos e a ordem não é preservada </li></ul><ul><li>Inserção, remoção, seleção e update como em tabelas normais </li></ul>
  92. 92. Nested Table (exemplo) <ul><li>CREATE TYPE people_typ AS TABLE OF person_typ; </li></ul><ul><li>CREATE TABLE people_tab ( </li></ul><ul><li>group_no NUMBER, </li></ul><ul><li>people_column people_typ ) </li></ul><ul><li>NESTED TABLE people_column STORE AS people_column_nt; </li></ul><ul><li>INSERT INTO people_tab VALUES ( </li></ul><ul><li>100, </li></ul><ul><li>people_typ( person_typ(1, 'John Smith', '1-800-555-1212'), </li></ul><ul><li>person_typ(2, 'Diane Smith', NULL))); </li></ul>
  93. 93. Nested Table (exemplo) <ul><li>CREATE TABLE students ( </li></ul><ul><li>graduation DATE, </li></ul><ul><li>math_majors people_typ, </li></ul><ul><li>chem_majors people_typ, </li></ul><ul><li>physics_majors people_typ) </li></ul><ul><li>NESTED TABLE math_majors STORE AS math_majors_nt </li></ul><ul><li>NESTED TABLE chem_majors STORE AS chem_majors_nt </li></ul><ul><li>NESTED TABLE physics_majors STORE AS physics_majors_nt; </li></ul><ul><li>CREATE INDEX math_idno_idx ON math_majors_nt(idno); </li></ul><ul><li>CREATE INDEX chem_idno_idx ON chem_majors_nt(idno); </li></ul><ul><li>CREATE INDEX physics_idno_idx ON physics_majors_nt(idno); </li></ul><ul><li>INSERT INTO students (graduation) VALUES ('01-JUN-03'); </li></ul><ul><li>UPDATE students </li></ul><ul><li>SET math_majors = </li></ul><ul><ul><li>people_typ (person_typ(12, 'Bob Jones', '111-555-1212'), </li></ul></ul><ul><ul><li> person_typ(31, 'Sarah Chen', '111-555-2212'), </li></ul></ul><ul><ul><li> person_typ(45, 'Chris Woods', '111-555-1213')), </li></ul></ul><ul><li>chem_majors = </li></ul><ul><li>people_typ (person_typ(51, 'Joe Lane', '111-555-1312'), </li></ul><ul><li> person_typ(31, 'Sarah Chen', '111-555-2212'), </li></ul><ul><li> person_typ(52, 'Kim Patel', '111-555-1232')), </li></ul><ul><li>physics_majors = </li></ul><ul><li>people_typ (person_typ(12, 'Bob Jones', '111-555-1212'), </li></ul><ul><li> person_typ(45, 'Chris Woods', '111-555-1213')) </li></ul><ul><li>WHERE graduation = '01-JUN-03'; </li></ul>
  94. 94. Coleções Multi-dimensionais <ul><li>Podemos ter: </li></ul><ul><ul><li>Nested table de nested table type </li></ul></ul><ul><ul><li>Nested table de varray type </li></ul></ul><ul><ul><li>Varray de nested table type </li></ul></ul><ul><ul><li>Varray de varray type </li></ul></ul><ul><ul><li>Nested table ou varray de um UDT que tem um atributo que é uma nested table ou varray type </li></ul></ul>
  95. 95. Coleções Multi-dimensionais <ul><li>CREATE TYPE location_typ AS OBJECT ( </li></ul><ul><li>location_id NUMBER(4), </li></ul><ul><li>street_address VARCHAR2(40), </li></ul><ul><li>postal_code VARCHAR2(12), </li></ul><ul><li>city VARCHAR2(30), </li></ul><ul><li>state_province VARCHAR2(25)); </li></ul><ul><li>CREATE TYPE nt_location_typ AS TABLE OF location_typ; </li></ul><ul><li>CREATE TYPE country_typ AS OBJECT ( </li></ul><ul><li>country_id CHAR(2), </li></ul><ul><li>country_name VARCHAR2(40), </li></ul><ul><li>locations nt_location_typ); </li></ul><ul><li>CREATE TYPE nt_country_typ AS TABLE OF country_typ; </li></ul><ul><li>CREATE TABLE region_tab ( </li></ul><ul><li>region_id NUMBER, </li></ul><ul><li>region_name VARCHAR2(25), </li></ul><ul><li>countries nt_country_typ) </li></ul><ul><li>NESTED TABLE countries STORE AS nt_countries_tab </li></ul><ul><li>(NESTED TABLE locations STORE AS nt_locations_tab); </li></ul>
  96. 96. Coleções Multi-dimensionais <ul><li>INSERT INTO region_tab </li></ul><ul><li>VALUES(1, 'Europe', nt_country_typ( </li></ul><ul><li>country_typ( 'IT', 'Italy', nt_location_typ ( </li></ul><ul><li>location_typ(1000, '1297 Via Cola di Rie','00989','Roma', ''), </li></ul><ul><li>location_typ(1100, '93091 Calle della Testa','10934','Venice','') ) ), </li></ul><ul><li>country_typ( 'CH', 'Switzerland', nt_location_typ ( </li></ul><ul><li>location_typ(2900, '20 Rue des Corps-Saints', '1730', 'Geneva', 'Geneve'), </li></ul><ul><li>location_typ(3000, 'Murtenstrasse 921', '3095', 'Bern', 'BE') )), </li></ul><ul><li>country_typ( 'UK', 'United Kingdom', nt_location_typ ( </li></ul><ul><li>location_typ(2400, '8204 Arthur St', '', 'London', 'London'), </li></ul><ul><li>location_typ(2500, 'Magdalen Centre, The Oxford Science Park', 'OX9 9ZB', 'Oxford', 'Oxford'), </li></ul><ul><li>location_typ(2600, '9702 Chester Road', '09629850293', 'Stretford', </li></ul><ul><li>'Manchester') ) </li></ul><ul><li>) </li></ul><ul><li>) </li></ul><ul><li>); </li></ul>
  97. 97. Operações em coleções <ul><li>Existem duas formas de se realizar uma consulta em colunas com coleções: </li></ul><ul><ul><li>Uma delas traz as coleções aninhadas dentro das linhas que as contêm </li></ul></ul><ul><ul><li>A outra forma, desaninha (unnest) as coleções de forma que cada elemento da coleção aparecerá numa linha do resultado </li></ul></ul>
  98. 98. Operações em coleções <ul><li>Consultas com resultado aninhado: </li></ul><ul><li>SELECT d.dept_emps </li></ul><ul><li>FROM department_persons d; </li></ul><ul><li>DEPT_EMPS(IDNO, NAME, PHONE) </li></ul><ul><li>------------------------------------------------------------------------------ </li></ul><ul><li>PEOPLE_TYP(PERSON_TYP(1, 'John Smith', '1-800-555-1212'), </li></ul><ul><li>PERSON_TYP(2, 'Diane Smith', '1-800-555-1243')) </li></ul>
  99. 99. Operações em coleções <ul><li>Consultas com resultado desaninhado: </li></ul><ul><li>SELECT e.* </li></ul><ul><li>FROM department_persons d, </li></ul><ul><li>TABLE(d.dept_emps) e; </li></ul><ul><li>IDNO NAME PHONE </li></ul><ul><li>---------- ------------------------------ --------------- </li></ul><ul><li>1 John Smith 1-800-555-1212 </li></ul><ul><li>2 Diane Smith 1-800-555-1243 </li></ul>
  100. 100. Operações em coleções <ul><li>Query que resulta linhas de departamentos que possuem empregados </li></ul><ul><li>SELECT d.dept_no, e.* </li></ul><ul><li>FROM department_persons d, TABLE(d.dept_emps) e; </li></ul>
  101. 101. Operações em coleções <ul><li>Mesma query anterior mas que mostra também departamentos sem empregados (outer join) </li></ul><ul><li>SELECT d.dept_no, e.* </li></ul><ul><li>FROM department_persons d, TABLE(d.dept_emps) (+) e; </li></ul>
  102. 102. Operações em coleções <ul><li>SELECT * </li></ul><ul><li>FROM TABLE( </li></ul><ul><li>SELECT d.dept_emps </li></ul><ul><li>FROM department_persons d </li></ul><ul><li>WHERE d.dept_no = 101); </li></ul><ul><li>Obs.: a subquery acima deve retornar sempre </li></ul><ul><li>uma coleção </li></ul><ul><li>a projeção da subquery deve conter apenas um item </li></ul>
  103. 103. Consulta em multi-coleções <ul><li>Ex11: </li></ul><ul><li>SELECT r.region_name, c.country_name, l.location_id </li></ul><ul><li>FROM region_tab r, TABLE(r.countries) c, TABLE(c.locations) l; </li></ul><ul><li>Ex2: </li></ul><ul><li>SELECT l.location_id, l.city </li></ul><ul><li>FROM region_tab r, TABLE(r.countries) c, TABLE(c.locations) l; </li></ul>
  104. 104. Operações em coleções <ul><li>Inserção </li></ul><ul><li>INSERT INTO TABLE(SELECT d.dept_emps </li></ul><ul><li>FROM department_persons d </li></ul><ul><li>WHERE d.dept_no = 101) </li></ul><ul><li>VALUES (5, 'Kevin Taylor', '1-800-555-6212'); </li></ul>
  105. 105. Operações em coleções <ul><li>Atualização </li></ul><ul><li>UPDATE TABLE(SELECT d.dept_emps </li></ul><ul><li>FROM department_persons d </li></ul><ul><li>WHERE d.dept_no = 101) e </li></ul><ul><li>SET VALUE(e) = person_typ(5, 'Kevin Taylor', '1-800-555-6233') </li></ul><ul><li>WHERE e.idno = 5; </li></ul>
  106. 106. Operações em coleções <ul><li>Remoção </li></ul><ul><li>DELETE FROM TABLE(SELECT d.dept_emps </li></ul><ul><li>FROM department_persons d </li></ul><ul><li>WHERE d.dept_no = 101) e </li></ul><ul><li>WHERE e.idno = 5 </li></ul>
  107. 107. Object Views <ul><li>São tabelas de objetos (object table) virtuais </li></ul><ul><li>Cada linha (row) da Object View é um objeto, podendo-se, portanto, invocar seus métodos e acessar seus atributos </li></ul><ul><li>São úteis no mapeamento de Relacional par a Objetos, pois dá uma “cara” de objetos a uma tabela puramente relacional. </li></ul>
  108. 108. Criando uma Object View <ul><li>CREATE TABLE emp_table ( </li></ul><ul><li>empnum NUMBER (5), </li></ul><ul><li>ename VARCHAR2 (20), </li></ul><ul><li>salary NUMBER (9,2), </li></ul><ul><li>job VARCHAR2 (20)); </li></ul><ul><li>CREATE TYPE employee_t AS OBJECT ( </li></ul><ul><li>empno NUMBER (5), </li></ul><ul><li>ename VARCHAR2 (20), </li></ul><ul><li>salary NUMBER (9,2), </li></ul><ul><li>job VARCHAR2 (20)); </li></ul><ul><li>CREATE VIEW emp_view1 OF employee_t </li></ul><ul><li>WITH OBJECT IDENTIFIER (empno) AS </li></ul><ul><li>SELECT e.empnum, e.ename, e.salary, e.job </li></ul><ul><li>FROM emp_table e </li></ul><ul><li>WHERE job = 'Developer'; </li></ul>
  109. 109. Criando uma Object View – EX.2 <ul><li>CREATE TABLE dept ( </li></ul><ul><li>deptno NUMBER PRIMARY KEY, </li></ul><ul><li>deptname VARCHAR2(20), </li></ul><ul><li>deptstreet VARCHAR2(20), </li></ul><ul><li>deptcity VARCHAR2(10), </li></ul><ul><li>deptstate CHAR(2), </li></ul><ul><li>deptzip VARCHAR2(10)); </li></ul><ul><li>CREATE TYPE address_t AS OBJECT ( </li></ul><ul><li>street VARCHAR2(20), </li></ul><ul><li>city VARCHAR2(10), </li></ul><ul><li>state CHAR(2), </li></ul><ul><li>zip VARCHAR2(10)); </li></ul><ul><li>CREATE TYPE dept_t AS OBJECT ( </li></ul><ul><li>deptno NUMBER, </li></ul><ul><li>deptname VARCHAR2(20), </li></ul><ul><li>address address_t ); </li></ul><ul><li>CREATE VIEW dept_view OF dept_t WITH OBJECT IDENTIFIER (deptno) AS </li></ul><ul><li>SELECT d.deptno, d.deptname, </li></ul><ul><li>address_t(d.deptstreet,d.deptcity,d.deptstate,d.deptzip) AS deptaddr </li></ul><ul><li>FROM dept d; </li></ul>
  110. 110. Criando uma referência a Objetos numa View <ul><li>CREATE TYPE emp_t AS OBJECT ( </li></ul><ul><li>empno NUMBER, </li></ul><ul><li>ename VARCHAR2(20), </li></ul><ul><li>salary NUMBER, </li></ul><ul><li>deptref REF dept_t); </li></ul><ul><li>CREATE OR REPLACE VIEW emp_view OF emp_t WITH OBJECT IDENTIFIER(empno) </li></ul><ul><li>AS SELECT e.empno, e.empname, e.salary, </li></ul><ul><li>MAKE_REF(dept_view, e.deptno) </li></ul><ul><li>FROM emp e; </li></ul>
  111. 111. Ex. De consulta à view anterior <ul><li>SELECT e.empno, e.salary, e.deptref.deptno </li></ul><ul><li>FROM emp_view e </li></ul><ul><li>WHERE e.deptref.address.city = 'San Francisco'; </li></ul>
  112. 112. Outra forma de definir a View <ul><li>CREATE OR REPLACE VIEW emp_view OF emp_t WITH OBJECT IDENTIFIER(empno) </li></ul><ul><li>AS SELECT e.empno, e.empname, e.salary, REF(d) </li></ul><ul><li>FROM emp e, dept_view d </li></ul><ul><li>WHERE e.deptno = d.deptno; </li></ul>
  113. 113. Atualizando Object Views <ul><li>Oracle permite, se não houver ambiguidade, realizar update, delete e insert em Object Views. </li></ul><ul><li>Uma View não poderá ser diretamente atualizada se contiver joins, set operators, aggregate functions, GROUP BY ou DISTINCT clauses. Nestes casos, para poder-se atualizá-la, deve-se usar o INSTEAD OF Trigger </li></ul><ul><li>Uma remoção ou alteração numa superview será feita nas subviews também a menos que se use o operador ONLY </li></ul>
  114. 114. Atualizando Object Views <ul><li>Ex.: DELETE FROM Person_v; remove de Person_v, Student-V e Employee_v </li></ul><ul><li>Ex. Usando ONLY: </li></ul><ul><li>UPDATE ONLY(Person_v) SET address = ... </li></ul>
  115. 115. Criando INSTEAD OF Triggers numa View <ul><li>- Número de empregados um Departamento não pode exceder 10 </li></ul><ul><li>CREATE TRIGGER emp_instr INSTEAD OF INSERT on emp_view </li></ul><ul><li>FOR EACH ROW </li></ul><ul><li>DECLARE </li></ul><ul><li>dept_var dept_t; </li></ul><ul><li>emp_count integer; </li></ul><ul><li>BEGIN </li></ul><ul><li>-- Enforce the constraint </li></ul><ul><li>-- First get the department number from the reference </li></ul><ul><li>UTL_REF.SELECT_OBJECT(:NEW.deptref, dept_var); </li></ul><ul><li>SELECT COUNT(*) INTO emp_count </li></ul><ul><li>FROM emp </li></ul><ul><li>WHERE deptno = dept_var.deptno; </li></ul><ul><li>IF emp_count < 9 THEN </li></ul><ul><li>-- Do the insert </li></ul><ul><li>INSERT INTO emp (empno, empname, salary, deptno) </li></ul><ul><li>VALUES (:NEW.empno, :NEW.ename, :NEW.salary, dept_var.deptno); </li></ul><ul><li>END IF; </li></ul><ul><li>END; </li></ul>
  116. 116. Ex. De Hierarquia de Views <ul><li>CREATE TABLE AllPersons </li></ul><ul><li>( typeid NUMBER(1), </li></ul><ul><li>ssn NUMBER, </li></ul><ul><li>name VARCHAR2(30), </li></ul><ul><li>address VARCHAR2(100), </li></ul><ul><li>deptid NUMBER, </li></ul><ul><li>major VARCHAR2(30), </li></ul><ul><li>empid NUMBER, </li></ul><ul><li>mgr VARCHAR2(30)); </li></ul><ul><li>OBS.: typeid: 1 = person_typ </li></ul><ul><li> 2 = student_typ </li></ul><ul><li> 3 = employee_typ </li></ul>
  117. 117. Ex. De Hierarquia de Views <ul><li>CREATE TYPE person_typ AS OBJECT </li></ul><ul><li>( ssn NUMBER, </li></ul><ul><li>name VARCHAR2(30), </li></ul><ul><li>address VARCHAR2(100)) NOT FINAL; </li></ul><ul><li>/ </li></ul><ul><li>CREATE TYPE student_typ UNDER person_typ </li></ul><ul><li>( deptid NUMBER, </li></ul><ul><li>major VARCHAR2(30)) NOT FINAL; </li></ul><ul><li>/ </li></ul><ul><li>CREATE TYPE employee_typ UNDER person_typ </li></ul><ul><li>( empid NUMBER, </li></ul><ul><li>mgr VARCHAR2(30)); </li></ul>
  118. 118. Ex. De Hierarquia de Views <ul><li>CREATE VIEW Person_v OF person_typ </li></ul><ul><li>WITH OBJECT OID(ssn) AS </li></ul><ul><li>SELECT ssn, name, address </li></ul><ul><li>FROM AllPersons </li></ul><ul><li>WHERE typeid = 1; </li></ul><ul><li>CREATE VIEW Student_v OF student_typ UNDER Person_v AS </li></ul><ul><li>SELECT ssn, name, address, deptid, major </li></ul><ul><li>FROM AllPersons </li></ul><ul><li>WHERE typeid = 2; </li></ul><ul><li>CREATE VIEW Employee_v OF employee_typ UNDER Person_v AS </li></ul><ul><li>SELECT ssn, name, address, empid, mgr </li></ul><ul><li>FROM AllPersons </li></ul><ul><li>WHERE typeid = 3; </li></ul>
  119. 119. Consultando Object Views <ul><li>SELECT REF(p), VALUE(p) FROM Person_v p; </li></ul><ul><li>SELECT * FROM Person_v; </li></ul><ul><li>SELECT VALUE(p) FROM ONLY(Person_v) p; </li></ul>

×