1 / 35

I II – O Modelo OR

I II – O Modelo OR. Estudo de Caso, modelo Oracle9i. Pedidos de Compra. Esquema Conceitual. Interface I-Endereco { attribute struct end {string rua, string cidade, string estado,

olisa
Télécharger la présentation

I II – O Modelo OR

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. III – O Modelo OR Estudo de Caso, modelo Oracle9i

  2. Pedidos de Compra Esquema Conceitual

  3. 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 }

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

  5. Pedidos de Compra Esquema Lógico Oracle

  6. Problemas a Resolver • Uma nova sintaxe • Class ODL  Type Oracle • Extent ODL  Object Table Oracle • Oracle PL/SQL • JSQL? • Algumas coisas mudam • Oracle não oferece os tipos-coleção Array e List • Varray e Nested Table • Oracle não oferece o conceito de Interface, e nem de Estrutura • Abstract (Virtual) Type • Um tipo sem repositório (“default”)

  7. Problemas a Resolver (2) • No mundo da implementação, temos que pensar em situações bem específicas • “Deadlock” de tipos • Tipos inter-dependentes • Corpos dos métodos • Ordenação de objetos • Controle de acesso

  8. Resolvendo “deadlock” • Tipos incompletos CREATE TYPE Produto CREATE TYPE Linha CREATE TYPE Pedido

  9. Definindo ‘estruturas’ • Abstract Types CREATE TYPE Telefones AS VARRAY(10) OF VARCHAR2(20)

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

  11. Ordenação de Objetos • Métodos de instância • ORDER • MAP

  12. Controle de Acesso • WNDS • Write No Database State • WNPS • Write No Package State • RNDS • Read No Database State • RNPS • Read No Package State

  13. Observação Importante • No Oracle, todo tipo é instanciável •  instanciado • Se o tipo for instanciado • Ele o será mais tarde • CREATE TABLE ... OF <type> ... (<integriy constraints>)

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

  15. Restrições ao Uso de Método 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

  16. Mais Transformação (Mapeamento) • Relationship ODL REFerence Oracle

  17. “Nested Table” CREATE TYPE Linha AS OBJECT ( num_linha NUMBER, refere_se REF Produto, quantidade NUMBER, desconto NUMBER ) CREATE TYPE ListaDeLinhas AS TABLE OF Linha

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

  19. Funcionamento de MAP Objetos de tipo definido pelo usuário Objetos de um dos tipos primitivos* Map() *- INTEGER, NUMBER, DATE, CHAR e VARCHAR

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

  21. CREATE OR REPLACE TYPE BODY Pedido AS MAP MEMBER FUNCTION getCodigo 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; • Definindo os Métodos

  22. 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;

  23. Sobre “Object Tables” • ~1FN • Endereco é um tipo estruturado • Telefones é uma coleção de elementos simples • Linhas é uma coleção de elementos estruturados • SQL precisa ser estendida para lidar com colunas não-atômicas

  24. Sobre “Object Tables” (2) • Onde estão os métodos comuns aos objetos de uma “object table”? • Em um outro lugar (depende do SGBD específico) • O mais correto é entender uma “object table” como uma representação tabular ou relacional dos estados (i.e., valores dos atributos) dos objetos de um certo tipo

  25. Criando as “Object Tables” CREATE TABLE Clientes OF Cliente (PRIMARY KEY (codigo)) CREATE TABLE Produtos OF Produto (PRIMARY KEY (codigo))

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

  27. 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') )

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

  29. 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

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

  31. 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

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

  33. 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?

  34. Destruindo objetos DELETE FROM Pedidos P WHERE P.codigo = 1001

More Related