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

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

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

Apresentações semelhantes


Apresentação em tema: "III – O Modelo OR Estudo de Caso, modelo Oracle 10g."— Transcrição da apresentação:

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

2 Pedidos de Compra Esquema Conceitual

3

4 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 telefones }

5 Class Pedido : I-Endereco (extent Pedidos key codigo) { attribute integer codigo; attribute date data_pedido; attribute date data_entrega; attribute List linhas; relationship List refere_se; relationship Cliente feito_por; float total() } Class Produto (extent Produtos key codigo) { attribute integer codigo; attribute float preco }

6 Pedidos de Compra Esquema Lógico Oracle

7 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)

8 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)

9 Solução Oracle para os Problemas Apontados Resolvendo deadlock de tipos –Tipos incompletos CREATE TYPE Produto CREATE TYPE Pedido

10 Ordenação de objetos –Métodos de instância ORDER MAP

11 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

12 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... ( )

13 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

14 –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) )

15 –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) )

16 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

17 Sobre Métodos Tipo MAP Objetos de tipo definido pelo usuário Objetos de um dos tipos primitivos* Map() *- INTEGER, NUMBER, DATE, CHAR e VARCHAR

18 Mais Transformação (Mapeamento) Relationship ODL REFerence Oracle

19 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

20 –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

21 Esquema Oracle para o BD Pedido

22 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

23 Passo 1: Tipos

24 Tipos Incompletos CREATE TYPE Cliente CREATE TYPE Produto CREATE TYPE Pedido

25 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) )

26 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) )

27 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

28 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

29 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

30 Passo 2: Repositórios Object Tables

31 Criando as Object Tables CREATE TABLE Clientes OF Cliente (PRIMARY KEY (codigo)) CREATE TABLE Produtos OF Produto (PRIMARY KEY (codigo))

32 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)

33 Feito _por Linhas 1 2 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

34 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 (Integridade de Escopo)

35 Passo 3: Corpos de Métodos

36 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;

37 CREATE OR REPLACE TYPE BODY Pedido AS MAP 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; Método de Pedido

38 Passo 4: Objetos

39 Criando Objetos INSERT INTO Produtos VALUES(1004, , 2) INSERT INTO Clientes VALUES (1, Marcus Sampaio', endereco('2 Aprígio Veloso', Campina Grande', PB', '), telefones( ') )

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

41 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

42 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:

43 Feito _por Linhas 1 2 Produtos Pedidos Clientes

44 Manipulando os Objetos

45 Consultando Objetos Imprimir os números dos pedidos em ordem SELECT P.codigo FROM Pedidos P ORDER BY VALUE(P)

46 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

47 O valor total dos pedidos de compra SELECT P.codigo, P.total() FROM Pedidos P

48 Pedidos do item 1004 SELECT P.codigo, P.feito_por.codigo, L.* FROM Pedidos P, TABLE (P.linhas) L WHERE L.refere_se.codigo = 1004 Qual é o problema com esta consulta?

49 Destruindo Objetos DELETE FROM Pedidos P WHERE P.codigo = 1001


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

Apresentações semelhantes


Anúncios Google