introdução definindo visões de objeto usando visões de objeto atualizando visões de objeto

Post on 07-Apr-2016

238 Views

Category:

Documents

3 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Introdução

Definindo Visões de Objeto

Usando Visões de Objeto

Atualizando Visões de Objeto

Mecanismo de Visão para suportar Visão de Objetos. Uma Visão de Objeto é uma visão com “row

objetos” (objetos com identificador). Da mesma forma que podemos definir “column

objects” e “row Objects” em tabelas, podemos defini-los em visões.

Estes objetos (column e row) podem existir fisicamente no banco de dados (em tabelas de objetos) e podem ser “sintetizados” de dados no formato relacional ou de objetos em outro formato.

Provê um caminho de migração gradual para “legacy data”.Dados Relacionais podem ser mapeados em objetos e aplicações podem manipula-los como estruturas nativas.Provê a co-existência de aplicações relacionais e OO. Provê a flexibilidade de ver o mesmo dado relacional ou OO de mais de uma maneira. Como os objetos da visão são processados no Servidor, não no cliente, isto pode resultar em menos tráfico na rede

1. Defina um tipo de Objeto para ser representado pelas linhas de uma visão de Objetos.

2. Escreva uma consulta que especifique quais dados em quais tabelas contem os atributos para os objetos daquele tipo.

3. Especifique um identificador de objeto, baseado nos atributos dos dados do BD, para permitir REFs para os objetos da visão de Objetos. (usa uma chave).

4. Se é permitido atualização através da visão então escreva triggers INSTEAD OF para ORACLE executar sempre que um programa de aplicação tentar realizar uma atualização atraves da visão.

DEPTO_REL

codigo nomeruacidadeestadocep

EMP_REL

número nomesalariodepto (FK)

Depto_ty

codigo nome

Endereço_tyruacidadeestadocep

endereço

Emp_tynúmero nomesalariodepto

empregados

Crie a visão dept_view de objetos do tipo Depto_ty

CREATE TYPE Emp_lista_ty AS TABLE OF Emp_ty;

CREATE TYPE Emp_ty AS OBJECT(Numero NUMBER,Nome VARCHAR2(20),Salario NUMBER);

CREATE TYPE Endereço_ty AS OBJECT( Rua VARCHAR2(20), Cidade VARCHAR2(20), Estado VARCHAR2(20));

CREATE TYPE Depto_ty AS OBJECT(Codigo NUMBER, Nome VARCHAR2(20), endereço Endereço_ty , empregados Emp_lista_ty );

CREATE VIEW dept_view OF Depto_ty

WITH OBJECT IDENTIFIER (codigo)

AS SELECT

d.codigo,

d.nome,

Endereço_ty(d.rua,d.cidade, d.estado, d.cep),

CAST( MULTISET (SELECT e.numero, e.nome, e.salario

FROM EMP_REL eWHERE e.depto = d.codigo)

AS Emp_lista_ty)

FROM DEPT_REL d;

Criando Visões de “Row Objects”

MULTISET Indica que o resultado da consulta é uma

lista e não um único valor.

Operador CAST Põe o conjunto do resultado no formato do

tipo apropriado (no caso o tipo coleção employee_list_t)

CREATE VIEW dept_view OF dept_t WITH OBJECT IDENTIFIER DEFAULT AS SELECT ....

Se a visão é baseada em uma tabela ou visão de objetos, então o identificador da tabela ou da visão pode ser usado. Neste caso a cláusula WITH OBJECT IDENTIFIER pode ser omitida ou especificada com valor DEFAULT

A maior vantagem de definir visões de “row objects” é que estes objetos podem ser referenciados.

emp_ty dept_ty

emp_view dept_view

<<tipo dos objetos>> <<tipo dos objetos>>

deptref

CREATE TYPE Emp_ty AS OBJECT(Numero NUMBER,Nome VARCHAR2(20),Salario NUMBERDept_ref REF Dept_ty);

CREATE TYPE Endereço_ty AS OBJECT( Rua VARCHAR2(20), Cidade VARCHAR2(20), Estado VARCHAR2(20), CEP VARCHAR(8));

CREATE TYPE Depto_ty AS OBJECT(Código NUMBER, Nome VARCHAR2(20), Endereço Endereço_ty );

Tipo REF

CREATE VIEW dept_view OF Depto_ty

WITH OBJECT IDENTIFIER (codigo)

AS SELECT

d.codigo,

d.nome,

Endereço_ty(d.rua,d.cidade, d.estado, d.cep)

FROM DEPTO_REL d;

Cria Visão Referenciada dept_view

CREATE VIEW Emp_view OF Emp_ty

WITH OBJECT IDENTIFIER(numero)

AS SELECT e.numero,

e.nome,

e.salario,

MAKE_REF(dept_view, e.depto)

FROM EMP_REL e;

MAKE_REF: Usa o valor da chave estrangeira para criar o identificador de objeto que corresponde a um dado objeto da visão referenciada

MÉTODO 1:MÉTODO 1:

CREATE VIEW Emp_view OF Emp_ty

WITH OBJECT IDENTIFIER(numero)

AS SELECT e.numero,

e.nome,

e.salario,

REF(d )

FROM EMP_REL e, dept_view d

WHERE e.depto = d.codigo;

Usa REF para obter a referência para um objeto da visão.

MÉTODO 2MÉTODO 2

