+ All Categories
Home > Documents > III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

Date post: 16-Apr-2015
Category:
Upload: internet
View: 111 times
Download: 3 times
Share this document with a friend
Popular Tags:
49
I I II II – O Modelo OR – O Modelo OR Estudo de Caso, modelo Estudo de Caso, modelo Oracle 10g Oracle 10g
Transcript
Page 1: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

IIII II – O Modelo OR– O Modelo ORIIII II – O Modelo OR– O Modelo OR

Estudo de Caso, modelo Estudo de Caso, modelo Oracle Oracle 10g10g

Page 2: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

Pedidos de CompraPedidos de CompraPedidos de CompraPedidos de Compra

Esquema ConceitualEsquema Conceitual

Page 3: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.
Page 4: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

Interface I-Endereco { attribute struct end {string rua, string cidade, string estado, string cep} endereco; }

Class Cliente : I-Endereco (extent Clientes key codigo) { attribute integer codigo; attribute string nome; attribute Array<string, 10> telefones }

Page 5: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

Class Pedido : I-Endereco (extent Pedidos key codigo) { attribute integer codigo; attribute date data_pedido; attribute date data_entrega; attribute List<struct linha{integer num_linha, integer quantidade, float desconto}> linhas; relationship List<Produto> refere_se; relationship Cliente feito_por; float total() }

Class Produto (extent Produtos key codigo) { attribute integer codigo; attribute float preco }

Page 6: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

Pedidos de CompraPedidos de CompraPedidos de CompraPedidos de Compra

Esquema Lógico OracleEsquema Lógico Oracle

Page 7: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

Problemas a Resolver• Uma nova sintaxe

– Class ODL Type Oracle– Extent ODL Object Table Oracle– Oracle PL/SQL

• Algumas coisas mudam– Oracle não oferece os tipos-coleção Set, Bag, Array

e List• Tipos-coleção Oracle: Varray e Nested Table

– Oracle não oferece o conceito de Interface, e nem de Estrutura

• Oracle Abstract (Virtual) Type– Um tipo sem repositório (“default”)

Page 8: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

• No mundo da implementação, temos

que pensar em situações específicas de ambientes de produção– “Deadlock” de tipos

• Tipos inter-dependentes

– Corpos dos métodos– Ordenação de objetos– Controle de acesso a BD (Segurança)

Page 9: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

Solução Oracle para os Problemas Apontados

• Resolvendo “deadlock” de tipos– Tipos incompletos

CREATE TYPE ProdutoCREATE TYPE Pedido

Page 10: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

• Ordenação de objetos

– Métodos de instância• ORDER• MAP

Page 11: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

• Segurança para invocação de métodos

– WNDS• Write No Database State

– WNPS• Write No Package State

– RNDS• Read No Database State

– RNPS• Read No Package State

Page 12: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

• Tipos Instanciável e Não-Instanciável

– No Oracle, todo tipo é instanciável (“default”)– Se o tipo for não instanciável, a cláusula Not

Instantiable deve ser explicitamente declarada– Se o tipo for instanciável

• Seu repositório (“extent”) será criado possivelmente mais tarde

– CREATE TABLE ... OF <type> ... (<integriy constraints>)

Page 13: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

• Tipo abstrato

• Um tipo abstrato pode ser– Instanciável– Não instanciável

porém jamais será instanciado

– Tipo abstrato e Tipo instanciável são conceitos ortogonais

Page 14: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

– Tipos instanciáveis e abstratos

CREATE TYPE Telefones AS VARRAY(10) OF VARCHAR2(20)

CREATE TYPE Endereco AS OBJECT ( rua VARCHAR2(200), cidade VARCHAR2(200), estado CHAR(2), cep VARCHAR2(20) )

Page 15: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

– Um tipo instanciável e concreto

CREATE TYPE Cliente AS OBJECT ( codigo NUMBER, nome VARCHAR2(200), endereco Endereco, telefones Telefones, ORDER MEMBER FUNCTION comparaClientes(x IN Cliente)

RETURN INTEGER, PRAGMA RESTRICT_REFERENCES ( comparaClientes, WNDS,

WNPS, RNPS, RNDS) )

Page 16: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

Sobre Métodos Tipo ORDER

• Deve retornar sempre um inteiro com sinal (INTEGER)

