Post on 22-Apr-2015
Projeto de Sistemas de Informação2003-2 Prof. Schneider
Oracle Object-Relational
Necessidades:
– Projetos de engenharia– Imagens– Bancos de dados científicos– Sistemas de informações geográficas– Multimídia
SGBD Orientado a Objetos
Vantagens:
- Objetos podem encapsular operações além dos dados.
- Objetos são reutilizáveis.- Objetos têm maior significado.
SGBD Orientado a Objetos
Possibilidades no Oracle9i (“Views” ou tipos “nativos”)
Object views
Visões criadas sobre dados relacionais existentes, “convertendo-os” para a modelagem a objetos.
Possibilidades no Oracle9i (“Views” ou tipos “nativos”)
CREATE TABLE EMP ( ID NUMBER (5), NOME VARCHAR2 (20), SALARIO NUMBER (9,2));
CREATE TYPE T_EMP ( ID NUMBER (5), NOME VARCHAR2 (20), SALARIO NUMBER (9,2));
Possibilidades no Oracle9i (“Views” ou tipos “nativos”)
CREATE
VIEW V_EMP OF T_EMP
WITH
OBJECT IDENTIFIER (ID) AS
SELECT
E.ID, E.NOME, E.SALARIO
FROMEMP E
WHERE
E.SALARIO > 2000
Possibilidades no Oracle9i (“Views” ou tipos “nativos”)
Object tables
Armazenamento de dados como Object: cada linha é um objeto.
Possibilidades no Oracle9i (“Views” ou tipos “nativos”)
CREATE TYPE T_PESSOA AS OBJECT ( NOME VARCHAR2 (50), TELEFONE VARCHAR2 (20));
CREATE TABLE TAB_PESSOA OF T_PESSOA;
Possibilidades no Oracle9i
Herança de tipos
– Aumenta a capacidade de reutilização– Hierarquia de tipos com um ancestral comum
genérico– Permite adicionar novos atributos e métodos– Permite alterar a implementação de métodos
Possibilidades no Oracle9i
CREATE TYPE T_PESSOA AS OBJECT (NOME VARCHAR2(50),TELEFONES T_TELEFONES,DATA_NASCIMENTO DATE,...
) NOT FINAL;
CREATE TYPE T_ALUNO UNDER T_PESSOA (DRE NOME VARCHAR2(15),...
);
Possibilidades no Oracle9i
Evolução de tipos (ALTER TYPE)
– Adicionar ou apagar atributos e métodos– Modificar tamanho ou precisão de atributos.– Validações ao alterar
Possibilidades no Oracle9i(Coleções)
Varrays
– Coleção ordenada de elementos: posição de cada elemento tem um índice.
– Máximo número de elementos definido na hora da criação. (pode ser alterado posteriormente)
Possibilidades no Oracle9i(Coleções)
CREATE TYPE T_TELEFONES AS VARRAY(3) OF VARCHAR2(20);
CREATE TYPE T_PESSOA AS OBJECT (NOME VARCHAR2(50),TELEFONES T_TELEFONES,DATA_NASCIMENTO DATE,...
);
Possibilidades no Oracle9i(Coleções)
Nested tables
– Número indefinido de elementos.– Ordem não preservada.
Possibilidades no Oracle9i(Coleções)
CREATE TYPE T_TELEFONES AS TABLE OF T_TELEFONE;
CREATE TYPE T_PESSOA AS OBJECT (NOME VARCHAR2(50),TELEFONES T_TELEFONES,DATA_NASCIMENTO DATE,...
)
NESTED TABLE TELEFONES STORE AS TAB_TELEFONES;
Possibilidades no Oracle9i(JDBC)
• Classes Java correspondendo a classes do Oracle permitem que você trabalhe com muito mais eficiência.
• Classes Java criadas implementando as interfaces oracle.sql.CustomDatum ou oracle.jdbc2.SQLData
Extensão da Linguagem SQLExemplo de aplicação
CREATE TYPE T_ESTADO AS OBJECT (NM_ESTADO CARCHAR2(70),SG_ESTADO VARCHAR2(2)
)
CREATE TYPE T_CIDADE AS OBJECT (NM_CIDADE VARCHAR2(70),REF_ESTADO REF T_ESTADO
)
CREATE TYPE T_BAIRRO AS OBJECT (NM_BAIRRO VARCHAR2(70),REF_CIDADE REF T_CIDADE
)
Extensão da Linguagem SQLExemplo de aplicação
CREATE TABLE ESTADO OF T_ESTADO;
CREATE TABLE CIDADE OF T_CIDADE;
CREATE TABLE BAIRRO OF T_BAIRRO;
Extensão da Linguagem SQLExemplo de aplicação
INSERT INTO ESTADO VALUES (‘Rio de Janeiro’, ‘RJ’)
INSERT INTO CIDADE VALUES (‘Rio de Janeiro’,(SELECT REF(P) FROM ESTADO P WHERE SG_ESTADO = ‘RJ’)
)
INSERT INTO BAIRRO VALUES (‘Vila Isabel’, (SELECT REF(P) FROM CIDADE P WHERE NM_CIDADE = ‘Rio de Janeiro’)
)
Extensão da Linguagem SQLExemplo de aplicação
SELECT NM_ESTADO, SG_ESTADO
FROM ESTADO;
SELECT B.NM_BAIRRO
FROM BAIRRO B
WHERE DEREF(B.REF_CIDADE).NM_CIDADE = ‘Rio de Janeiro’;
Extensão da Linguagem SQLExemplo de aplicação
SELECT DEREF(B.REF_CIDADE).NM_CIDADE, DEREF(DEREF(B.REF_CIDADE).REF_ESTADO).NM_ESTADO
FROM BAIRRO B
WHERE B.NM_BAIRRO = ‘Vila Isabel’;
Eiffel
Persistência
– Possui mecanismos próprios que possibilitam a persistência de objetos Classe Storable Classe Environment EiffelStore
Eiffel
Classe Storable
– Grava o objeto e todos os outros objetos referenciados por ele direta ou indiretamente
– Métodos restore_by_name retrieve_by_namebasic_store retrieved
Eiffel
Classe Environment
– Armazena diversos objetos– Métodos
opencloseset_file(f)store retrieve
Eiffel
Classe Environment
– Métodos (cont.)put (objeto, chave_do_objeto)
– Recuperando um objeto:
objeto ?= env.item(chave_do_objeto)
Eiffel
EiffelStore
– API que permite a persistência de objetos em diversos SGBDs relacionais e OO
ODBC Oracle Sybase Matisse etc.
Eiffel
Sybase
EiffelStore
ODBCOracle
Classe Storable
etc
Eiffel
Conjunto de classes comuns a todos os SGBDs
Classes específicas para cada SGDB
Eiffel
Classe DBControl– Métodos:
connect disconnect commit rollback
Eiffel
Outras classes– DB_SELECTION – DB_CHANGE– DB_STORE– REPOSITORY
Eiffelclass SESSION
feature
db_handle: ORACLE_APPL
session_control: DB_CONTROL
make is
do
!!db_handle.login (...)
db_handle.set_base
!!session_control.make
session_control.connect
-- <consultas, inserções etc>
session_control.commit
session_control.disconnect
rescue
session_control.roll_back
session_control.disconnect
end
-- ...
end -- class SESSION
Eiffel
Exemplo de consulta simples:
selection: DB_SELECTION
tuple: DB_TUPLE
- ...
!!selection.make
io.readline
selection.set_map_name (io.laststring, ”autor")
selection.query ("select * from LIVRO where AUTOR = :autor")
selection.load_result
!!tuple
tuple.copy (selection.cursor)
-- ...
selection.unset_map_name (”autor")
Eiffel
Exemplo de alteração, inclusão e exclusão:
modification: DB_CHANGE
!!modification.make
modification.modify ("update LIVRO %
%set AUTOR = ‘FULANO’ where ISBN = ‘111.222.333’ ”)
modification.modify ("insert into LIVRO %
%values (’BELTRANO’, ‘222.333.111’) ")
modification.modify ("delete from LIVRO where %
%AUTOR = ‘CICRANO’ ")
Eiffel
Mapeamento de objetos em tabelas– Nome do atributo do objeto = nome coluna da tabela– Tipo do atributo do objeto = tipo coluna da tabela
(INTEGER, REAL, DOUBLE, BOOLEAN, CHARACTER, STRING, ABSOLUTE_DATE)
Eiffel
Carregando um objeto
selection: DB_SELECTION
um_aluno: ALUNO
...
!!selection.make
selection.object_convert (um_aluno)
selection.query ("select * from TB_ALUNO")
selection.load_result
selection.cursor_to_object
Eiffel
Armazenando um objeto
storage: DB_STORE
tabela_aluno: DB_REPOSITORY
um_aluno: ALUNO
!!tabela_aluno.make (”TB_ALUNO")
...
tabela_aluno.load
...
!!storage.make
storage.set_repository (tabela_aluno)
...
storage.put (um_aluno)
...
Eiffel
FIM!