iii – o modelo or estudo de caso, modelo oracle9i
TRANSCRIPT
![Page 1: III – O Modelo OR Estudo de Caso, modelo Oracle9i](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/1.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/2.jpg)
Pedidos de CompraPedidos de CompraEsquema ConceitualEsquema Conceitual
![Page 3: III – O Modelo OR Estudo de Caso, modelo Oracle9i](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/3.jpg)
![Page 4: III – O Modelo OR Estudo de Caso, modelo Oracle9i](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/4.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/5.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/6.jpg)
Pedidos de CompraPedidos de CompraEsquema Lógico OracleEsquema Lógico Oracle
![Page 7: III – O Modelo OR Estudo de Caso, modelo Oracle9i](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/7.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/8.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/9.jpg)
• 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](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/10.jpg)
• 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](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/11.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/12.jpg)
Ordenação de Objetos• Métodos de instância
– ORDER– MAP
![Page 13: III – O Modelo OR Estudo de Caso, modelo Oracle9i](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/13.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/14.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/15.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/16.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/17.jpg)
Mais Transformação (Mapeamento)
• Relationship ODL REFerence Oracle
![Page 18: III – O Modelo OR Estudo de Caso, modelo Oracle9i](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/18.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/19.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/20.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/21.jpg)
CREATE TYPE StockItem_objtyp AS OBJECT ( StockNo NUMBER, Price NUMBER, TaxRate NUMBER )
![Page 22: III – O Modelo OR Estudo de Caso, modelo Oracle9i](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/22.jpg)
• 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](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/23.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/24.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/25.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/26.jpg)
• 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](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/27.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/28.jpg)
• 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](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/29.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/30.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/31.jpg)
• 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](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/32.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/33.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/34.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022062502/5706384c1a28abb8238f625b/html5/thumbnails/35.jpg)
• Destruindo objetos
DELETE FROM PurchaseOrder_objtab pWHERE p.PONo = 1001