iii – o modelo or estudo de caso, modelo oracle 10g
TRANSCRIPT
![Page 1: III – O Modelo OR Estudo de Caso, modelo Oracle 10g](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/1.jpg)
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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/2.jpg)
Pedidos de CompraPedidos de CompraPedidos de CompraPedidos de Compra
Esquema ConceitualEsquema Conceitual
![Page 3: III – O Modelo OR Estudo de Caso, modelo Oracle 10g](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/3.jpg)
![Page 4: III – O Modelo OR Estudo de Caso, modelo Oracle 10g](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/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 Oracle 10g](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/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 Oracle 10g](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/6.jpg)
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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/7.jpg)
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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/8.jpg)
• 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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/9.jpg)
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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/10.jpg)
• Ordenação de objetos
– Métodos de instância• ORDER• MAP
![Page 11: III – O Modelo OR Estudo de Caso, modelo Oracle 10g](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/11.jpg)
• 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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/12.jpg)
• 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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/13.jpg)
• 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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/14.jpg)
– 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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/15.jpg)
– 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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/16.jpg)
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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/17.jpg)
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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/18.jpg)
Mais Transformação (Mapeamento)
• Relationship ODL REFerence Oracle
![Page 19: III – O Modelo OR Estudo de Caso, modelo Oracle 10g](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/19.jpg)
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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/20.jpg)
– 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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/21.jpg)
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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/22.jpg)
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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/23.jpg)
Passo 1: TiposPasso 1: TiposPasso 1: TiposPasso 1: Tipos
![Page 24: III – O Modelo OR Estudo de Caso, modelo Oracle 10g](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/24.jpg)
Tipos Incompletos
CREATE TYPE Cliente
CREATE TYPE Produto
CREATE TYPE Pedido
![Page 25: III – O Modelo OR Estudo de Caso, modelo Oracle 10g](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/25.jpg)
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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/26.jpg)
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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/27.jpg)
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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/28.jpg)
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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/29.jpg)
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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/30.jpg)
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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/31.jpg)
• 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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/32.jpg)
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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/33.jpg)
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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/34.jpg)
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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/35.jpg)
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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/36.jpg)
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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/37.jpg)
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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/38.jpg)
Passo 4: Objetos Passo 4: Objetos Passo 4: Objetos Passo 4: Objetos
![Page 39: III – O Modelo OR Estudo de Caso, modelo Oracle 10g](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/39.jpg)
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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/40.jpg)
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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/41.jpg)
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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/42.jpg)
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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/43.jpg)
Feito_por
Linhas
12
Produtos
Pedidos
Clientes
![Page 44: III – O Modelo OR Estudo de Caso, modelo Oracle 10g](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/44.jpg)
Manipulando os Manipulando os ObjetosObjetos
Manipulando os Manipulando os ObjetosObjetos
![Page 45: III – O Modelo OR Estudo de Caso, modelo Oracle 10g](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/45.jpg)
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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/46.jpg)
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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/47.jpg)
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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/48.jpg)
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](https://reader036.vdocuments.us/reader036/viewer/2022062318/552fc0f8497959413d8b559b/html5/thumbnails/49.jpg)
Destruindo Objetos
DELETE FROM Pedidos PWHERE P.codigo = 1001