III – O Modelo OR
Estudo de Caso, modelo Oracle 10g
Pedidos de Compra
Esquema Conceitual
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
}
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
}
Pedidos de Compra
Esquema Lógico Oracle
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”)
• 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)
Solução Oracle para os
Problemas Apontados
• Resolvendo “deadlock” de tipos
– Tipos incompletos
CREATE TYPE Produto
CREATE TYPE Pedido
• Ordenação de objetos
– Métodos de instância
• ORDER
• MAP
• 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
• 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>)
• 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
– 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) )
– 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) )
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
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
Mais Transformação
(Mapeamento)
• Relationship ODL REFerence
Oracle
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
– 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
Esquema Oracle para o
BD Pedido
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
Passo 1: Tipos
Tipos Incompletos
CREATE TYPE Cliente
CREATE TYPE Produto
CREATE TYPE Pedido
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) )
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) )
Tipos Abstratos para o
Tipo Concreto Pedido
CREATE TYPE Linha AS OBJECT (
num_linha NUMBER,
refere_se REF Produto,
quantidade
NUMBER,
desconto
NUMBER )
CREATE TYPE ListaDeLinhas AS TABLE OF Linha
Tipo Concreto Pedido
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 Produto
CREATE TYPE Produto AS OBJECT (
codigoProduto NUMBER,
preco
NUMBER)
Obs: Os repositórios dos tipos Cliente, Pedido
e Produto serão criados mais tarde
Passo 2: Repositórios
Object Tables
• Criando as “Object Tables”
CREATE TABLE Clientes OF Cliente (PRIMARY KEY
(codigo))
CREATE TABLE Produtos OF Produto (PRIMARY KEY
(codigo))
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)
Clientes
Produtos
Pedidos
Feito
_por
Linha: o estado de um objeto
Linhas
1
2
- 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
LinhasPedido
Índice p/
Pedido
Índice p/
Linhas
Linha 3, de X
Produtos
Entrada X
Entrada Y
Pedido X
Linha 1, de X
Linha 4, de X
Linha 2, de X
(Integridade
de
Escopo)
Passo 3: Corpos de
Métodos
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;
Método de Pedido
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;
END;
Passo 4: Objetos
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', ‘58109970'), telefones(‘083-555-5555') )
INSERT INTO Pedidos
SELECT 1001, REF(C), SYSDATE,
'10-MAIO-2007', ListaDeLinhas()
FROM Clientes C
WHERE C.codigo = 1
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
Tudo em um único comando:
INSERT INTO Pedidos SELECT 1001,
REF(C), SYSDATE,
'10-MAIO-2007', linhas(linha(1, (Select …),
…), linha(…))
FROM Clientes C
WHERE C.codigo = 1
Clientes
Produtos
Pedidos
Feito
_por
Linhas
1
2
Manipulando os Objetos
Consultando Objetos
Imprimir os números dos pedidos
em ordem
SELECT P.codigo
FROM Pedidos P
ORDER BY VALUE(P)
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
O valor total dos pedidos de
compra
SELECT P.codigo, P.total()
FROM Pedidos P
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?
Destruindo Objetos
DELETE
FROM Pedidos P
WHERE P.codigo = 1001
Download

Pedido