Escolar Documentos
Profissional Documentos
Cultura Documentos
Oracle OR 11g
Tipos de Objetos (TADs) Nested Tables (Tabelas aninhadas) VArrays (Varying Arrays) Large Objects (LOBs) References (REF) Object View (Viso de Objetos)
Oracle OR 11g
Conceitos Bsicos
Tipo de Objeto Mtodo Evoluo de Tipo Herana de Tipo Tabela de Objeto Objeto de Linha e Objeto de Coluna Referncia de Objeto Coleo de Objetos
Oracle OR 11g
O ORACLE 11g fornece um suporte completo para todos os trs diferentes tipos de implementao: 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
Exemplo - UML
Projeto BD Relacional
Esquema Relacional
Definindo os Tipos
Tipo de objeto um tipo abstrato de dados (TAD), ou seja um Structured Type em SQL:1999 TAD um tipo de dado definido pelo usurio que encapsula propriedades (atributos) e comportamento (mtodos) Corresponde ao Molde de um objeto No aloca espao de armazenamento No pode armazenar dados
Tipos de Objetos
Um Tipo de Objeto um esquema de objeto com 3
componentes:
Nome Atributos Mtodos Um tipo de objeto pode ser usado para: Definir o domnio de atributos (column object) de tabelas
Tipos de Objetos
Tipos de Objetos
Exemplo de especificao da interface pblica de um objeto Sintaxe resumida: CREATE [OR REPLACE] TYPE nome_tipo AS OBJECT ( [lista de atributos] [lista de mtodos] );
Tipos de Objetos
Pode ser usado da mesma forma que usado um tipo primitivo
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), endereo ENDERECO_TYP);
ENDEREO_TYP usado para definir o tipo (domnio) da coluna Endereo da tabela PESSOAS
Tipos de objetos
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);
PESSOA_TYP
No possvel ocorrer uma insero de dados em PESSOA_TYP. Isso porque um tipo de objeto descreve dados, mas no os armazena.
Tipos de objetos
Para armazenar dados necessrio a criao 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 );
Exemplo
CREATE TYPE person_typ AS OBJECT ( idno NUMBER, first_name VARCHAR2(20), last_name VARCHAR2(25), email VARCHAR2(25), phone VARCHAR2(20), MAP MEMBER FUNCTION get_idno RETURN NUMBER, MEMBER PROCEDURE display_details ( SELF IN OUT NOCOPY person_typ ));
Exemplo (cont.)
CREATE TYPE BODY person_typ AS MAP MEMBER FUNCTION get_idno RETURN NUMBER IS BEGIN RETURN idno; END; MEMBER PROCEDURE display_details ( SELF IN OUT NOCOPY person_typ ) IS BEGIN -- use the PUT_LINE procedure of the DBMS_OUTPUT package to display details DBMS_OUTPUT.PUT_LINE(TO_CHAR(idno) || ' ' || first_name || ' ' || last_name); DBMS_OUTPUT.PUT_LINE(email || ' ' || phone); END; END;
Inserindo dados
Ex.: CREATE TABLE contacts ( contact person_typ, contact_date DATE ); INSERT INTO contacts VALUES ( person_typ (65, 'Verna', 'Mills', 'vmills@oracle.com', '1-800-555-4412'), '24 Jun 2003' );
INSERT INTO contacts VALUES (person_typ (NULL, NULL, NULL), '24 Jun 2003' );
INSERT INTO contacts VALUES (NULL, '24 Jun 2003' );
Constraints
CREATE TABLE department_mgrs ( dept_no NUMBER PRIMARY KEY, dept_name CHAR(20), dept_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', '1-800-555-4412'), location_typ(300, 'Palo Alto'));
Mtodos
So funes ou procedimentos que so declarados na definio de um tipo de objeto Exigem o uso de parnteses (mesmo sem parmetros) O uso de ( ) para diferenciar o mtodo de um procedimento ou funo comum Podem ser
Mtodos
Um object type sempre possui um construtor, pode possuir zero ou mais mtodos membro e pode possuir um mtodo map ou um mtodo order, porm no os dois Ex.: Chamada de mtodo SELECT c.contact.get_idno() FROM contacts c;
Mtodos
MEMBER
So os mtodos mais comuns Implementam as operaes das instncias do tipo So invocados atravs da qualificao de objeto objeto.mtodo() SELF no precisa ser declarado, mas pode ser e dever ser sempre o primeiro parmetro
Mtodos
Construtor
Criado implicitamente ao criar um tipo de objeto Deve ser exatamente igual ao nome do tipo Pode haver mais de um construtor EX:
INSERT INTO tb_contatos VALUES ( Person_typ (65, Pedro', Medeiros', pm@hotmail.com', '83-3337-3333'), 12 Mai 2005' );
Static Method
So invocados nos tipos de dados, no nas instncias Usados para operaes que so globais ao tipo e no precisam se reportar a uma instncia particular No possui parmetro SELF Invocado da seguinte forma: type_name.method()
So funes opcionais para comparar objetos So mutuamente exclusivos! Por default o ORACLE implementa a comparao STATE do SQL:1999 (que indica se um objeto igual ou no de outro baseado na comparao de cada atributo) ORDER
Implementa o RELATIVE WITH do SQL:1999, retornando negativo, zero ou positivo exige como parmetro um obj. do mesmo tipo ORDER compara o obj. corrente com o obj. do parmetro Implementa MAP do SQL:1999, retornando um valor de tipo built-in no exige parmetro MAP compara vrios objetos (ex: ORDER BY)
MAP
Evoluo de Tipos
Uso do comando ALTER TYPE, permite modificar, ou evoluir, um tipo objeto: Adicionar e remover atributos Adicionar e remover mtodos Modificar um atributo numrico para aumentar o length, precision, ou scale Modicar um atributo string para aumentar seu length Mudar propriedades FINAL e INSTANTIABLE do tipo
Evoluo de Tipos
EX: ALTER TYPE person_typ ADD ATTRIBUTE ( sex VARCHAR2(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 MODIFY ATTRIBUTE sex VARCHAR2(10) CASCADE ;
OBS.:
Herana de Tipos
Suporta herana simples H uma diferena do padro SQL:1999, pois o Oracle no requer herana explicitamente nas tabelas, mas apenas nos tipos => modelo mais simples, embora menos flexvel Permite criar uma hierarquia de sub-tipos especializados Os tipos derivados (sub-tipos) herdam os atributos e mtodos dos tipos ancestrais (super-tipos) Os sub-tipos podem acrescentar novos atributos ou mtodos e/ou redefinir os mtodos dos super-tipos
Herana de Tipos
CREATE TYPE employee_typ UNDER person_typ( depto_id NUMBER, funcao VARCHAR2(30), salario NUMBER ) NOT FINAL;
Herana 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;
Herana de Tipos
CREATE TYPE professor_typ UNDER person_typ ( dept_id NUMBER, speciality VARCHAR2(30)) NOT FINAL;
Overriding Method
CREATE TYPE person_typ AS OBJECT ( idno NUMBER, name VARCHAR2(30), phone VARCHAR2(20), MAP MEMBER FUNCTION get_idno RETURN NUMBER, STATIC FUNCTION show_super (person_obj in person_typ) RETURN VARCHAR2, MEMBER FUNCTION show RETURN VARCHAR2) NOT FINAL;
S se pode fazer overriding de mtodos declarados NOT FINAL no supertipo Mtodos ORDER s podem ser definidos na raiz da hierarquia de tipos, no podendo ser overriden Um mtodo STATIC (MEMBER) num subtipo no poder override um mtodo MEMBER (STATIC) do supertipo Usando PL/SQL no se pode chamar o mtodo do supertipo atravs da keyword super, mas pode-se invocar um mtodo esttico do supertipo
Cada linha de uma tabela de objetos possui um identificador de objeto (OID), definido pelo ORACLE quando a linha inserida na tabela; Um OID um ponteiro para um objeto linha (ROW Object);
As linhas ( row objects) de uma tabela de objetos podem ser referenciadas por outros objetos do banco de dados.
Tabela de objetos
create type PESSOA_TY as object (Nome VARCHAR2(25), CPF NUMBER, Endereco ENDERECO_TY); create table PESSOAS of PESSOA_TY (CPF primary key ); A tabela de objetos PESSOAS pode ser vista como:
Uma Tabela com uma nica coluna: - cada linha um objeto do tipo PESSOA. Uma Tabela com mltiplas colunas - Uma coluna para cada atributo do tipo PESSOA_TY
Tabelas de Objetos
Equivalentes s Tabelas Tipadas (Typed Tables) do SQL:1999 So tabelas especiais onde cada linha armazena um objeto Prov uma viso relacional desses objetos. As linhas de uma tabela de objetos possuem um OID (object identifier) implcito (definido pelo ORACLE) Os objetos de uma tabela de objetos podem ser referenciados (REF) por outros objetos Nos comandos de manipulao de objetos utilizar aliases para as tabelas
Cada linha dentro de uma tabela de objetos possuir um OID, e essas linhas podero ser referenciadas como objetos.
Seleo em tabelas
Seleo em PESSOAS como uma tabela de mltiplas colunas.
select *
from PESSOAS;
============================================================ NOME CPF ENDERECO(RUA, CIDADE, ESTADO, CEP)
--------------------- ---------------- ---------------------------------------------------------------Maria Silva 543875432 ENDERECO_TY(Rua das Flores 84', Campina Grande', PB', 58102324)
Seleo em tabelas
Seleo em PESSOAS como uma tabela de uma de uma nica coluna.
Seleo em tabelas
SELECT p.CPF FROM PESSOAS p
CPF -------------------------------------------------------------543875432
Seleo em tabelas
SELECT p.endereco FROM PESSOAS p WHERE p.nome = Maria Silva'; Resposta: ENDERECO(RUA, CIDADE, ESTADO, CEP)
-------------------------------------------------------------
Seleo em tabelas
select p.endereco.cidade from PESSOAS p where p.nome = Maria Silva';
Resposta: ENDERECO.CIDADE ------------------------Campina Grande
Insero de dados
CREATE TABLE person_obj_table OF person_typ; INSERT INTO person_obj_table VALUES ( person_typ(101, 'John', 'Smith', 'jsmith@oracle.com', '1-800-555-1212') ); SELECT VALUE(p) FROM person_obj_table p WHERE p.last_name = 'Smith';
DECLARE person person_typ; BEGIN -- PL/SQL block for selecting a person and displaying details SELECT VALUE(p) INTO person FROM person_obj_table p WHERE p.idno = 101; person.display_details(); END;
(PESSOA_TY(Maria Silva', 543875432, ENDERECO_TY(Rua das Flores 84', Campina Grande', PB', 58102324)) Mtodos construtores para os tipos PESSOA_TY e ENDERECO_TY. O nome do mtodo construtor tem o mesmo nome do tipo.
Desligando a substitutability
CREATE TYPE office_typ AS OBJECT ( office_id VARCHAR(10), location location_typ, occupant person_typ ) NOT FINAL; CREATE TABLE dept_office ( dept_no NUMBER, office office_typ) COLUMN office NOT SUBSTITUTABLE AT ALL LEVELS; CREATE TABLE dept_office ( dept_no NUMBER, office office_typ) COLUMN office NOT SUBSTITUTABLE AT ALL LEVELS; CREATE TABLE office_tab OF office_typ COLUMN occupant NOT SUBSTITUTABLE AT ALL LEVELS;
Desligando a substitutability
Uma alternativa clusula: 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);
Identificadores de objetos
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 referncias.
um ponteiro lgico para um Row Object Usado para fazer referncia definido a partir do OID do objeto Oferece acesso rpido/direto No garante integridade referencial, tem que usar referential constraint, neste caso REF pode apontar para qualquer objeto do tipo apontado
REF
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 SELECT emp_person_typ ('Bob Jones', REF(e)) FROM emp_person_obj_table e WHERE e.name = 'John Smith';
REF
CREATE OR REPLACE TYPE tp_cliente as OBJECT( cod_cli VARCHAR (3), nome_cli VARCHAR (60)); CREATE TABLE tb_cliente OF tp_cliente( cod_cli PRIMARY KEY, nome_cli NOT NULL); CREATE OR REPLACE TYPE tp_dependente as OBJECT( cod_dep VARCHAR(3), nm_dep VARCHAR (60), ref_titular REF tp_cliente); CREATE TABLE tb_dependente OF tp_dependente( cod_dep PRIMARY KEY, nm_dep NOT NULL, ref_titular SCOPE IS tb_cliente);
REF
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 cod_cli = C1; INSERT INTO tb_dependente SELECT D2, Pedro, REF (C) FROM tb_cliente C WHERE cod_cli = C2;
REF
SELECT * FROM tb_dependente D; COD_DEP NM_DEP REF_TITULAR ----------------------------------------D1 Paulo Q2459QW8RNDGS0D98G765SF D2 Pedro 5XBGVX3B75XCN490VM0VBX4
REF
SELECT REF(D) FROM tb_dependente D WHERE D. nm_dep = Paulo; REF(D) ----------------------HRD23K56RNDGS0DUY6TGDE4
REF
SELECT D.ref_titular.cod_cli cod_cliente, D.ref_titular.nm_cli nm_cliente, D.nm_dep nm_dependente FROM tb_dependente D; COD_CLIENTE NM_CLIENTE NM_DEPENDENTE --------------------------------------------------------------C1 Rita Paulo C2 Ana Pedro
Dangling REF
Verificando a validade das referncias (Dangling) EX: DELETE FROM tb_cliente WHERE cod_cli = C1; Remove o objeto Rita SELECT D.ref_titular.cod_cli cod_cliente, D.ref_titular.nm_cli nm_cliente, D.nm_dep nm_dependente FROM tb_dependente D; COD_CLIENTE NM_CLIENTE NM_DEPENDENTE --------------------------------------------------------------Paulo C2 Ana Pedro
Dangling REF
Verificando a validade das referncias (Dangling) SELECT D.ref_titular.cod_cli cod_cliente, D.ref_titular.nm_cli nm_cliente, D.nm_dep nm_dependente FROM tb_dependente D WHERE D.ref_titular IS DANGLING;
Dangling REF
Verificando a validade das referncias (Dangling) SELECT D.ref_titular.cod_cli cod_cliente, D.ref_titular.nm_cli nm_cliente, D.nm_dep nm_dependente FROM tb_dependente D WHERE D.ref_titular IS NOT DANGLING;
Dangling != NULL
SELECT D.ref_titular.cod_cli cod_cliente, D.ref_titular.nm_cli nm_cliente, D.nm_dep nm_dependente FROM tb_dependente D WHERE D.ref_titular IS NOT NULL; COD_CLIENTE NM_CLIENTE NM_DEPENDENTE -------------------------------------------------------------Paulo C2 Ana Pedro
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: INSERT INTO contacts_ref SELECT REF(p), '26 Jun 2003 FROM person_obj_table p WHERE p.idno = 101;
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
DEREF
Ex.: SELECT DEREF(D.ref_titular) deref_titular, D.nm_dep nm_dependente FROM tb_dependente D;
DEREF
EX. (sem usar DEREF): SELECT D.ref_titular sem_deref, D.nm_dep nm_dependente FROM tb_dependente D; SEM_DEREF NM_DEPENDENTE -----------------------------------------------------------------------P07XZC8V6Z0F97X6VZ965X6VZ4X8VXCVB6Z Paulo XCVU6CHBD967B436CB74B5X9B2BX2VQ4WFF Pedro
VALUE
Exibe os dados das instncias dos objetos Usa o mesmo formato que DEREF EX: SELECT VALUE(D) value_titular FROM tb_dependente D;
VALUE_TITULAR (COD_DEP, NM_DEP, REF_TITULAR) ----------------------------------------------------TP_DEPENDENTE('D1', 'Paulo', Q2459QW8RNDGS0D98G765SF) TP_DEPENDENTE('D2', 'Pedro', 5XBGVX3B75XCN490VM0VBX4)
Referenciando Objetos
EMPREGADO_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.
de pto
DEPARTAMENTO_TY
create table EMPREGADOS (Nome VARCHAR2(25), CPF NUMBER, depto REF DEPARTAMENTO_TY);
Tipo REF
create type EMPREGADO_TY as object (Nome VARCHAR2(25), CPF NUMBER, depto REF DEPARTAMENTO_TY);
Um objeto do tipo REF encapsula uma referncia para um row object de um tipo de objeto especificado; O valor de um objeto do tipo REF um ponteiro lgico para um row object. REFs e colees de REFs so utilizados na modelagem de associaes entre objetos. Por ex. o relacionamento entre uma ordem de compra e um cliente REFs constituem um mecanismo simples para navegar entre objetos. Pode-se utilizar a notao estendida de pontos para seguir os ponteiros sem a necessidade de junes explcitas
Ex.: Pega apenas instncias do subtipo SELECT TREAT(VALUE(p) AS student_typ) FROM person_obj_table p WHERE VALUE(p) IS OF(ONLY student_typ);
TREAT
Funo que permite tratar um supertipo como subtipo. Ex.: tratar person como student SELECT TREAT(VALUE(p) AS student_typ) FROM person_obj_table p;
Obs.: retorna NULL quando a instncia no do subtipo especificado, por exemplo, a pessoa no estudante.
Colees
Oracle d suporte a:
VARRAY: coleo ordenada de elementos, com nmero fixo de elementos, se quiser manipular a coleo toda de uma vez Nested tables: quando se precisa rodar consultas eficientes em colees, manipular um nmero arbitrrio de elementos ou executar vrias operaes de insert, update, ou delete.
VARRAYS
um conjunto ordenado de elementos Todos os elementos do VARRAY so do mesmo tipo de dados (ou subtipo) Cada elemento tem um ndice, que representa sua posio no array, e usado para acessar um dado elemento Possui nmero mximo de elementos, chamado de tamanho do array (que pode ser alterado depois)
VARRAYS
Ex.1 . : CREATE TYPE email_list_arr AS VARRAY(10) OF VARCHAR2(80); Ex 2:
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', '5061111'), phone_typ ('01', '650', '5062222'), phone_typ ('01', '650', '5062525')));
VARRAY
CREATE TYPE email_list_arr AS VARRAY(10) OF VARCHAR2(80); ALTER TYPE email_list_arr MODIFY ELEMENT TYPE VARCHAR2(100) CASCADE; CREATE TYPE email_list_tab AS TABLE OF VARCHAR2(30);
VARRAY
CREATE TYPE email_list_arr AS VARRAY(10) OF VARCHAR2(80); CREATE TYPE email_list_typ AS OBJECT ( section_no NUMBER, emails email_list_arr); CREATE TYPE email_varray_typ AS VARRAY(5) OF email_list_typ;
Nested Table
um conjunto no ordenado de elementos, cada um do mesmo tipo de dados No h nmero mximo de elementos e a ordem no preservada Insero, remoo, seleo e update como em tabelas normais
chem_majors = people_typ (person_typ(51, 'Joe Lane', '111-555-1312'), person_typ(31, 'Sarah Chen', '111-555-2212'), person_typ(52, 'Kim Patel', '111-555-1232')), physics_majors = people_typ (person_typ(12, 'Bob Jones', '111-555-1212'), person_typ(45, 'Chris Woods', '111-555-1213')) WHERE graduation = '01-JUN-03';
Colees Multi-dimensionais
Podemos ter:
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
Colees 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);
Colees 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, 'Magdalen Centre, The Oxford Science Park', 'OX9 9ZB', 'Oxford', 'Oxford'), location_typ(2600, '9702 Chester Road', '09629850293', 'Stretford', 'Manchester') ) ) ) );
Operaes em colees
Uma delas traz as colees aninhadas dentro das linhas que as contm A outra forma, desaninha (unnest) as colees de forma que cada elemento da coleo aparecer numa linha do resultado
Operaes em colees
SELECT d.dept_emps FROM department_persons d; DEPT_EMPS(IDNO, NAME, PHONE) -----------------------------------------------------------------------------PEOPLE_TYP(PERSON_TYP(1, 'John Smith', '1-800-5551212'), PERSON_TYP(2, 'Diane Smith', '1-800-555-1243'))
Operaes em colees
Consultas com resultado desaninhado: SELECT e.* FROM department_persons d, TABLE(d.dept_emps) e; IDNO NAME PHONE ---------- ------------------------------ --------------1 John Smith 1-800-555-1212 2 Diane Smith 1-800-555-1243
Operaes em colees
Query que resulta linhas de departamentos que possuem empregados SELECT d.dept_no, e.* FROM department_persons d, TABLE(d.dept_emps) e;
Operaes em colees
Mesma query anterior mas que mostra tambm departamentos sem empregados (outer join) SELECT d.dept_no, e.* FROM department_persons d, TABLE(d.dept_emps) (+) e;
Operaes em colees
SELECT * FROM TABLE( SELECT d.dept_emps FROM department_persons d WHERE d.dept_no = 101); Obs.: a subquery acima deve retornar sempre uma coleo a projeo da subquery deve conter apenas um item
Consulta em multi-colees
Ex11: SELECT r.region_name, c.country_name, l.location_id FROM region_tab r, TABLE(r.countries) c, TABLE(c.locations) l; Ex2: SELECT l.location_id, l.city FROM region_tab r, TABLE(r.countries) c, TABLE(c.locations) l;
Operaes em colees
Insero INSERT INTO TABLE(SELECT d.dept_emps FROM department_persons d WHERE d.dept_no = 101) VALUES (5, 'Kevin Taylor', '1-800-555-6212');
Operaes em colees
Atualizao UPDATE TABLE(SELECT d.dept_emps FROM department_persons d WHERE d.dept_no = 101) e SET VALUE(e) = person_typ(5, 'Kevin Taylor', '1-800-555-6233') WHERE e.idno = 5;
Operaes em colees
Remoo DELETE FROM TABLE(SELECT d.dept_emps FROM department_persons d WHERE d.dept_no = 101) e WHERE e.idno = 5
Object Views
So tabelas de objetos (object table) virtuais Cada linha (row) da Object View um objeto, podendo-se, portanto, invocar seus mtodos e acessar seus atributos So teis no mapeamento de Relacional par a Objetos, pois d uma cara de objetos a uma tabela puramente relacional.
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;
CREATE OR REPLACE VIEW emp_view OF emp_t WITH OBJECT IDENTIFIER(empno) AS SELECT e.empno, e.empname, e.salary, MAKE_REF(dept_view, e.deptno) FROM emp e;
Oracle permite, se no houver ambiguidade, realizar update, delete e insert em Object Views. Uma View no poder ser diretamente atualizada se contiver joins, set operators, aggregate functions, GROUP BY ou DISTINCT clauses. Nestes casos, para poder-se atualizla, deve-se usar o INSTEAD OF Trigger Uma remoo ou alterao numa superview ser feita nas subviews tambm a menos que se use o operador ONLY
SELECT REF(p), VALUE(p) FROM Person_v p; SELECT * FROM Person_v; SELECT VALUE(p) FROM ONLY(Person_v) p;
2.
3.