SELECT e.numero, e.salario, e.deptref.nome

FROM emp_view e

WHERE e.dept_ref.endereço.cidade = `Fortaleza’;

Encontre os empregados cujo departamento está localizado na cidade de Fortaleza

emp_ty dept_ty

emp_view dept_view

<<tipo dos objetos>> <<tipo dos objetos>>

dept_ref

empregados

CREATE TYPE Emp_lista_ty AS TABLE OF REF Emp_ty;

CREATE TYPE Emp_ty AS OBJECT(Numero NUMBER,Nome VARCHAR2(20),Salario NUMBERDept_ref REF Dept_ty);

CREATE TYPE Dept_ty;

CREATE OR REPLACE TYPE Dept_ty AS OBJECT(Código NUMBER, Nome VARCHAR2(20), endereço Endereço_ty , empregados Emp_lista_ty );

Tipo incompletoCREATE TYPE Endereço_ty AS OBJECT(

Rua VARCHAR, Cidade VARCHAR, Estado VARCHAR,);

MÉTODO 1

1. Cria a visão A sem referenciar a visão B

2. Cria a Visão B que referencia a visão A

3. Redefine a visão A com referência para a visão B

CREATE VIEW Emp_view OF Emp_ty

WITH OBJECT IDENTIFIER(numero)

AS SELECT e.numero,

e.nome,

e.salario,

NULL

FROM EMP_REL e;

CREATE VIEW dept_view OF Depto_ty

WITH OBJECT IDENTIFIER (codigo)

AS SELECT

d.codigo,

d.nome,

Endereço_ty(d.rua,d.cidade, d.estado, d.cep),

CAST( MULTISET (SELECT MAKE_REF(emp_view, e.numero)

FROM EMP_REL eWHERE e.depto = d.codigo)

AS Emp_lista_ty)

FROM DEPT_REL d;

CREATE OR REPLACE VIEW Emp_view OF Emp_ty

WITH OBJECT IDENTIFIER(numero)

AS SELECT e.numero,

e.nome,

e.salario,

MAKE_REF(dept_view, e.depto)

FROM EMP_REL e;

MÉTODO 2

1. Cria a visão A com uma referencia para a visão B usando FORCE

2. Cria a Visão B que referencia a visão A

3. Quando a visão A é usada, ela é validada e recompilada.

CREATE FORCE VIEW Emp_view OF Emp_ty

WITH OBJECT IDENTIFIER(numero)

AS SELECT e.numero,

e.nome,

e.salario,

MAKE_REF(dept_view, e.depto)

FROM EMP_REL e;

SELECT DEREF(t.COLUMN_VALUE)

FROM TABLE( SELECT e.empregados

FROM dept_view e

WHERE e.codigo = 100) t;

COLUMN_VALUE denota a referência para um objeto do tipo emp_t na nested table empreflist.

SELECT e.COLUMN_VALUE.eno

FROM TABLE (SELECT e.empreflist

FROM dept_view e

WHERE e.dno = 100) e

WHERE e.COLUMN_VALUE.ename like `John%';

SELECT e.deptref.dno, DEREF(f.COLUMN_VALUE)

FROM emp_view e, TABLE(e.deptref.empreflist) f

WHERE e.deptref.dno = 100 AND

f.COLUMN_VALUE.ename like `John%';

1. Defina um tipo de Objeto para ser representado pelas linhas de uma visão de Objetos.

2. Escreva uma consulta que especifique quais dados em quais tabelas contem os atributos para os objetos daquele tipo.

3. Especifique um identificador de objeto, baseado nos atributos dos dados do BD, para permitir REFs para os objetos da visão de Objetos. (usa uma chave).

4. Se é permitido atualização através da visão então escreva triggers INSTEAD OF para ORACLE executar sempre que um programa de aplicação tentar realizar uma atualização atraves da visão.

Uma atualização de visão é simplesmente uma atualização que é especificada em uma visão, mas ela deve ser traduzida em uma sequência de atualizações no banco de dados. Chamamos esta sequência de atualizações do banco de dados de tradução da atualização da visão requisitada.

- Os triggers para cada tipo de atualização da visão (que são permitidas) devem ser definidos em tempo de projeto da visão.

- A semântica necessária para remover ambiguidades deve ser obtida através de diálogo com o usuário na hora da definição da visão.

- Uma vez que o tradutor é escolhido, os usuários especificam o trigger correspondente, e o trigger converte estas atualizações em atualizações do banco de dados, sem que seja necessário nenhum diálogo adicional para remover ambiquidades.

CREATE TRIGGER dept_ins INSTEAD OF INSERT ON Dept_viewDECLARE

dept_var dept_t;emp_count integer;

BEGININSERT INTO DEPTO_REL VALUES (: NEW.codigo, :NEW.nome, :NEW.endereço.rua, :NEW. endereço.cidade, :NEW. endereço.estado, :NEW. endereço.CEP);

END;

CREATE TRIGGER emp_ins INSTEAD OF INSERT ON Emp_viewDECLARE

dept_var depto_ty;emp_count integer;

BEGIN-- obtenha o numero do departamento da referênciaUTL_REF.SELECT_OBJECT (:NEW.depto_ref, dept_var)INSERT INTO EMP_REL VALUES (: NEW.numero, :NEW.nome :NEW.salario, dept_var.codigo);END;

UTL_REF: obtem o objeto referenciado

top related