• Deve ter 2 parâmetros de entrada– SELF– Um objeto X do mesmo tipo de SELF

• A interpretação do Oracle é sempre– Positivo, SELF > X– Negativo, SELF < X– Zero, SELF = X

• Em resumo, somente a lógica do método é da exclusividade do projetista do BD

Page 17: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

Sobre Métodos Tipo MAP

Objetos de tipodefinido pelo

usuário

Objetos de umdos tipos primitivos*

Map()

*- INTEGER, NUMBER, DATE, CHAR e VARCHAR

Page 18: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

Mais Transformação (Mapeamento)

• Relationship ODL REFerence Oracle

Page 19: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

Sobre Repositórios de Tipo

• “Object Table” de um Tipo– É uma tabela onde cada linha representa o

estado corrente de um objeto do tipo– ~1FN

• Coluna Endereco é de um tipo estruturado• Coluna Telefones é de um tipo coleção – VARRAY

- de tipos simples – VARCHAR2• Coluna Linhas é de um tipo coleção – NESTED

TABLE - de tipos estruturados - Linha

Page 20: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

– Onde estão os métodos comuns aos

objetos de uma “object table”?• Em um outro lugar (depende do SGBD

específico)

– Entenda uma “object table” como uma representação tabular ou relacional dos estados (i.e., valores dos atributos) dos objetos de um certo tipo

Page 21: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

Esquema Oracle para Esquema Oracle para o BD o BD PedidoPedido

Esquema Oracle para Esquema Oracle para o BD o BD PedidoPedido

Page 22: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

Um Esboço de Processo de Definição de Esquema OR e

de Criação de BDOR• Passo 1: Definição de Tipos• Passo 2: Definição de Repositórios

de Tipos• Passo 3: Definição de Corpos de

Métodos de Tipos• Passo 4: Criação de Objetos

Page 23: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

Passo 1: TiposPasso 1: TiposPasso 1: TiposPasso 1: Tipos

Page 24: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

Tipos Incompletos

CREATE TYPE Cliente

CREATE TYPE Produto

CREATE TYPE Pedido

Page 25: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

Tipos Abstratos, para o Tipo Concreto Cliente

CREATE TYPE Telefones AS VARRAY(10) OF VARCHAR2(20)

CREATE TYPE Endereco AS OBJECT ( rua VARCHAR2(200), cidade VARCHAR2(200), estado CHAR(2), cep VARCHAR2(20) )

Page 26: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

Tipo Concreto Cliente CREATE TYPE Cliente AS OBJECT (

codigo NUMBER, nome VARCHAR2(200), endereco Endereco, telefones Telefones, ORDER MEMBER FUNCTION comparaClientes(x IN Cliente)

RETURN INTEGER, PRAGMA RESTRICT_REFERENCES ( comparaClientes, WNDS,

WNPS, RNPS, RNDS) )

Page 27: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

CREATE TYPE Linha AS OBJECT ( num_linha NUMBER, refere_se REF Produto, quantidade NUMBER, desconto NUMBER )

CREATE TYPE ListaDeLinhas AS TABLE OF Linha

Tipos Abstratos para o Tipo Concreto Pedido

Page 28: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

CREATE TYPE Pedido AS OBJECT ( codigo NUMBER,

feito_por REF Cliente, data_pedido DATE, data_entrega DATE, linhas ListaDeLinhas, MAP MEMBER FUNCTION getCodigoPedido RETURN NUMBER, MEMBER FUNCTION total RETURN NUMBER, PRAGMA RESTRICT_REFERENCES (getCodigoPedido, WNDS, WNPS,

RNPS, RNDS), PRAGMA RESTRICT_REFERENCES (total, WNDS, WNPS) )

Tipo Concreto Pedido

Page 29: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

CREATE TYPE Produto AS OBJECT ( codigoProduto NUMBER, preco NUMBER)

Obs: Os repositórios dos tipos Cliente, Pedido e Produto serão criados mais tarde

Tipo Concreto Produto

Page 30: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

Passo 2: RepositóriosPasso 2: RepositóriosPasso 2: RepositóriosPasso 2: Repositórios

Object TablesObject Tables

Page 31: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

• Criando as “Object Tables”

CREATE TABLE Clientes OF Cliente (PRIMARY KEY (codigo))

CREATE TABLE Produtos OF Produto (PRIMARY KEY (codigo))

Page 32: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

