35
I I II II – O Modelo OR – O Modelo OR Estudo de Caso, modelo Estudo de Caso, modelo Oracle9i Oracle9i

III – O Modelo OR Estudo de Caso, modelo Oracle9i

Embed Size (px)

Citation preview

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

IIII II – O Modelo OR– O Modelo OREstudo de Caso, modelo Estudo de Caso, modelo

Oracle9iOracle9i

Page 2: III – O Modelo OR Estudo de Caso, modelo Oracle9i

Pedidos de CompraPedidos de CompraEsquema ConceitualEsquema Conceitual

Page 3: III – O Modelo OR Estudo de Caso, modelo Oracle9i
Page 4: III – O Modelo OR Estudo de Caso, modelo Oracle9i

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 Oracle9i

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 Oracle9i

Pedidos de CompraPedidos de CompraEsquema Lógico OracleEsquema Lógico Oracle

Page 7: III – O Modelo OR Estudo de Caso, modelo Oracle9i

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

Page 8: III – O Modelo OR Estudo de Caso, modelo Oracle9i

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

Page 9: III – O Modelo OR Estudo de Caso, modelo Oracle9i

• Resolvendo “deadlock”

– Tipos incompletos

CREATE TYPE StockItem_objtypCREATE TYPE LineItem_objtypCREATE TYPE PurchaseOrder_objtyp

Page 10: III – O Modelo OR Estudo de Caso, modelo Oracle9i

• Definindo ‘estruturas’

– Abstract Types

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

Page 11: III – O Modelo OR Estudo de Caso, modelo Oracle9i

CREATE TYPE Address_objtyp AS

OBJECT ( Street VARCHAR2(200), City VARCHAR2(200), State CHAR(2), Zip VARCHAR2(20) )

Page 12: III – O Modelo OR Estudo de Caso, modelo Oracle9i

Ordenação de Objetos• Métodos de instância

– ORDER– MAP

Page 13: III – O Modelo OR Estudo de Caso, modelo Oracle9i

Controle de Acesso• WNDS

– Write No Database State• WNPS

– Write No Package State• RNDS

– Read No Database State• RNPS

– Read No Package State

Page 14: III – O Modelo OR Estudo de Caso, modelo Oracle9i

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

Page 15: III – O Modelo OR Estudo de Caso, modelo Oracle9i

CREATE TYPE Customer_objtyp AS OBJECT ( CustNo NUMBER, CustName VARCHAR2(200), Address_obj Address_objtyp, PhoneList_var PhoneList_vartyp, ORDER MEMBER FUNCTION compareCustomers(x IN

Customer_objtyp) RETURN INTEGER, PRAGMA RESTRICT_REFERENCES ( compareCustomers,

WNDS, WNPS, RNPS, RNDS) )

Page 16: III – O Modelo OR Estudo de Caso, modelo Oracle9i

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

Page 17: III – O Modelo OR Estudo de Caso, modelo Oracle9i

Mais Transformação (Mapeamento)

• Relationship ODL REFerence Oracle

Page 18: III – O Modelo OR Estudo de Caso, modelo Oracle9i

CREATE TYPE LineItem_objtyp AS OBJECT ( LineItemNo NUMBER, Stock_ref REF StockItem_objtyp, Quantity NUMBER, Discount NUMBER )

CREATE TYPE LineItemList_ntabtyp AS TABLE OF LineItem_objtyp

“Nested Table”

Page 19: III – O Modelo OR Estudo de Caso, modelo Oracle9i

CREATE TYPE PurchaseOrder_objtyp AS OBJECT ( PONo NUMBER, Cust_ref REF Customer_objtyp, OrderDate DATE, ShipDate DATE, LineItemList_ntab LineItemList_ntabtyp, ShipToAddr_obj Address_objtyp, MAP MEMBER FUNCTION getPONo RETURN NUMBER, PRAGMA

RESTRICT_REFERENCES (getPONo, WNDS, WNPS, RNPS, RNDS), MEMBER FUNCTION sumLineItems RETURN NUMBER, PRAGMA

RESTRICT_REFERENCES (sumLineItems, WNDS, WNPS) )

Page 20: III – O Modelo OR Estudo de Caso, modelo Oracle9i

Funcionamento de MAP Objetos de tipo

definido pelousuário

Objetos de umdos tipos primitivos*

Map()

*- INTEGER, NUMBER, DATE, CHAR e VARCHAR

Page 21: III – O Modelo OR Estudo de Caso, modelo Oracle9i

CREATE TYPE StockItem_objtyp AS OBJECT ( StockNo NUMBER, Price NUMBER, TaxRate NUMBER )

Page 22: III – O Modelo OR Estudo de Caso, modelo Oracle9i