CREATE TABLE Pedidos OF Pedido (PRIMARY KEY (codigo), FOREIGN KEY (feito_por) REFERENCES Clientes) NESTED TABLE linhas STORE AS LinhasPedido

ALTER TABLE LinhasPedido ADD (SCOPE FOR (refere_se) IS Produtos)

Page 33: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

Feito_por

Linhas

12

Produtos

Pedidos

Clientes

Linha: o estado de um objeto

- Cada valor da coluna Linhas é uma tabela (“nested table”),dentro da tabela Pedidos- Todos os valores de Linhas são armazenados em uma estrutura única, LinhasPedido, indexada

Page 34: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

LinhasPedido

Índice p/Pedido

Índice p/Linhas

Entrada Y

Entrada X

Pedido X

Linha 3, de X

Linha 1, de X

Linha 4, de X

Linha 2, de X

Produtos

(Integridadede

Escopo)

Page 35: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

Passo 3: Corpos de Passo 3: Corpos de MétodosMétodos

Passo 3: Corpos de Passo 3: Corpos de MétodosMétodos

Page 36: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

Método de Cliente

CREATE OR REPLACE TYPE BODY Cliente AS ORDER MEMBER FUNCTION comparaClientes (x IN Cliente) RETURN INTEGER IS BEGIN RETURN SELF.codigo - x.codigo; END;END;

Page 37: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

CREATE OR REPLACE TYPE BODY Pedido ASMAP MEMBER FUNCTION obtemCodigo RETURN NUMBER IS BEGIN RETURN SELF.codigo; END;MEMBER FUNCTION total RETURN NUMBER IS Total NUMBER := 0; BEGIN SELECT SUM(L.quantidade * L.refere_se.preco) INTO Total FROM TABLE(CAST(SELF.linhas AS ListaDeLinhas)) L; RETURN Total; END;END;

Método de Pedido

Page 38: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

Passo 4: Objetos Passo 4: Objetos Passo 4: Objetos Passo 4: Objetos

Page 39: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

Criando Objetos INSERT INTO Produtos VALUES(1004, 6750.00, 2)

INSERT INTO Clientes VALUES (1, ‘Marcus Sampaio', endereco('2 Aprígio Veloso', ‘Campina Grande', ‘PB', ‘58109-970'), telefones(‘083-555-5555') )

Page 40: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

INSERT INTO Pedidos SELECT 1001, REF(C), SYSDATE, '10-MAIO-2007', ListaDeLinhas() FROM Clientes C WHERE C.codigo = 1

Page 41: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

INSERT INTO TABLE (SELECT P.linhas FROM Pedidos P WHERE P.codigo = 1001) SELECT 01, REF(Prod), 12, 0 FROM Produtos Prod WHERE Prod.codigo = 1004

Page 42: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

INSERT INTO Pedidos SELECT 1001, REF(C), SYSDATE,

'10-MAIO-2007', linhas(linha(1, (Select …), …), linha(…))

FROM Clientes C WHERE C.codigo = 1

Tudo em um único comando:

Page 43: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

Feito_por

Linhas

12

Produtos

Pedidos

Clientes

Page 44: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

Manipulando os Manipulando os ObjetosObjetos

Manipulando os Manipulando os ObjetosObjetos

Page 45: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

Consultando Objetos

Imprimir os números dos pedidos em ordem

SELECT P.codigo FROM Pedidos P ORDER BY VALUE(P)

Page 46: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

Para o pedido 1, os detalhes

SELECT P.feito_por.nome, P.codigo, P.data_pedido, L.num_linha, L.refere_se.codigo, L.quantidade

FROM Pedidos P, TABLE(P.linhas) L WHERE P.codigo = 1001

Note que, essencialmente, SQLOR é como OQL, salvo algumas idiossincrasias da SQLOR

Page 47: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

O valor total dos pedidos de compra

SELECT P.codigo, P.total()FROM Pedidos P

Page 48: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

Pedidos do item 1004

SELECT P.codigo, P.feito_por.codigo, L.*

FROM Pedidos P, TABLE (P.linhas) LWHERE L.refere_se.codigo = 1004

Qual é o problema com esta consulta?

Page 49: III – O Modelo OR Estudo de Caso, modelo Oracle 10g.

Destruindo Objetos

DELETE FROM Pedidos PWHERE P.codigo = 1001


Recommended