• Definindo os Métodos

CREATE OR REPLACE TYPE BODY PurchaseOrder_objtyp ASMAP MEMBER FUNCTION getPONo RETURN NUMBER is BEGIN RETURN PONo; END;MEMBER FUNCTION sumLineItems RETURN NUMBER IS Total NUMBER := 0; BEGIN SELECT SUM(L.Quantity * L.Stock_ref.Price) INTO Total FROM TABLE(CAST(SELF.LineItemList_ntab AS LineItemList_ntabtyp)) L; RETURN Total; END;END;

Page 23: III – O Modelo OR Estudo de Caso, modelo Oracle9i

CREATE OR REPLACE TYPE BODY Customer_objtyp AS ORDER MEMBER FUNCTION compareCustomers (x IN

Customer_objtyp) RETURN INTEGER IS BEGIN RETURN SELF.CustNo - x.CustNo; END;END;

Page 24: III – O Modelo OR Estudo de Caso, modelo Oracle9i

Sobre “Object Tables”• ~1FN

– Endereco é um tipo estruturado– ListaDeTelefones é uma coleção de

elementos simples– LinhasDePedido é uma coleção de

elementos estruturados• SQL precisa ser estendida para lidar

com colunas não-atômicas

Page 25: III – O Modelo OR Estudo de Caso, modelo Oracle9i

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

Page 26: III – O Modelo OR Estudo de Caso, modelo Oracle9i

• Criando as “Object Tables”

CREATE TABLE Customer_objtab OF Customer_objtyp (PRIMARY KEY (CustNo))

CREATE TABLE Stock_objtab OF StockItem_objtyp (PRIMARY KEY (StockNo))

Page 27: III – O Modelo OR Estudo de Caso, modelo Oracle9i

CREATE TABLE PurchaseOrder_objtab OF PurchaseOrder_objtyp (PRIMARY KEY (PONo), FOREIGN KEY (Cust_ref) REFERENCES Customer_objtab) NESTED TABLE LineItemList_ntab STORE AS PoLine_ntab

ALTER TABLE PoLine_ntab ADD (SCOPE FOR (Stock_ref) IS stock_objtab)

Page 28: III – O Modelo OR Estudo de Caso, modelo Oracle9i

• Criando objetos

INSERT INTO Stock_objtab VALUES(1004, 6750.00, 2)

INSERT INTO Customer_objtab VALUES (1, 'Jean Nance', Address_objtyp('2 Avocet Drive', 'Redwood Shores', 'CA', '95054'), PhoneList_vartyp('415-555-1212') )

Page 29: III – O Modelo OR Estudo de Caso, modelo Oracle9i

INSERT INTO PurchaseOrder_objtab SELECT 1001, REF(C),

SYSDATE, '10-MAY-1999', LineItemList_ntabtyp(), NULL

FROM Customer_objtab C WHERE C.CustNo = 1

Page 30: III – O Modelo OR Estudo de Caso, modelo Oracle9i

INSERT INTO TABLE (SELECT P.LineItemList_ntab

FROM PurchaseOrder_objtab P WHERE P.PONo = 1001 )

SELECT 01, REF(S), 12, 0 FROM Stock_objtab S WHERE S.StockNo = 1004

Page 31: III – O Modelo OR Estudo de Caso, modelo Oracle9i

• Consultando objetos

Imprimir os números dos pedidos em ordem

SELECT p.PONo FROM PurchaseOrder_objtab p ORDER BY VALUE(p)

Page 32: III – O Modelo OR Estudo de Caso, modelo Oracle9i

Para o pedido 1, os detalhes

SELECT p.Cust_ref.CustName, p.ShipToAddr_obj, p.PONo,

p.OrderDate, L.LineItemNo, L.Stock_ref.StockNo, L.Quantity

FROM PurchaseOrder_objtab p, TABLE(p.LineItemList_ntab) L

WHERE p.PONo = 1001

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

Page 33: III – O Modelo OR Estudo de Caso, modelo Oracle9i

O valor total dos pedidos de compra

SELECT p.PONo, p.sumLineItems()FROM PurchaseOrder_objtab p

Page 34: III – O Modelo OR Estudo de Caso, modelo Oracle9i

Pedidos do item 1004

SELECT po.PONo, po.Cust_ref.CustNo, L.* FROM PurchaseOrder_objtab po, TABLE

(po.LineItemList_ntab) LWHERE L.Stock_ref.StockNo = 1004

Qual é o problema com esta consulta?

Page 35: III – O Modelo OR Estudo de Caso, modelo Oracle9i

• Destruindo objetos

DELETE FROM PurchaseOrder_objtab pWHERE p.PONo = 1001